我们知道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
。