简洁版本
有没有办法将数学环境中每个未评估的符号通过管道传输到外部程序,而无需直接操作(La)TeX 文件(添加头文件除外)或修补 TeX 本身?
更长的版本
我编写了一个程序,在数学模式下对 (La)TeX 代码进行某些转换。到目前为止,我曾经实现过非常简化的 TeX 解释器(不遵循\include
s/ \usepackage
s 等),它过滤掉了常见嫌疑人之间的代码($
…$
对,\begin
…\end{equation}
等)。当面对新定义的数学环境或仅部分在数学模式下工作的构造时,这种方法会失败。
所以现在我想利用现有的 TeX 编译器,并且希望它为我过滤掉关键的数学模式部分(然后我会使用\write18
或 来与我的外部应用程序通信)。但我认为重新定义所有数学环境甚至$
…$
或$$
…$$
对都会失败,因为这种方法不能安全地抵御符号类别代码的操纵(用户可以将其定义|
为新的$
)。
到目前为止,我发现与自动查找数学模式环境有关的唯一命令是\everymath
和\everydisplay
。不幸的是,我似乎无法弄清楚如何使用它们来实现我的目标。
答案1
\everymath
无法解决您的问题,原因如下:
- 它仅插入在数学的开头,因此您必须扫描数学才能找到结尾;
- Tex 对数学公式的范围没有真正的概念,只有进入和退出数学模式的命令,因此很难可靠地找到公式的结尾;
- 原始 Tex 中有几种不同的方法可以进入和退出数学模式,这些方法可以乘以 Tex 给予您的自由来重新定义其源的处理方式,因此很难可靠地找到公式的结尾。
我认为不可能在任何 Latex 文档中间插入一些 Tex 代码来执行您想要的操作。然而,当 Tex 开始弄清楚如何将框放在一起时,它确实在其消化道的更深处有一个数学模式的原则性概念。
类似以下功能的软件可以利用这一点Tex4ht,它运行 Tex,但会更改宏以将额外信息从输入传递到后续的消化阶段。Tex4ht 使用此技巧来生成 HTML,但 Ross Moore 一直致力于创建带标签的 PDF,其中输出 PDF 中的公式(几乎总是)用用于生成它们的 Tex 方程式进行标记。这可以适用于将公式输出到单独的文件。
这可能违背了你不要修改 Tex 的要求,但实际上这是唯一适用于大量文档的技术。或者,你可以按照 Andrey 的建议去做,只处理遵循某些约束的文档,这样就可以轻松地从源中恢复公式。我倾向于坚持只使用\( ... ])
和\[ ... \]
,这样公式就由你可以自己重新定义的宏来分隔。
答案2
以下作品有些也就是说,它确实适用于 mathshift 而不仅仅是$
,但它也存在一些问题。首先,它在某些时候需要换行符。不过这在大多数情况下都不是问题。更严重的一点是,它在某个时候“泄漏”了换行符标记,而该标记被分配了类别代码 12。我知道它何时以及为什么会发生,只是不知道如何修复它。此外,它目前仅适用于常规内联数学,尽管 dispaymath 的类似版本应该不会非常困难。显然,目前它只是针对此问题可能采取的方向。
\documentclass{article}
\begin{document}
\catcode`|=3
\def\y{\bgroup\catcode`\^^M=12 (\x}
{\catcode`\^^M=12 %
\gdef\x#1^^M{\z#1\null^^M}%
\gdef\z#1#2^^M{\ifcat#1|\egroup#1)\ifx#2\null\else#2^^M\fi\else#1\ifx#2\null\else\z#2^^M\fi\fi}%
}
\everymath={\y}
\noindent
$x^2$
\\|x^2|
\\$x^2$ text
\\$x^2$ text $y^2$ text
\end{document}
顺便说一句,很抱歉宏名没有说明性。 的问题^^M
在于\ifx#2\null\else#2^^M\fi
。