正如以下 MCE 所指出的,\TeX
并\LaTeX
写入expl3
辅助文件:
一样的方法什么时候无操纵涉及(
\iow_now:Nn
)(但这对我的实际用例来说毫无用处):\LaTeX {} \TeX {}
不同地什么时候穷举扩展参与 (
\iow_now:Nx
):\protect \LaTeX {} T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX\@{}
为什么会有这种差异以及如何得到\protect \TeX {}
而不是T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX\@{}
?
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\iow_new:N \g_output_stream
\iow_open:Nn \g_output_stream { \c_sys_jobname_str.sbj }
\iow_now:Nn \g_output_stream { \LaTeX{} }
\iow_now:Nn \g_output_stream { \TeX{} }
\iow_now:Nx \g_output_stream { \exp_not:V\LaTeX{} }
\iow_now:Nx \g_output_stream { \exp_not:V\TeX{} }
\iow_close:N \g_output_stream
\ExplSyntaxOff
\begin{document}
\end{document}
答案1
如果我们这样做\show\TeX
,结果是
\TeX=macro:
->T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX\@.
另一方面,结果\show\LaTeX
是
> \LaTeX=macro:
->\protect \LaTeX .
现在在使用\LaTeX
中定义,并且正如@egreg 指出的那样,可以以相同的方式保护现有的宏。latex.ltx
\DeclareRobustCommand
\MakeRobust
\documentclass{article}
\MakeRobust{\TeX}
\usepackage{xparse}
\ExplSyntaxOn
\iow_new:N \g_output_stream
\iow_open:Nn \g_output_stream { \c_sys_jobname_str.sbj }
\iow_now:Nn \g_output_stream { \LaTeX{} }
\iow_now:Nn \g_output_stream { \TeX{} }
\iow_now:Nx \g_output_stream { \exp_not:V\LaTeX{} }
\iow_now:Nx \g_output_stream { \exp_not:V\TeX{} }
\iow_close:N \g_output_stream
\ExplSyntaxOff
\begin{document}
\end{document}
答案2
你不想要\exp_not:V
,而是\exp_not:N
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\iow_new:N \g_output_stream
\iow_open:Nn \g_output_stream { \c_sys_jobname_str.sbj }
\iow_now:Nn \g_output_stream { \LaTeX{} }
\iow_now:Nn \g_output_stream { \TeX{} }
\iow_now:Nx \g_output_stream { \exp_not:N \LaTeX{} }
\iow_now:Nx \g_output_stream { \exp_not:N \TeX{} }
\iow_close:N \g_output_stream
\ExplSyntaxOff
\begin{document}
\end{document}
辅助文件将具有
\LaTeX {}
\TeX {}
\LaTeX {}
\TeX {}
有什么区别?在这种情况下,\exp_not:V
进行一步扩展,但这里不需要,因为\LaTeX
和\TeX
不是变量,但没有参数功能. 回想一下,V
代表多变的并用于获取其值,不受进一步扩展。