本章将介绍编写可重复利用的模块——宏包和文档类,并在其中自己定义命令和环境。
8.1 自定义命令和环境
8.1.1 定义新命令
使用如下命令可以定义自己的命令:
ewcommand{<name>}[<num>]{<definition>}
基本上,这个命令由两个参数,第一个<name>是你想要建立的命令的名称(带反斜杠),第二个<definition>是命令的定义。方括号里的参数<num>是可选的,用于指定新命令所需的参数数目(最多9个)。如果缺省可选参数,默认就是0,也就是新建的命令不带任何参数。
一个例子:
ewcommand{ nss}{The not so Short Introduction to LaTeXe} This is '' nss'' ldots{} '' nss''
一个带参数的命令。在命令的定义中,标记#1代表指定的参数。如果想使用多个参数,可以一次使用#2、......、#9等标记。
ewcommand { xsit}[1]{This is the emph{#1} Short Introduction to LaTeXe} %in the document body egin{itemize} item xsit{not so} item xist{very] end{itemize}
LATEX不允许定义一个与现有命令重名的命令。如果需要修改命令定义的话,使用 enewrecommand命令。它使用与命令 ewcommand相同的语法。
在某些情况下,你可能会希望使用providecommand命令。在命令不存在时,它相当于 ewcommand;在命令已经存在时,仍沿用存在的定义。
8.1.2 定义环境
与 ewcommand命令类似,有一个命令用于定义新的环境。这个命令是 ewenvironment,它的语法如下所示:
ewenvironment{<name>}[<num>]{<before>}{<after>}
同样地, ewenvironment命令有一个可选的参数。在<before>中的内容将在此环境包含的文本之前处理,而在<after>中的内容将在遇到end{<name>]命令时处理。
一个例子:
参数<num>的使用方式与 ewcommand命令相同。LATEX还同样保证你不会不小心新建重名的环境。如果你确实希望改变一个现有的环境,你可以使用命令 enewenvironment,它使用和命令 ewenvironment相同的语法。
8.2 编写自己的宏包和文档类
8.2.1 编写简单的宏包
如果定义了很多新的环境和命令,文档的导言区将变得很长,在这种情况下,好的方式是建立一个新的LATEX宏包来存放所有自己定义的命令和环境,然后在你的文档中使用usepackage命令来调用自定义的宏包。
写一个宏包的基本工作就是将原本在你的文档导言区里很长的内容拷贝到另一个文件中去,这个文件需要以.sty作扩展名。你还需要加入一个宏包专用的命令:
宏包的一个最简单示例:
ProvidesPackage{<package name>}
这个命令放在宏包的最前面,并且一定要注意:<package name>需要和宏包的文件名一致。ProvidesPackage让LATEX记录宏包的名称,从而在尝试再次调用同一个宏包的时候忽略后面的引入。
8.2.2 在宏包调用其它宏包
如果你想进一步把各种宏包的功能汇总到一个文件里,而不是在文档的导言区罗列一大堆宏包的话,LATEX允许在自己编写的红包中调用其它宏包,命令为RequirePackage,用法和usepackage一致:
RequirePackage[<option1>, <option2>]{<package name>}
8.2.3 编写自己的文档类
当更进一步,需要编写自己的文档类,如论文模板等,问题就稍稍麻烦了一些。首先,自己的文档类以.cls作扩展名,开头使用ProvidesClass命令:
ProvidesClass{<class name>}
当然了,{<class name>}也需要和文档类的文件名一致。
以上还不能完成一个文档类的编写,因为诸如chapter、section等等许多常用的命令都是在文档类中定义的。事实上,许多时候只需要像调用宏包那样调用一个基本的文档类,省去许多不必要的麻烦。在你的文档类中调用其它文档类的命令是LoadClass,用法和docunmentclass十分相像:
LoadClass[<option1>, <option2>]{<package name>}
8.3 计数器