所以我一直在研究宏的含义\protect
。我发现这个问题答案很好地解释了命令脆弱的含义以及如何\protect
解决这个问题。
但是,现在我不得不怀疑:我有什么理由希望我的命令不强大(即在其定义中不使用它)?毕竟,脆弱的命令似乎会导致各种各样的问题,而修复方法似乎(几乎)总是在命令中\protect
添加一个(或者使用例如来自包的命令,据我所知,这会自动创建一个受保护的,也就是强大的命令)。\protect
\NewDocumentCommand
xparse
答案1
考虑
\documentclass{article}
\newcommand\abc{center}
\newcommand\redef[2]{\def#1{#2}}
\begin{document}
\typeout{here: \abc}
\begin{\abc}
xxx
\end{\abc}
\redef{\abc}{xyz}
\typeout{here: \abc}
\end{document}
生成一个日志
here: center
here: xyz
如果你在日志中\protect
添加\abc
\typeout
here: \abc
here: \abc
如果你在日志\protect
中添加参数\redef
! Use of \protect doesn't match its definition.
\end ...after \z@ \expandafter \protect \fi \end
l.20 \end
{document}
?
正如 \protect
已经重新定义的那样,\abc
所以这取决于上下文。\protect
阻止扩展,但当前上下文可能正在期待扩展。
\documentclass{article}
\newcommand\abc{center}
\newcommand\redef[2]{\def#1{#2}}
\begin{document}
\typeout{here: \protect\abc}
\begin{\abc}
xxx
\end{\abc}
\redef{\protect\abc}{xyz}
\typeout{here: \protect\abc}
\end{document}