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(该命令在高速读取的代码部分中不被容许)。
这定义了一个简单的快捷方式
\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.'