列表的占位符宏

列表的占位符宏

我看到了一些使用的代码\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重新定义为处理参数或忽略它以结束循环。

相关内容