在Latex中自定义命令

详解newcommand的参数和默认值

newcommand有如下的三种使用方式:

1 定义无参数的命令

这是newcommand最简单的使用方式,比如嫌每次输入“helloworld”很麻烦,可以定义命令:

 

\newcommand\prc{helloworld}

以后就可以通过输入命令\prc来输入“helloworld”了。

2 定义有参数的命令

定义有参数命令的通用形式为:

 

\newcommand\cmd[参数个数]{命令的定义}

方括号中定义了命令的参数个数(最多9个),在命令的定义中,可以使用#1引用第一个参数,#2引用第二个参数,以此类推,比如:

 

\newcommand\answer[1]{the answer is #1}

\newcommand\parabola[3]{\ensuremath{y=#1x^2 + #2x + #3}}

3 定义带默认值参数的命令

在定义带参数的命令时,LaTeX也允许其中的一个参数有默认值,即在调用命令时可以不给出这个参数,直接取用该参数的默认值。这个带默认值的参数,在LaTeX中永远使用#1来引用。定义带默认值参数的命令的通用形式为:

 

\newcommand\cmd[参数个数][参数的默认值]{命令的定义}

需要特别注意的是,当调用这个命令时,使用{}形式给出的参数列表要比定义命令时少一个—带默认值的参数不能以{}的形式给出。要么使用参数的默认值,这样就不需要给出#1这个参数;要么使用[]在其他参数前面重新定义默认值

显然,带默认值参数的命令,至少有一个参数。

下面是一个具有一个参数且有默认值的命令:

 

\newcommand\lvec[1][n]{\ensuremath{x_1 + \cdots + x_{#1}}}

\lvec\par%使用参数的默认值n

\lvec[i]%重新定义参数的默认值为i

下面是一个具有2个参数,其中#1为带默认值的参数的命令:

 

\newcommand\lvec[2][n]{\ensuremath{#2_1 + \cdots + #2_{#1}}}

\lvec{x}\par

\lvec[i]{x}

\lvec[2][n]的输出和\lvec[1][n]是一样的,但是显然\lvec[2][n]更灵活一些。

下面使用带默认值的参数重新定义抛物线:

\newcommand\parabola[3][x]{\ensuremath{y=#2{#1}^2 + #3#1 + #4}}

4 注意事项

有编程经验的童鞋很容易写出下面的代码:

 

\newcommand\str1{this is a string}

\newcommand\str2{this is another string}

但是却不小心掉进了TeX的“陷阱”!LaTeX的命令和TeX的命令一样,只允许普通字符(26个字母的大小写形式)作为命令的名称,不允许出现数字、特殊字符等。当然,这不是一个不可逾越的鸿沟。本质上来说,只要catcode=11的字符都可以作为命令的名称,因此只要修改字符的catcode为11,这个字符就可以出现在命令的名称中。LaTeX的内部命令中,\makeatletter命令的实质就是修改字符@的catcode为11,这样@就可以出现在命令名称中了。\makeatother重新修改@的catcode为12,不允许@出现在命令的名字中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章