跳转到内容

TeX/def

来自维基教科书,自由的教科书
< TeX

\def <命令> <参数文本>{<替换文本>}

\def 允许您定义新的宏。命令必须以转义字符开头(类别代码 0)并且由一系列字母组成(类别代码 11)或一个非字母字符,紧随转义字符。(例如,\delta\{。)或者,<命令> 可以是活动字符(类别代码 13)。然后,参数文本告诉 TeX 被定义的命令的有效语法;此外,在参数文本中,可以包含参数(用 #1 等表示,最多 #9),这些参数可以在替换文本中重复使用。例如,在

\def \foo [#1]#2{The first argument is ``#1'', the second one is ``#2''}

第一个参数必须用两个方括号分隔,而第二个参数可以是单个字符(严格来说,单个标记具有与 1 或 2 不同的类别代码)或用大括号 {...} 包含的任何平衡文本。最后,替换文本告诉 TeX 命令应该扩展到什么以及如何处理任何参数(参见上面的示例)。

注意,参数文本之后不应该有任何空格。如果您定义的命令跨多行,可以使用 % 字符,例如

\def \foo [#1]#2%
  {The first argument is ``#1''.

  The second one is ``#2''}

与 LaTeX(使用 \newcommand)相反,TeX 不检查要定义的命令是否重要。您可能想说 \def \def 等,但最有可能的是您很快就会遇到一些问题。在这方面保持安全的另一种方法是写入

\ifx <command> \undefined
  \def <command> . . .
\fi

\def 可以用 \global 替换(重新定义不受当前组限制,也受 \globaldefs 控制),\long(该命令接受长参数),\outer(该命令在高速读取的代码部分中不被容许)。

另请参见命令 \let\edef\xdef

这定义了一个简单的快捷方式

\def \NAS {National Academy of Science}
\def \author {William {\sc Smith}}

这定义了一个引用环境

\def \beginquote {\par \begingroup \narrower}
\def \endquote {\par \endgroup}

一个带有 \def 的一个小测试器,它带有一个参数,以及带有两个参数的 \def,可以在没有排版的情况下运行(例如,可以粘贴在 pdflatex shell 中(\end{document} 被省略,因此 shell 在执行粘贴的代码后保持打开状态))

\documentclass{article}
\begin{document}
% one arg def:
\def\testonearg[#1]{\typeout{Testing one arg: '#1'}}
%call:
\testonearg[test this]
% two arg def:
\def\testtwoarg[#1]#2{\typeout{Testing two args: '#1' and '#2'}}
%call:
\testtwoarg[test this first]{this is, the second test.}
% two arg def (B):
\def\testtwoargB#1#2{\typeout{Testing two args B: '#1' and '#2'}}
%call:
\testtwoargB{test this first}{this is, the second test.}

% output:
%*Testing one arg: 'test this'
%*Testing two args: 'test this first' and 'this is, the second test.'
%*Testing two args B: 'test this first' and 'this is, the second test.'
华夏公益教科书