昨天,我给出了一个(错误的)答案这个问题,并想检查一下我对为什么它是错误的理解。
我提供的答案在输出文档中产生了(几乎)正确的结果,但是出于非常错误的原因,我想更深入地了解我的答案实际上在做什么(而不是我认为它在做什么)。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pgfkeys{/a/.code=(a)}
\pgfkeys{/a}
\def\b{\pgfkeys{/a}}
\b
\expandafter\def\c{\pgfkeys{/a}}
\c
\end{document}
似乎产生了正确的输出(a) (a) (a)
(第一个和第二个之间有一个额外的空格(a)
)。但我以前没有\show
看到\a
、\b
和分别\c
是什么,所以实际上没有回答所问的问题。
我以为这\expandafter\def\c{\pgfkeys{/a}}
会扩大该pgfkeys
部分,并将其分配给\c
,然后做原始提问者想要的事情。
从@DavidCarlisle 的评论来看,这仅有的有效是因为\c
已经定义,所以这会将 的扩展\c
(在注释中\T1-cmd
,在我的情况下\OT1-cmd
)重新定义为\pgfkeys{/a}
(未扩展),因此与 相同\b
。 然后使用\c
进行扩展,并产生与 扩展相同的结果\b
(此外,在文档中任何时候都打破了重音符号的使用)。
我对问题所在理解正确吗?如果不正确,那么这实际上意味着什么?做? 附加问题:这里有一些数字\expandafter
可以让它按照我想象的方式实际工作吗?
答案1
\expandafter\def\tmp{abc}
会扩展
\tmp
,因此大多数情况下会出现未定义的命令错误。(在您的示例中,这扩展了重音命令
\c
,避免了错误,但产生了完全不想要的结果,如下所示)如果
\tmp
通过上述定义,\def\tmp{x}
则\def x{abc}
并给出一个错误,说缺少一个命令,因为您无法定义
x
如果
\tmp
通过上述定义,\def\tmp{\y{x}}
则\def\y{x}{abc}
因此它将定义
\y
为x
并排版abc
。如果
\tmp
是通过\def\tmp{\xxa\xxb\xxc}
(你的情况,使用重音机制的内部结构)定义的,那么上面的内容将是\def\xxa\xxb\xxc{abc}
这将定义
\xxa
为一个宏,它必须跟在后面\xxb\xxc
,如果是的话,则扩展为abc
\xxa
因此这会破坏但是的大多数用途\tmp
尚未重新定义,因此\tmp
扩展\xxa\xxb\xxc
为像以前一样,现在扩展为,abc
这就是为什么你的最终结果\c
似乎产生了预期的输出,即使\c
没有被重新定义。
奖励问题的答案是“不”,不行\expandafter
。
如果\def\qqq{x}
你能一步到位地扩张\qqq
,那么
\expandafter\def\expandafter\tmp\expandafter{\qqq}
基本上就是你想要的
\def\tmp{x}
定义也是如此\tmp
。
但是\pgfkeys
它不可扩展,它执行许多任务,因此您无法通过应用来强制最终值\expandafter
。