分隔符 \def 及其扩展

分隔符 \def 及其扩展

\separator我试图理解中命名的宏是如何工作的MWE

\documentclass[]{article}

\def\separator#1\separator#2{%
\unexpanded{#1}%
\ifx*#2%
\else
, \expandafter\separator\expandafter#2%
\fi
}%



    \def\stcs{\separator One\separator Two\separator three}

    \tracingmacros 1
    \begin{document}

    \stcs\separator*

    \end{document}

踪迹\separator如下:

\stcs ->\separator One\separator Two\separator three

\separator #1\separator #2->\unexpanded {#1}\ifx *#2\else , \expandafter \separator \expandafter #2\fi 
#1<-One
#2<-T

\separator #1\separator #2->\unexpanded {#1}\ifx *#2\else , \expandafter \separator \expandafter #2\fi 
#1<-Two
#2<-t

\separator #1\separator #2->\unexpanded {#1}\ifx *#2\else , \expandafter \separator \expandafter #2\fi 
#1<-three
#2<-*

我看到了什么。

第一阶段:


第一:\separator得到的结果#1是“One” - 这对我来说很正常。第二:\separator得到的结果#2是“T”,而不是“Two”。为什么?

第二阶段:


第一:\separator得到一个#1“Two”。为什么不是“T”,正如从第一阶段可以看出的那样?这个“T”变成了什么?它输了吗?

\LaTeXpdf 输出正常为“一、二、三”。那么,发生了什么#2

答案1

#1分隔参数由所有标记组成,直到指定分隔符为止\separator。 LaTeX 实际上不支持此类参数的定义(因此使用\def而不是 )\newcommand

#2是一个普通的非分隔参数。因此,这需要一个标记或{}组。在跟踪的情况下,它只会得到,T就像您去\fbox abc 的参数\fbox只是一样a

#2仅用于测试,如果您没有在最后,它将被放回这里:

\expandafter\separator\expandafter#2%

所以当它\separator被展开时它会看到

Two\separator three

在输入流中T,已经放回,因此采用Two#1t并且#2循环继续。

相关内容