Skip to content

LaTeX 模板开发最佳实践

muzimuzhi edited this page Apr 16, 2019 · 27 revisions

功能边界

模板的主要目的,是为常见文档组件提供一套定制的样式。不要期待模板面面俱到,不常见的文档组件(例如伪代码排版)应由用户通过调用宏包自行实现。可参考 IEEEtran 的做法。

一般

  1. 尽量使用 latex2e 风格的命令,如 counter 相关的、length 相关的、h/vspace 相关的。若非必要,不使用 tex 风格的命令和赋值方式。若非必要,不混用两种风格的命令,如一会儿 \hspace 一会儿 \hskip

  2. 了解空格的各种产生方式,注释源码中的多余空格

  3. 不滥用 \nobreakspace,即 ~

  4. 区分带参数与不带参数的命令,区分改变状态与制造输出的命令。

    • 反例:
    • 在不带参数的命令后,使用(额外的、不起任何作用的)大括号,例如 \songti{}出处
    • 把不带参数的命令,当成带参数的命令来使用,例如 \small{text in small size}出处
  5. 改变状态的命令,其作用范围为插入位置到当前分组结束之前。要防止作用域「溢出」

  6. 不要在模板内重复加载同一个宏包。不要在模板和示例文档中分别加载同一个宏包。

  7. 调整样式尽量通过宏包功能来实现。

    1. 尽可能避免手动重定义基础命令,例如 \chapter\section
    2. 如果觉得需要定义新命令来「抽象」基础命令,例如 \newcommand\myChapter[1]{\chapter{附录:#1}},保持谨慎,寻求帮助。通常都有更好的实现方式。
  8. 如果有大段复制粘贴的代码,建议在这段代码附近附上来源,方便后续维护。

字体

  1. 除非必要,不使用 LaTeX 2.09 风格的字体切换命令,例如 \rm, \bf

  2. 在切换字体之前,推荐使用 \normalfont 把字体恢复到 \rmfamily。类似的命令还有 \normalsize

  3. 谨慎使用 \songti\heiti 等只作用于 CJK 文字的命令,它们不会修改西文字体。推荐使用 \rmfamily, \sffamily 等命令,使西文与中文字体的风格保持一致。

  4. 在了解它们的初始定义之前,不要直接修改 \large, \small 等命令的定义

  5. 修改行距:推荐使用 setspace/zhlineskip 宏包和 \linespread,可以接受修改 \baselinestretch,一定不要直接修改 \baselineskip

  6. \linespread{...}\fontsize{...}{...} 后面一定要跟 \selectfont

  7. 控制示例文档中字体和字号切换命令的使用频次。它们应该隐藏在模板内部,不应该被模板用户(频繁)直接使用。

用户文档

模板应提供用户文档。用户文档的形式自由,推荐包含以下内容

  1. 问题的反馈方式,包括但不限于维护者的联系方式、模板的在线托管地址等。
    建议推荐几个问答社区,方便用户寻求解答。

  2. 模板适用的操作系统和编译方式。

    1. 如果编译时需要使用选项 -shell-escape,应特别说明
    2. 如果提供了操作系统相关的辅助编译工具,如 Makefile,应特别说明
    3. 对写在 tex 文件开头的 magic comment,不同编辑器的支持情况不同,不建议仅通过 magic comment 指定编译方式和选项。建议在用户文档中明确说明。
  3. 模板定义的新命令的用法,模板修改过的既有命令的新用法或新效果

  4. 使用模板应遵循的文件结构,通常包括子文件的默认路径、图片和其他文件的默认路径等
    文件结构可以在用户文档里通过文字说明,也可以在(随模板一起分发的)示例文档里通过实践体现

  5. 如果使用了 CTAN 未收录的功能性宏包,建议提供获取方式,并在文档中特别说明。可选将这类依赖随模板一起分发

  6. 如果使用了操作系统不预装的字体,建议单独说明。如果该字体是免费可获取的,建议列出获取方式,并提示授权使用范围。

Clone this wiki locally