edef、def 和 expandafter 中的混淆

edef、def 和 expandafter 中的混淆

昨天,我给出了一个(错误的)答案这个问题,并想检查一下我对为什么它是错误的理解。

我提供的答案在输出文档中产生了(几乎)正确的结果,但是出于非常错误的原因,我想更深入地了解我的答案实际上在做什么(而不是我认为它在做什么)。

\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}

    因此它将定义\yx并排版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

相关内容