跳至内容
Topos Uranos

摘要

本课讲授如何定义自己的命令和环境,并把它们汇集到一个可以重复使用的导言区中。本课说明为什么应当为文本的功能命名,而不是重复它们的外观;介绍带必选参数和带有默认值的可选参数的 \newcommand、\renewcommand 和 \providecommand,以及名称已经存在时出现的错误;简要展示 LaTeX 内核所包含的现代接口 \NewDocumentCommand;分析无参数命令之后丢失的空格;用 \newenvironment 定义环境及其开始代码和结束代码;最后讲授如何把导言区移入单独的文件,无论是用 \input 读入的文件还是 .sty 宏包,同时注意宏包的加载顺序和整体的简洁。

学习目标

  1. 以命令所命名的功能,而不是以节省输入,来论证定义自己的命令的理由。
  2. 定义带必选参数和带一个可选参数的命令,并预测每种用法的结果。
  3. 区分 \newcommand、\renewcommand 和 \providecommand,并解释已被占用的名称所引起的错误。
  4. 预见并避免无参数命令之后空格的丢失。
  5. 定义带参数的环境,并辨认定义的哪一部分可以使用这些参数。
  6. 把自己的导言区组织到单独的文件或宏包中,判断哪种方式合适,并安排宏包的加载顺序。

为什么要定义自己的命令

在讲有意义的格式的一课中,我们看到了核心思想:每个格式标记都应当对应文本的某种功能;自己的命令为这种功能命名,而它的定义只在导言区写一次,决定它的外观。本课详细研究这一机制。不过先要弄清楚能得到什么,因为什么时候值得定义一条命令、什么时候不值得,正取决于此。

能得到三样东西。第一是意义:\gainian{存在者} 说明这个词是什么,而 \textbf{存在者} 只说明它看起来如何;源文件读起来像一篇加了标注的文本,而不是一串排版指令。第二是一致性:如果向量总是用 \vect 书写,就不会因为疏忽而有的排成粗体、有的带箭头。第三是约定只需在一处修改:如果答辩委员会、期刊或导师要求另一种记号,只要改动导言区的一行,改动就会贯穿整个文档。由此得出判断标准:完成一种可辨认的功能并且反复出现的东西,值得一条自己的命令;只出现一次的个别调整,就地书写即可,不值得定义命令。