Latex 可以使用两类命令来定义新命令:
- 一类是 Latex(Lamport Tex)命令,包括 \newcommand、\renewcommand 和 \providecommand,
- 一类是更基本的 Tex 原始(primitive)命令,包括 \def、\gdef、\edef 和 \xdef
1.\newcommand、\renewcommand 和 \providecommand
定义新命令的格式是:
\newcommand{\〈name〉}[〈num〉]{〈definition〉}
。
{\<name>}
中的<name>
是新命令的名字,由大小写字母构成。命令的名字前面要有\
,整体还要用{}
括起来,[<num>]
是可选项,<num>
是 1~9 中的一个整数,表示命令所带参数的个数,省略这一项,就是不带参数。数字必须用方框号[]
括起来。{〈definition〉}
是新命令的定义。形参用#1
、#2
……#9
表示。
在使用命令时,参数用大括号{}
括起来,有几个参数,就用几个大括号。
具体用法如下所示,类似于C语言中的#define进行关键字的替换。
\documentclass{article}
%定义不带参数的命令
\newcommand{\HL}{Hello World}
%定义带一个参数的命令
\newcommand{\WhoLove}[1]{#1 Love Latex!}
%定义两个带参数的命令
\newcommand{\WhoLWhat}[2]{#1 Love #2!}
%定义一个参数的命令,给字体加红色
\newcommand{\addRed}[1]{\textcolor{red}{#1}}
\begin{document}
\HL
\WhoLove{I}
\WhoLWhat{I}{You}
\addRed{The color of the font is red.}
\end{document}
效果如下:
但是这样定义会有一个问题:
但是好像又有了点新的问题,比如
\documentclass{article}
\newcommand{\HL}{Hello}
\begin{document}
\HL world!
\end{document}
编译出来的是:
Hello后面的空格不见了, 原因应该很明显了, 自定义命令后的空格被当成了命令结束的标志从而使得中间的空格丢失。那该怎么解决呢,
xspace
宏包解决了这个问题, 调用宏包\usepackage{xspace}
, 并将上述定义内容改为
\newcommand{\HL}{Hello\xspace}
\documentclass{article}
\usepackage{xspace}
\newcommand{\HL}{Hello\xspace}
\begin{document}
\HL world!
\end{document}
编译的结果如下:
即命令\xspace
可以自动生成一个空格, 除非其后是标点符号。
\renewcommand:如果新定义的命令与已有命令重名,则无法用\newcommand
来定义,这时候可以使用 \renewcommand
,强行定义新命令。它的定义方法与\newcommand
相同。
\providecommand:在命令不存在时,它相当于\newcommand
;在命令已经存在时,仍沿用存在的定义。它的定义方法与\newcommand
相同。
2.\def、\gdef、\edef 和 \xdef
定义新命令的格式是:\def\〈name〉<parameter text>{〈definition〉}
。
\<name>
中的<name>
是新命令的名字,由大小写字母构成。命令的名字前面要有\。与\newcommand
不同,\def
不需要要用{}
括起来,<parameter text>
是可选项, 它非常复杂多变,因此也非常强大,借助它可以得到一些不同寻常的命令。{〈definition〉}
是新命令的定义。形参用#1
、#2
……#9
表示。
举例子如下:
\documentclass{article}
\usepackage{xspace}
% 定义不带参数的命令
\def\HL{Hello\xspace}
% 定义带一个参数的命令
\def\WhoLoveLatex#1{#1 love latex!}
% 定义带两个参数的命令
\def\WhoLoveWho#1#2{#1 love #2!}
\begin{document}
\HL world!
\WhoLoveLatex{I}
\WhoLoveWho{I}{You}
\end{document}
编译结果如下:
\gdef:与 \def 几乎完全相同,唯一的区别是 \gdef 是全局的,不受分组{}
的影响。
\edef:与 \def 几乎完全相同,唯一的区别是 \edef 的定义中如果嵌套了命令,会首先展开命令, 然后再定义新命令。
\xdef:相当于 \gdef 加 \edef,全局的展开定义。