\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”变成了什么?它输了吗?
\LaTeX
pdf 输出正常为“一、二、三”。那么,发生了什么#2
?
答案1
#1
是分隔参数由所有标记组成,直到指定分隔符为止\separator
。 LaTeX 实际上不支持此类参数的定义(因此使用\def
而不是 )\newcommand
。
#2
是一个普通的非分隔参数。因此,这需要一个标记或{}
组。在跟踪的情况下,它只会得到,T
就像您去\fbox abc
的参数\fbox
只是一样a
。
#2
仅用于测试,如果您没有在最后,它将被放回这里:
\expandafter\separator\expandafter#2%
所以当它\separator
被展开时它会看到
Two\separator three
在输入流中T
,已经放回,因此采用Two
和#1
,t
并且#2
循环继续。