考虑以下 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
我不确定这有什么用处。