1. 自定义命令和环境
1.1 定义新命令
使用如下命令可以定义你自己的命令:
\newcommand{\⟨name⟩}[⟨num⟩]{⟨definition⟩}
\newcommand
的基本用法需要两个必选参数,第一个参数 ⟨name⟩
是要定义的命令名称(带反斜线),第二个参数 ⟨definition⟩
是命令的具体定义. 方括号里的参数 ⟨num⟩
是可选的,用于指定新命令所需的参数数目(最多 9 个). 如果缺省可选参数,默认就是 0,也就是新定义的命令不带任何参数.
【例 1】
\newcommand{\tnss}{The not
so Short Introduction to
\LaTeXe}
This is ``\tnss'' \ldots{}
``\tnss''
【例 2】
\newcommand{\txsit}[1]
{This is the \emph{#1} Short
Introduction to \LaTeXe}
% in the document body:
\begin{itemize}
\item \txsit{not so}
\item \txsit{very}
\end{itemize}
LaTeX
\LaTeX
LATEX 不允许使用 \newcommand
定义一个与现有命令重名的命令,如果需要修改命令定义的话,使用 \renewcommand
命令,它使用与命令 \newcommand
相同的语法.
1.2 定义环境
与 \newcommand
命令类似,有一个命令用于定义新的环境,这个命令是 \newenvironment
,它的语法如下所示:
\newenvironment{⟨name⟩}[⟨num⟩]{⟨before⟩}{⟨after⟩}
同样地,\newenvironment
命令有一个可选的参数,在 ⟨before⟩
中的内容将在此环境包含的文本之前处理,而在 ⟨after⟩
中的内容将在遇到 \end{⟨name⟩}
命令时处理.
下面的例子演示了 \newenvironment
命令的用法:
\newenvironment{king}
{\rule{1ex}{1ex}%
\hspace{\stretch{1}}}
{\hspace{\stretch{1}}%
\rule{1ex}{1ex}}
\begin{king}
My humble subjects \ldots
\end{king}
参数 ⟨num⟩
的使用方式与 \newcommand
命令相同.
LaTeX
\LaTeX
LATEX 还同样保证你不会不小心新建重名的环境,如果你确实希望改变一个现有的环境,你可以使用命令\renewenvironment
,它使用和命令 \newenvironment
相同的语法.
2. 编写自己的宏包和文档类
2.1 编写简单的宏包
如果你定义了很多新的环境和命令,你的文档的导言区将变得相当长,在这种情况下,好的方式是建立一个新的
LaTeX
\LaTeX
LATEX 宏包来存放所有你自己定义的命令和环境,然后在你的文档中使用 \usepackage
命令来调用自定义的宏包.
% Demo Package by Tobias Oetiker
\ProvidesPackage{demopack}
\newcommand{\tnss}{The not so Short Introduction
to \LaTeXe}
\newcommand{\txsit}[1]{The \emph{#1} Short
Introduction to \LaTeXe}
\newenvironment{king}{\begin{quote}}{\end{quote}}
写一个宏包的基本工作就是将原本在你的文档导言区里很长的内容拷贝到另一个文件中去,这个文件需要以 .sty 作扩展名。你还需要加入一个宏包专用的命令:
\ProvidesPackage{⟨package name⟩}
这个命令应该放在你的宏包的最前面,并且一定要注意:⟨package name⟩
需要和宏包的文件名一致. \ProvidesPackage
让
LaTeX
\LaTeX
LATEX 记录宏包的名称,从而在 \usepackage
命令再次调用同一个宏包的时候忽略之.
2.2 在宏包中调用其它宏包
如果你想进一步把各种宏包的功能汇总到一个文件里,而不是在文档的导言区罗列一大堆宏包的话,
LaTeX
\LaTeX
LATEX 允许你在自己编写的宏包中调用其它宏包,命令为 ·,用法和 \usepackage
一致:
\RequirePackage[⟨options⟩]{⟨package name⟩}
2.3 编写自己的文档类
当你更进一步,需要编写自己的文档类,如论文模板等,问题就稍稍麻烦了一些. 首先,自己的文档类以 .cls 作扩展名,开头使用 \ProvidesClass
命令:
\ProvidesClass{⟨class name⟩}
当然了,{⟨class name⟩}
也需要和文档类的文件名一致.
但是有了上述命令和和你之前学到的 \newcommand
等,还并不能完成一个文档类的编写,因为诸如 \chapter
、\section
等等许多常用的命令都是在文档类中定义的. 事实上,许多时候我们只需要像调用宏包那样调用一个基本的文档类,省去许多不必要的麻烦. 在你的文档类中调用其它文档类的命令是 \LoadClass
,用法和 \documentclass
十分相像:
\LoadClass[⟨options⟩]{⟨package name⟩}
3. 计数器
我们早就见识到了 LaTeX \LaTeX LATEX 对文档元素自动计数的能力:章节符号、列表、图表⋯⋯它们都是依靠 LaTeX \LaTeX LATEX 提供的计数器功能完成的.
3.1 定义和修改计数器
定义一个计数器的方法为:
\newcounter{⟨counter name⟩}[⟨parent counter name⟩]
⟨counter name⟩
为计数器的名称. 计数器可以有上下级的关系,可选参数 ⟨parent counter name⟩
定义为 ⟨counter name⟩
的上级计数器.
以下命令修改计数器的数值,\setcounter
将数值设为 ⟨number⟩
;\addtocounter
将数值加上 ⟨number⟩
;\stepcounter
将数值加一,并将所有下级计数器归零.
\setcounter{⟨counter name⟩}{⟨number⟩}
\addtocounter{⟨counter name⟩}{⟨number⟩}
\stepcounter{⟨counter name⟩}
3.2 计数器的输出格式
计数器 ⟨counter⟩
的输出格式由 \the⟨counter⟩
表示,如 \thechapter
等,这个值默认以阿拉伯数字形式输出,如果想改成其它形式,需要重定义 \the⟨counter⟩
,如将 equation
计数器的格式定义为大写字母:
\renewcommand\theequation{\Alph{equation}}
命令 \Alph
控制计数器 ⟨counter⟩
的值以大写字母形式显示. 下表列出所有可用于修改计数器格式的命令,注意:这些命令只能用于计数器,不能直接用于数字,如 \roman{1}
这样的命令会出错.
计数器的输出格式还可以利用其它字符,甚至其它计数器的输出格式与之组合. 如标准文档类里对 \subsection
相关的计数器的输出格式的定义相当于:
\renewcommand\thesubsection{\thesection.\arabic{subsection}}
这里没有中文数字,需要导入 zhnumber
宏包 ,在 ctex 系列的文档类中已经包含这个功能,可以直接使用命令:
\zhnumber {⟨number⟩} % 以中文格式输出数字
\zhnum {⟨counter⟩} % 用于将 LaTeX 计数器的值转换为中文数字
3.3 LaTeX 中的计数器
- 所有章节命令
\chapter
、\section
等分别对应计数器chapter
、section
等等,而且有上下级的关系. 而计数器part
是独立的 - 有序列表
enumerate
的各级计数器为enumi
,enumii
,enumiii
,enumiv
,也有上下级的关系 - 图表浮动体的计数器就是
table
和figure
;公式的计数器为equation
. 这些计数器在article
文档类中是独立的,而在report
和book
中以chapter
为上级计数器 - 页码、脚注的计数器分别是
page
和footnote
我们可以利用前面介绍过的命令,修改计数器的样式以达到想要的效果,比如把页码修改成大写罗马数字,左右加横线,或是给脚注加上方括号:
\renewcommand\thepage{--~\Roman{page}~--}
\renewcommand\thefootnote{[\arabic{footnote}]}
我们之前见过的命令 \pagenumbering
,它的内部机制是修改 page
计数器的格式 \thepage
,并将计数器的值重置为
1
1
1.
最后介绍两个有用的计数器:
3.3.1 secnumdepth
LaTeX \LaTeX LATEX 标准文档类对章节划分了层级:
- 在
article
文档类里part
为 0 0 0,section
为 1 1 1,依此类推 - 在
report
/book
文档类里part
为 − 1 -1 −1,chapter
为 0 0 0,section
为1
,等等
secnumdepth
计数器控制章节编号的深度,如果章节的层级大于 secnumdepth
,那么章节的标题、在目录和页眉页脚的标题都不编号(照常生成目录和页眉页脚),章节计数器也不计数.
可以用 \setcounter
命令设置 secnumdepth
为较大的数使得层级比较深的章节也编号,如设置为
4
4
4 令 \paragraph
也编号;或者设置一个较小的数以取消编号,如设置为
−
1
-1
−1 令\chapter
不编号. 后者是生成不编号的章节的一个妙招,免去了手动使用 \addcontentsline
和 \markboth
的麻烦.
secnumdepth
计数器在 article
文档类里默认为
3
3
3(subsubsection
一级);在 report
和 book
文档类里默认为
2
2
2(subsection
一级)
3.3.2 tocdepth
tocdepth
计数器控制目录的深度,如果章节的层级大于 tocdepth
,那么章节将不会自动写入目录项. 默认值同 secnumdepth
.
4. LaTeX 可定制的一些命令和参数
LaTeX \LaTeX LATEX 事实上有相当一些可以定制的命令和参数,不过对于修改样式或者开发宏包来说,这些定制项还远远不够.
对于用户来讲,容易定制的是这一些项目:
-
标题名称/前后缀等. 下表列出了标准文档类里可定制的项目,表中所有的 LaTeX \LaTeX LATEX 命令都可以用
\renewcommand
来修改: -
长度. 前文在叙述各种排版元素时已经介绍过一些,现归纳于下表. 表中所有的长度命令可用
\setlength
来修改.