![\begin{document} 之后的活动字符](https://linux22.com/image/240634/%5Cbegin%7Bdocument%7D%20%E4%B9%8B%E5%90%8E%E7%9A%84%E6%B4%BB%E5%8A%A8%E5%AD%97%E7%AC%A6.png)
我正在使用 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>}
。