\begin{document} 之后的活动字符

\begin{document} 之后的活动字符

我正在使用 XeLaTeX,我想在换行后自动重复加号。我发现非官方包但对我来说这有点过头了(虽然没有尝试过)。

我尝试修改示例(pdf)LaTeX 可以识别文本字符串并替换(扩展)它们吗?,我刚刚将“e”改写为“+”。只要宏定义在 之后,此方法就有效\begin{document},如果我将其放在 之前,则它仅适用于字母(不适用于加号)。

我也尝试了一些不同的方法,我发现这里

{\catcode`\+=13 \expandafter }\expandafter \newcommand\noexpand+{\mathplus\discretionary{}{+}{}}
\mathchardef\mathplus=\mathcode`\+  % + character in math mode
\mathcode`\+="8000  % set + active in math mode, otherwise inactive
\binoppenalty=10000 % do not break elsewhere

这是相同的,只有当我把它放在后面时它才有效\begin{document},但我希望它作为我的包的一部分。

我正在使用 XeLaTeX 和以下软件包进行翻译:fontspec、amssymb、amsmath、xltxtra、hyperref、geometry 和 fancyhdr。

llcode我真的对这些习语感到困惑expandafter,所以我很高兴得到每一条关于如何简单地解决我的问题的建议。

答案1

首先介绍一点理论:当 TeX 在数学模式中找到类别 11 或 12 的字符时,它会查看其数学代码;例如,的通常数学代码+"202B十六进制形式,这意味着

+运算符号(第一位数字"2);字符必须取自数学系列"0(第二位数字);使用插槽中的字符"2B(第三和第四位数字)。

但是,如果数学代码是特殊值"8000,TeX 会查找该字符的定义,就好像它是活动的(catcode 13)一样,并使用它来代替它。Plain TeX 和 LaTeX 利用此功能在'诸如 之类的公式中$f''(x)$,巧妙地定义了 active '

因此问题在于提供这样的定义没有激活角色。让我们看一下所呈现的代码。

\mathchardef\mathplus=\mathcode`\+  % + character in math mode

此行仅提供了一个命令,它是通常的别名+;请注意,不需要知道数学代码:该符号隐式访问它。

\mathcode`\+="8000  % set + active in math mode, otherwise inactive

这将特殊数学代码分配给+

\binoppenalty=10000 % do not break elsewhere

这告诉 TeX二进制运算符号是断线的好点,除非手动添加了明确的好断点:例如惩罚或自由裁量项目。

{\catcode`\+=13 \expandafter }\expandafter 
  \newcommand\noexpand+{\mathplus\discretionary{}{+}{}}

此代码的目的是定义+要扩展为的活动\mathplus\discretionary{}{+}{}。不能说

{\catcode`\+=13 \gdef+{\mathplus\discretionary{}{+}{}}}

因为替换文本中会有一个活动+,这会导致无限递归,因为+会被其定义替换无限地。因此,+在组中激活了,并且在组关闭之前,\noexpand+通过两个\expandafter命令扩展了。的扩展\noexpand+只是一个活动+,但是,现在无法扩展,因为它的扩展能力已被取消。然后组关闭,但第一个+(前面没有\noexpand任何其他)已被标记,TeX 认为

\newcommand+{\mathplus\discretionary{}{+}{}}

其中第一个+处于活动状态,而第二个处于非活动状态。 的目的\discretionary有两个:首先,它会插入一个加号,其中包含正确的数学代码,使其符合二进制运算的条件并提供断点;其次,如果发生中断,则会在中断后+插入一个。

完全等价的定义是

\begingroup\lccode`~=`+
  \lowercase{\endgroup\def~}{\mathplus\discretionary{}{+}{}}

因为\lowercase会放回主令牌列表

\endgroup\def+

具有+与 ~ 相同的类别代码(即活动)。\endgroup撤消分配\lccode。 第二个+像往常一样具有类别 12。

然而这个定义并不像看上去那么好:例如尝试

\parbox{1pt}{\itshape$a+b$}

宽度\parbox非常小的 只是为了在 之后强制中断++第二行开头的 将是斜体字体!实际上 的参数\discretionary是在水平的模式,就好像\mbox包围了它们(TeXbook,第 287 页)。更合理的定义是使用

\discretionary{}{\the\textfont0+}{}

由于上标和下标之间不能有断点,所以这样做很安全。至于其他的,-那就另当别论了。

个人观点。一些印刷传统,尤其是在俄罗斯,在分隔符处使用重复的运算和关系符号。这是一个值得被遗忘的传统,因为它没有数学依据。

答案2

我认为这\begin{document}会改变 catcode(是吗?)。无论如何,更改 catcode 可能会(将要在您的情况下)会破坏与许多其他软件包的兼容性。

也许您最好定义某种环境,以使更改在其中生效。这有两个效果:首先,它避免了问题;\begin{document}其次,您仍然可以在同一文档中使用其他包。

您可以将代码放入相应的\begin{<environment>}语句中。更改将持续到\end{<environment>}

相关内容