修改序言中或 \AtBeginDocument 中的 catcode?

修改序言中或 \AtBeginDocument 中的 catcode?

我想修改逗号的 catcode,使用以下代码

\documentclass{article}
\AtBeginDocument{%
  \catcode`\,=\active
  \protected\def,{...}%
}
\begin{document}
a,b,c $a,b,c$.
\end{document}

我收到以下错误消息:

! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
l.6 \begin{document}

但使用以下代码,我得到了正确的结果:

\documentclass{article}
\begingroup
  \catcode`\,=\active
  \protected\gdef,{...}%
\endgroup
\AtBeginDocument{%
  \catcode`\,=\active
}
\begin{document}
a,b,c $a,b,c$.
\end{document}

我想知道这两种方式有什么区别。为什么第一种方法会导致问题?

编辑: 虽然 David Carlisle 给出了另一个相关问题,但我认为这个问题可能与那个问题不一样,因为两个都示例包含

\AtBeginDocument{%
  \catcode`\,=\active
}

我不明白为什么只有一个例子就会引起问题。

答案1

在的论证中\AtBeginDocument,逗号是不是有效。当类别代码设置的参数为执行稍后\begin{document}。还请记住,类别代码在标记化过程中被分配。读取参数时,输入的字节将使用当前类别代码机制进行标记化。执行参数时,逗号的类别更改将影响后续的标记化,但不会影响参数其余部分的标记。

小写波浪符号技巧

典型的模式是使用波浪符号,因为它在 LaTeX 中默认处于活动状态。然后\lowercase用于将波浪符号转换为逗号。在此过程中类别代码不会改变,结果是活动逗号。组可防止波浪符号的小写设置永久设置。

\documentclass{article}
\AtBeginDocument{%
  \catcode`\,=\active
  \begingroup
    \lccode`\~=`\, %
  \lowercase{\endgroup
    \protected\def~%
  }{...}%
}
\begin{document}
a,b,c $a,b,c$.
\end{document}

结果

更改整个报表的类别代码

另一种模式是更改包括参数在内的整个语句的类别代码。首先保存逗号的原始类别代码,例如通过重置宏(\ResetCommaCatcode)。然后更改逗号的类别代码。现在\AtBeginDocument调用,参数现在包含一个活动逗号标记(在中\protected\def,)。之后,逗号的类别代码将重置为先前的值。

\documentclass{article}

\edef\ResetCommaCatcode{%
  \catcode`\noexpand\,=\the\catcode`\,\relax
}
\catcode`\,=\active
\AtBeginDocument{%
  \catcode`\,=\active
  \protected\def,{...}%
}
\ResetCommaCatcode

\begin{document}
a,b,c $a,b,c$.
\end{document}

相关内容