为什么 \NewDocumentCommand{⟨cmd⟩}{⟨arg spec⟩}{⟨code⟩} 的 ⟨code⟩ 没有显示在终端中?

为什么 \NewDocumentCommand{⟨cmd⟩}{⟨arg spec⟩}{⟨code⟩} 的 ⟨code⟩ 没有显示在终端中?

考虑以下 MCE:

\documentclass{article}
\newcommand{\mynewcommand}{foo}
\NewDocumentCommand{\MyNewDocumentCommand}{}{bar}
\ExplSyntaxOn
\iow_term:x {mynewcommand=\mynewcommand}
\iow_term:x {MyNewDocumentCommand=\MyNewDocumentCommand}
\ExplSyntaxOff
\begin{document}
\begin{itemize}
\item \verb|\mynewcommand|=\mynewcommand
\item \verb|\MyNewDocumentCommand|=\MyNewDocumentCommand
\end{itemize}
\end{document}

编译后显示的内容:

  • 在生成的 PDF 中预期为:

      • \mynewcommand=foo
      • \MyNewDocumentCommand=bar
    
  • 在终端中预期会出现\mynewcommand但意外会出现的情况是\MyNewDocumentCommand

      mynewcommand=foo
      MyNewDocumentCommand=\MyNewDocumentCommand
    

为什么在终端中不显示 ,⟨code⟩而显示?\NewDocumentCommand{⟨cmd⟩}{⟨arg spec⟩}{⟨code⟩}⟨code⟩\newcommand{⟨cmd⟩}[⟨num⟩][⟨default⟩]{⟨code⟩}

答案1

如果你使用\newcommand\macro那么\macro使用 TeX 基元 定义\long\def\macro。宏在内部和基元\edef内部展开,即当你将信息写入终端或日志文件时。\write\message

另一方面,如果使用,\NewDocumentCommand\macro则宏由 TeX 基元定义\protected\def\macro(在这种情况下,宏主体更复杂)。当\macro定义为时\protected,它会在排版上下文中展开,但不会在\edef\write、中展开\message

答案2

我不确定你为什么会期望这样的输出。例如

\iow_term:x { LaTeX=\LaTeX }

会因奇怪的错误而停止

! Undefined control sequence.
\S@10 ->\gdef \tf@size
                       {10}\gdef \sf@size {7}\gdef \ssf@size {5}

如果你想用\NewDocumentCommand它定义一些文本的容器(但你不应该这样做),那么请这样做

\NewExpandableDocumentCommand{\MyNewDocumentCommand}{}{bar}

现在

\iow_term:x {MyNewDocumentCommand=\MyNewDocumentCommand}

确实会产生

MyNewDocumentCommand=bar

我不确定这有什么用处。

相关内容