如何使两个插入符号/帽子/抑扬符 ^^ 不特殊

如何使两个插入符号/帽子/抑扬符 ^^ 不特殊

我想在命令定义中使 ^ 不特殊,即输入中的“^”应在输出中给出“^”字符。将 catcode 设置为 11 或 12 有效,但对“^^”无效。相反,LaTeX 用“a”替换“^^!”,用“(”替换“^^h”。这里发生了什么,我该怎么做?

提示:

  • !、a、h、( 的 ASCII 码分别为 0x21、0x61、0x28、0x68。其他字符也存在同样的问题:^^ 消失,并添加 0x40或者从下一个字符中减去。我个人觉得很奇怪。
  • LaTeX、pdfLaTeX、LuaLaTeX 和 XeLaTeX 都存在同样的问题。
\documentclass{article}

\newcommand{\func}[1]{{%
    \catcode94=12\relax%^
    \catcode95=12\relax%_
    \scantokens{#1}%
}}

\begin{document}
OK:\func{_!_h}

OK:\func{^!^h}

OK:\func{__!__h}

NOT OK:\func{^^!^^h}

\catcode94=12\relax
\catcode95=12\relax
OK:__!__h

OK:^^!^^h
\end{document}

抱歉,该代码示例不够简洁;我想表明 __ (two _) 没有该问题,并且只有当我尝试该函数定义时才会出现该问题。

答案1

在此处输入图片描述

您需要在扫描参数之前更改 catcode:

\documentclass{article}

\usepackage[T1]{fontenc}

\newcommand{\func}{\bgroup%
    \catcode94=12\relax%^
    \catcode95=12\relax%_
    \xfunc}
\newcommand\xfunc[1]{\scantokens{#1}\egroup}

\begin{document}
OK:\func{_!_h}

OK:\func{^!^h}

OK:\func{__!__h}

NOT OK:\func{^^!^^h}

\catcode94=12\relax
\catcode95=12\relax
OK:__!__h

OK:^^!^^h
\end{document}

_和之间的区别在于^__!仍然会产生三个标记,因此即使在使用 解析参数之后,您也可以“更正”标记以具有 catcode12,\scantokens但由于^^!仅解析为单个标记,因此\scantokens不能用于获取三个 catcode 12 标记。

相关内容