不使用 \protect 的原因

不使用 \protect 的原因

所以我一直在研究宏的含义\protect。我发现这个问题答案很好地解释了命令脆弱的含义以及如何\protect解决这个问题。

但是,现在我不得不怀疑:我有什么理由希望我的命令不强大(即在其定义中不使用它)?毕竟,脆弱的命令似乎会导致各种各样的问题,而修复方法似乎(几乎)总是在命令中\protect添加一个(或者使用例如来自包的命令,据我所知,这会自动创建一个受保护的,也就是强大的命令)。\protect\NewDocumentCommandxparse

答案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}

相关内容