天天看点

LaTeX2e类和包的设计(三)

版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/1327504

LaTeX2e类和包的设计(三)

1)User-defined commands用户自定义命令

可以在LaTeX下用命令定义新命令或重定义命令。

定义新命令:

/newcommand{/com_name}[narg][opt]{def}

重新定义命令:

/renewcommand{/com_name}[narg][opt]{def}

命令/newcommand用来定义一条新命令;命令/renewcommand用来重定义一条已存在的命令。

narg:指定新命令或重定义的命令带有多少个参数,从1到9取值;

如果调用了不正确的变量,会产生一个错误。

opt:给出了新命令在缺省情况下带有的可选参数。

def:是命令的实际定义。

1.1)Commands without arguments不带参数的命令

我们先来说明/newcommand不带参数的情况。当LaTeX有一个固定的组合或用户命令经常用它自身的名字重复使用时,应用它。

例如:X1,...,Xn的结构,我们可以定义一条命令来表示这种结构。

/newcommand{/xvec}{x_1,/ldots,x_n}

当调用/xvec时,将插入已定义的命令和文本序列来处理。

要注意的是,实际使用是$/xvec$,它需要在数学环境中。故我们可以这样定义它,

/newcommand{/xvec}{$x_1,/ldots,x_n$}

就能在一般场合下使用了。

还可以这样定义,

/newcommand{/xvec}{/ensuremath{x_1,/ldots,x_n}}

它同时允许/xvec和$/xvec$使用,产生同样的结果。

如果想在/xvec使用后输出一个空格,以便跟其它内容分隔开,则命令可以这样定义:

/newcommand{/xvec}{/ensuremath{x_1,/ldots,x_n}/xspace}

xspace包专门用来产生一个空格。

如果不清楚一个命令的名字是否已经存在时,可以用如下的定义:

/providecommand{/com_name}[narg][opt]{def}

它的语法与/newcommand和/renewcommand的语法相同。不同的是,如果命令存在的话,此新定义将会被忽略。

例子:

/newcommand{/thechapter}{/arabic{chapter}}

/newcommand{/thesection}{/thechapter./arabic{section}}

/newcommand{/thesubsection}{/thesection./arabic{subsection}}

1.2)Commands with arguments带参数的命令

在上例中,如果有Y1,...,Yn或者Z1,...,Zn的组合时,又该如何定义命令让它满足呢?我们可以定义/yvec和/zvec,但是这过于麻烦。我们可以考虑用一个参数来实现它。这个参数可以代表字母x,y,z等等。如下:

/newcommand{/avec}[1]{/ensuremath{#1_1,/ldots,#1_n}}

这样,我们想输入X1,...,Xn的结构时可以用/avec{X},想输入y1,...,yn的结构时可以用/avec{y}等等。#1就是那个参数的替代。

如果要输入U1,...,Um的结构时,可以用两个参数,如下:

/newcommand{/anvec}[2]{/ensuremath{#1_1,/ldots,#1_#2}}

同理,三个参数的情况:

/newcommand{/subvec}[3]{/ensuremath{#1_#2,/ldots,#1_#3}}

则我们通过调用/subvec{a}{i}{j}可以产生ai,...,aj。

注:当超过一个参数时,参数必须被封装在{}内。

1.3)Commands with an optional argument带一个可选参数的命令

正如我们所见,许多LaTeX命令带有一个可选参数,包括/newcommand命令。如下:

/renewcommand{/subvec}[3][x]{/ensuremath{#1_{#2},/ldots,#1_{#3}}}

即,它默认第一个参数为x,当你输入/subvec{i}{j}将打印xi,...,xj;当你输入/subvec{a}{i}{j}时,将打印ai,...,aj。

1.4)附加的一些例子

example 1:

/newcommand{/latop}[2]{{#1} /atop {#2}}

/newcommand{/lchoose}[2]{{#1} /choose {#2}}

example 2:

/newlength{/wdth}

/newcommand{/defbox}[1]{/settowidth{/wdth}{#1}}

/newcommand{/textbox}[1]{/framebox[/wdth]{#1}}

example 3:

/newcounter{myfn}[page]

/renewcommand{/thefootnote}{/fnsymbol{footnote}}

/newcommand{/myftnote}[1]{/setcounter{footnote}{/value{myfn}}%

 /footnote{#1}/stepcounter{myfn}}

example 4:

建立命令/alpheqn,一旦它被调用,等式序列将保持同样的数,但是它紧跟的字母a,b将不断增加,且用-符号隔开。命令/reseteqn保存初始的数字。因此产生的序列可以为4,5,6-a,6-b,7。

/newcounter{saveeqn}

/newcommand{/alpheqn}{/setcounter{saveeqn}{/value{equation}}%

 /stepcounter{saveeqn}/setcounter{equation}{0}%

 /renewcommand{/theequation}%

  {/mbox{/arabix{saveeqn}-/alph{equation}}}}

/newcommand{/reseteqn}{/setcounter{equation}{/value{saveeqn}}%

 /renewcommand{/theequation}{/arabic{equation}}}

1.5)Conditional text带条件的文本

我们引入ifthen宏包,如下:

/usepackage{ifthen}

它带有两条命令,如下:

/ifthenelse{test}{then_text}{else_text}

测试test,如果为真,执行then_text语句;如果为假,执行else_text。

/whiledo{test}{do_text}

测试test,为真则执行do_text语句,为假则不执行。

/newcommand{/three}{3}

/ifthenelse{/three =3}{OK}{what?}

/ifthenelse{/value{page} <100}{Page xx}{Page xxx}

2)User-defined environments用户自定义环境

可以用命令来创建或改变环境

/newenvirenment{env-name}[narg][opt]{beg_def}{end_def}

/renewenvirenment{env-name}[narg][opt]{beg_def}{end_def}

env-name: 环境的名称,在/newenvirenment中,它不同于任何已存在的环境名或命令名;而在/renewenvirenment;它必须是已经存在的环境名。

narg:从1到9的一个数,用于声明环境带有多少个参数;如果省略的话,默认为0个参数。

opt:默认为第一个可选项的名字。

beg_def:当/begin{env-name}开始时要调用的插入内容;如果带参数,则环境开始时,调入/begin{env-name}{arg_1}...{arg_n}

end_def:环境结束时的插入内容。

4)Envirenments without arguments

正如用户自定义命令一样,我们先来解释不带参数的环境。用以下命令创建:

/newenvirenment{sitquote}{/begin{quote}/small/itshape}{/end{quote}}

它设置了文本在/begin{sitquote}和/end{sitquote}之间以规定的/small/itshape形式显示。

注意:/small/itshape会在整个环境中持续生效。

看下面的例子:

/newcounter{com}

/newenvironment{comment}

{/noindent/slshape Comment: /begin{quote}/small/itshape}

{/stepcounter{com}/hfill(/arabic{com})/end{quote}}

继续阅读