LaTeX2e类和包的设计 (二)
继续说明如何编写class和package。
二、类和包书写命令
1) 文件标识命令
/NeedsTeXFormat{format-name}[release-date]
此命令告诉TeX,本文件由format-name格式的TeX系统进行处理。
release-date用来指定使用格式的版本日期。
/ProvidesClass{class-name}[release-info]
/ProvidesPackage{package-name}[release-info]
表示本文件包含文档类class-name和包package-name的定义。
release-info表示类或包的说明信息。格式如下:
(1)包版本日期yyyy/mm/dd;
(2)说明文字,可包括版本号。
可通过/listfiles命令显示release-info的信息。
/ProvidesFile{file-name}[release-info]
file-name必须为文件全名,包括扩展名;此命令用来声明除主类和包文件以外的文件。
2)文件装入命令
在类或包文件中装入别的包:
/RequirePackage[options-list]{package-name}[release-info]
/RequirePackageWithOptions{package-name}[release-info]
/LoadClass[options-list]{class-name}[release-info]
/LoadClassWithOptions{class-name}[release-info]
每个类文件中最多只能使用一次,且只能在类文件中使用。
3)可选项声明命令
/DeclareOption{option-name}{code}
使option-name变成所在包或类的一个可选项;code参数是当用户使用了该可选项时要执行的代码,可包含任何合法的LaTeX2e结构。
/DeclareOption*{code}
设置“缺省可选项代码”,指当用户使用的可选项在类或包中没有显式声明时,系统执行该命令的code参数。code参数可以包含任何合法的LaTeX2e结构。
4)可选项代码中使用的命令
在code参数中使用的命令:
/CurrentOption
代表用户指定的当前可选项
/OptionNotUsed
将用户指定的当前可选项添加到“未使用可选项”列表。
/PassOptionsToPackage{options-list}{package-name}
将optons-list参数中列出的可选项(不止一个时用逗号隔开)传递给包package-name,即此后的/RequirePackage或/usepackage命令可以使用的可选项中包含了option-list中的可选项。
/PassOptionsToClass{options-list}{class-name}
注:
/RequirePackageWithOptions命令同/RequirePackage命令相似,但前者在装入指定的包时所使用的可选项列表总是同当前类或包打开时所使用的可选项列表完全相同,而不使用明确给出或由/PassOptionsToPackage命令传递来的可选项。
/LoadClassWithOptions的主要目的是允许一个类简单地继承别的类的特性,如命令/LoadClassWithOptions{article}同控制序列:
/DeclareOption*{/PassOptionsToClass{/CurrentOption}{article}}
/ProcessOptions/relax
/LoadClass{article}
的作用相同,但使用/LoadClassWithOptions命令要简单得多,执行也快些。如果类声明了自己的可选项,则两者的区别就大了。如:
(1)
/DeclareOption{landscape}{/@landscapetrue}
/ProcessOptions/relax
/LoadClassWithOptions{article}
(2)
/DeclareOption{landscape}{/@landscapetrue}
/DeclareOption*{/PassOptionsToClass{/CurrentOption}{article}}
/ProcessOptions/relax
/LoadClass{article}
序列(1)很好;序列(2)中article被装入时根本接收不到landscape可选项,因为只有缺省的可选项传递给了article,而landscape是有显示声明的可选项,不在传递之列。
5)代码延迟执行命令
/AtEndOfClass{code}
/AtEndOfPackage{code}
主要用于/DeclareOption或/DeclareOption*命令的参数中间,将code代码暂时内部保存,等到当前类或包处理完毕后再执行code代码。命令可多次使用。
/AtBeginDocument{code}
/AtEndDocument{code}
/AtBeginDocument命令将code代码暂时内部保存,等到LaTeX执行/begin{document}和/end{document}命令时再执行。
/AtEndDocument命令的code参数将在/end{document}命令开始执行、最终页面尚未完成、剩下的可浮动环境还没有处理的时候得到执行。如果code中的某些代码需要在页面和可浮动环境都已经完成排版任务之后才执行,那么这些代码之前必须插入一条/clearpage命令。
/AtBeginDvi{specials}
此命令将specials参数保存在一个注册盒子里并写入.dvi文件中文档首页输出开始处。参数中不能带任何排版内容进入.dvi文件。命令可多次使用。
6)可选项处理命令
/ProcessOptions
将执行每个使用的可选项在声明时设定的处理代码。在类文件和包文件中的执行过程和结果略有不同。
可选项分两种:局部可选项和全局可选项。
局部可选项:指那些在/PassOptionsToPackage{options}命令、/usepackage[options]命令或/RequirePackage[options]命令的options参数中明确指定的可选项。
全局可选项:指用户在/documentclass[options]命令的options参数中指定的,除了局部可选项之外的所有可选项。
(1)在包文件中使用
(2)在类文件中使用
在类文件中使用同在包文件中,只是所有的可选项都当作局部可选项,另外/DeclareOption*的缺省值是/OptionNotUsed而不是出错。
/ProcessOptions*/@options
执行过程同/ProcessOptions,但是可选项的处理顺序不是按照在类或包中的声明顺序进行,而是由命令调用时的options参数指定。
/ExceuteOptions{options-list}
options-list参数的每个可选项,按照顺序依次执行一下/ds@option命令。使用这条命令可在紧靠/ProcessOptions命令前面的地方提供一个“缺省可选项列表”。
7)文件操作命令
/IfFileExists{file-name}{true}{false}
检测一个文件是否存在。存在则执行true参数给出的代码;不存在则执行false参数给出的代码。
/InputIfFileExists{file-name}{true}{false}
如果file-name文件存在,将执行true参数给出的代码并马上装入该文件;如果不存在,则执行false参数给出的代码。
8)报告错误命令
/ClassError{class-name}{error-text}{help-text}
/PackageError{package-name}{error-text}{help-text}
用来产生错误信息,出错时将显示error-text参数给出的错误信息以及?提示符,如果用户敲击h键,系统将显示help-text参数指定的帮助文本。在errror-text和help-text参数中,可以使用/protect命令来终止当前出错命令的进一步展开;可以使用/MessageBreak命令使显示内容换行;使用/space命令输出空格。
如:
/newcommand{/foo}{FOO}
/PackageError{ethel}{%
Your hovercraft is full of eels,/MessageBreak
and /protect/foo/space is /foo
}{%
Oh dear! Someting's gone wrong. /MessageBreak
/space /space Try typing /space <return>
/space to proceed, igoring /protect/foo.
}
将产生如下的输出结果:
!Package ethel Error: Your hovercraft is full of eels,
(ethel) and /foo is FOO.
See the ethel package documentation for explanation.
按下h键,再显示:
Oh dear! something's gone wrong.
Try typing <return> to proceed, ignoring /foo.
/ClassWarning{class-name}{warning-text}
/PackageWarning{package-name}{warning-text}
/ClassWarningNoLine{class-name}{warning-text}
/PackageWarningNoLine{package-name}{warning-text}
在屏幕上显示warning-text参数所给的警告信息:其中,第1、2条将显示警告发生处的行号,而第3、4条命令不显示行号。
/ClassInfo{class-name}{info-text}
/PackageInfo{package-name}{info-text}
将info-text参数所给信息写进log文件(包括行号)。
在warning-text和info-text参数中,可使用/protect命令来终止当前出错命令的进一步展开,可使用/MessageBreak命令使显示内容换行,使用/space命令输出空格。
9)定义牢固命令
牢固命令:指该命令可以作为其它命令的参数使用,而前面无需使用/protect前缀命令。
/DeclareRobustCommand{cmd}[num][default][definition]
/DeclareRobustCommand*{cmd}[num][default][definition]
使用这两个命令既可以定义新命令,也可以重新定义已有的命令。
如:
/DeclareRobustCommand{/seq}[2][n]{%
/ifmmode
#1_{1}/ldots#1_{#2}%
/else
/PackageWarning{fred}{You can't use /protect/seq/space in text}%
/fi
}
/CheckCommand {cmd}[num][default]{definition}
/CheckCommand*{cmd}[num][default]{definition}
检查cmd命令的当前定义是否未definition参数所给出的那样,如果不同,导致出错。
10)其它杂类命令
布局参量
/paperheight
/paperwidth
纸张的实际尺寸,而不象/textwidth和/textheight命令那样只是标注内部主文档区的大小。
大小写字符转换命令
/uppercase{text}
/lowercase{text}
实现字母的大小写转换。不能转换由某些命令(如/ae或/aa)产生的特殊字符。
解决这个问题,用以下命令:
/MakeUppercase{text}
/MakeLowercase{text}