cprotect 如何工作?

cprotect 如何工作?

我们知道cprotect包可用于在标题/部分中包含逐字内容:\cprotect\section{\verb+123+}

  • 它是如何工作的?
  • 如果我想做一些类似的事情,而该包本身无法做到,我该怎么做?

答案1

参见cprotect源代码文档(在 CTAN) 了解其工作原理的详细信息。

简而言之:

要理解其\cprotect工作原理,我们首先必须理解其\protect工作原理。

回想起那个\protect确保跟在它后面的宏保持不扩展,直到它处于正常上下文中

对于\verb和类似的,我们需要一个更严格的要求,即其后面的参数\verb在正常上下文中执行之前不能被读取(标记化)。

因此,要做到这一点,\cprotect本质上 (*) 转换

\cprotect\section{\verb+abc+}

\section{\protect\input{a-1.cpt}}

\verb+abc+写入文件后a-1.cpt

这是有效的,因为\protect可以确保输入的文件\input仅在正常上下文中被标记。

当然,这(以及\protect)依赖于内容最终在正常上下文中执行。例如,如果参数\detokenize在仅被扩展/从未扩展后直接传递给,则不会产生最终的预期值。例子

(*): 实际上结果是\protect\input a-1.cpt\relax

相关内容