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\LaTeXLATEX 不允许使用 \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\LaTeXLATEX 还同样保证你不会不小心新建重名的环境,如果你确实希望改变一个现有的环境,你可以使用命令\renewenvironment,它使用和命令 \newenvironment 相同的语法.
2. 编写自己的宏包和文档类
2.1 编写简单的宏包
如果你定义了很多新的环境和命令,你的文档的导言区将变得相当长,在这种情况下,好的方式是建立一个新的 LaTeX\LaTeXLATEX 宏包来存放所有你自己定义的命令和环境,然后在你的文档中使用 \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\LaTeXLATEX 记录宏包的名称,从而在 \usepackage 命令再次调用同一个宏包的时候忽略之.
2.2 在宏包中调用其它宏包
如果你想进一步把各种宏包的功能汇总到一个文件里,而不是在文档的导言区罗列一大堆宏包的话,LaTeX\LaTeXLATEX 允许你在自己编写的宏包中调用其它宏包,命令为 ·,用法和 \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\LaTeXLATEX 对文档元素自动计数的能力:章节符号、列表、图表⋯⋯它们都是依靠 LaTeX\LaTeXLATEX 提供的计数器功能完成的.
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,并将计数器的值重置为 111.
最后介绍两个有用的计数器:
3.3.1 secnumdepth
LaTeX\LaTeXLATEX 标准文档类对章节划分了层级:
- 在
article文档类里part为 000,section为 111,依此类推 - 在
report/book文档类里part为 −1-1−1,chapter为 000,section为1,等等
secnumdepth 计数器控制章节编号的深度,如果章节的层级大于 secnumdepth,那么章节的标题、在目录和页眉页脚的标题都不编号(照常生成目录和页眉页脚),章节计数器也不计数.
可以用 \setcounter 命令设置 secnumdepth 为较大的数使得层级比较深的章节也编号,如设置为 444 令 \paragraph 也编号;或者设置一个较小的数以取消编号,如设置为 −1-1−1 令\chapter 不编号. 后者是生成不编号的章节的一个妙招,免去了手动使用 \addcontentsline 和 \markboth的麻烦.
secnumdepth 计数器在 article 文档类里默认为 333(subsubsection 一级);在 report 和 book文档类里默认为 222(subsection 一级)
3.3.2 tocdepth
tocdepth 计数器控制目录的深度,如果章节的层级大于 tocdepth,那么章节将不会自动写入目录项. 默认值同 secnumdepth.
4. LaTeX 可定制的一些命令和参数
LaTeX\LaTeXLATEX 事实上有相当一些可以定制的命令和参数,不过对于修改样式或者开发宏包来说,这些定制项还远远不够.
对于用户来讲,容易定制的是这一些项目:
-
标题名称/前后缀等. 下表列出了标准文档类里可定制的项目,表中所有的 LaTeX\LaTeXLATEX 命令都可以用
\renewcommand来修改:
-
长度. 前文在叙述各种排版元素时已经介绍过一些,现归纳于下表. 表中所有的长度命令可用
\setlength来修改.
本文介绍了如何在LaTeX中自定义命令和环境,包括新命令的创建、环境的定义,以及如何编写宏包和文档类,以及如何利用计数器和可定制命令来增强文档的灵活性。

被折叠的 条评论
为什么被折叠?



