我看到了一些使用的代码\do
,我想理解它,对我来说这意味着找出它到底是\do
干什么的。然而,我在任何参考手册中都找不到它,而且很明显,它无法在 Google 上找到。我怀疑它是基本 TeX 的一部分,但我不确定。
它有什么\do
用处?什么时候用它?在 TeX 或 LaTeX 文档中哪里可以找到它?
答案1
\do
是的缩写\performsomeactiononanargument
,通常根据action
需要执行的操作重新定义。
例如,考虑verbatim
环境(或)。我们\verb
知道verbatim
环境允许您使用某些字符,这些字符在使用或应用上受到限制,例如,,,,,,...$
因此,为了设置环境以将这些字符视为\
~
&
%
人物\@verbatim
而不是他们前面提到的特殊行为,latex.ltx
)
\let\do\@makeother \dospecials
在哪里
\def\@makeother#1{\catcode`#112\relax}
\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
\do\#\do\^\do\_\do\%\do\~}
因此,\dospecials
执行一系列类别代码更改(\do
)。这只是一种简写符号,根据 的定义而有所不同\do
。它也用于其他上下文中以获得类似的结果。
etoolbox
在处理项目列表时采用此用法/符号来表示“对参数执行某些操作”。例如,当调用
\docsvlist{first,second,third,last}
\do
依次应用于每个元素,如、 和\do{first}
。\do{second}
这允许用户(重新)定义 的确切含义。以下是示例:\do{third}
\do{last}
\do
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\begin{enumerate}
\renewcommand{\do}{\item}
\docsvlist{first,second,third,last}
\end{enumerate}
\noindent
\begingroup
\renewcommand{\do}[1]{\textbullet~#1 \quad}
\docsvlist{first,second,third,last}
\endgroup
\end{document}
在非常有限的上下文中,\do
有时用于界定宏参数。但在这种情况下,它具有字面意义,即使可以使用完全不同的分隔符。一个例子是用于(循环)构造中\@whilenum
或作为\@for
(循环)构造的一部分。
答案2
这取决于定义
后
\def\do{hello}
然后\do
将扩大到hello
....
在核心乳胶格式中它有两个不相关的用途。
它以源自纯 TeX 的风格用于“可执行列表”,并在 TeXBook 中进行了描述。
例如verbatim
内部使用通过以下方式定义的列表
\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
\do\#\do\^\do\_\do\%\do\~}
如果\dospecials
列表定义为
\def\dospecials{,\ ,\\,\{,\},\$,\&%
,\#,\^,\_,\%,\~}
或者
\def\dospecials{\ \\\{\}\$\&%
\#\^\_\%\~}
您需要一些循环宏来迭代列表,但是通过使用命令分隔符,您需要做的就是\do
在本地定义,然后执行列表,这样逐字执行
\let\do\@makeother
\dospecials
并\@makeother
应用于每一个标记。
另一种用途是作为分隔参数。如果你有需要一个循环宏,你可以使用以下形式
\@tfor\tmp:=\dospecials\do{\expandafter\@makeother\tmp}
对于没有逗号的形式,或
\@for\tmp:=\dospecials\do{\expandafter\@makeother\tmp}
为带逗号的形式。
这里:=
并\do
没有真正定义做任何事情,它们只是用来分隔参数的标记,\@for
其定义是通过
\long\def\@for#1:=#2\do#3{%
....
因此列表变量 ( #1
) 是直到 的所有内容:=
,而列表 ( #2
)(扩展后)是:=
和之间的所有内容\do
,列表主体 ( #3
) 是 之后的下一个标记或括号组\do
。
答案3
列表的占位符宏
\do
通常用作列表中的“占位符”宏。示例是\dospecials
,它在 LaTeX 内核中定义:
\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
\do\#\do\^\do\_\do\%\do\~}
这里接受一个参数,一个字母宏。但\do
此时的含义并不重要。然后,在环境启动时verbatim
,可以在代码中看到以下内容:
\let\do\@makeother \dospecials
变成\do
了一个含义:将参数的类别代码更改为类别(用于逐字读取内容的类别)。然后以这样other
的含义执行列表。\do
\@makeother
LaTeX 内核的其他示例包括:
\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-}
和用法:\def\@noligs{\let\do\do@noligs \verbatim@nolig@list}
前导命令存储在这样的列表中,并在 时停用
\begin{document}
。
主体宏 for 循环
另一种用法是在循环中:,,,,,\@whilenum
。宏后面跟着一些条件,循环体可作为的参数:\@whiledim
\@whilesw
\@for
\@tfor
\@while...
\do
\@whilenum\value{section}<10 \do{Something, \stepcounter{section}}
根据条件宏的评估\do
重新定义为处理参数或忽略它以结束循环。