用红色显示由 \over 命令生成的所有分数

用红色显示由 \over 命令生成的所有分数

在我的文字编辑工作中,我需要修复所提交论文中方程式的布局。

\over为了使其更容易和更快,将命令生成的所有分数以红色显示在文档中会很有帮助.pdf

有办法实现这个吗?(也许重新定义\over命令或在序言中添加其他内容?)

答案1

你不能。为了理解原因,你需要知道\over工作原理。

当 TeX 找到\over(或\atop\above\overwithdelims\atopwithdelims\abovewithdelims) 时,它会将目前的数学列表 (分子) 保存在一个特殊堆栈中,并继续构建一个包含后面内容的新数学列表(分母)。当前组结束时(可能以、或\over开始),TeX 最终知道 (广义) 分数应采用哪种样式排版。此时,TeX 可以为分子和分母中的每个项目分配正确的数学样式,从而实际将分数原子附加到当前数学列表中。$$${\left

因此,您无法对已经在数学列表中转换的分子执行任何其他操作,只需等待为其项目分配样式。

您可以重新定义\over执行原始\over和问题\color{red},这将为分母着色。但请注意,在的情况下,您需要读取两个参数\...withdelims

这类似于amsmathtat 另存\over\@@over并将其重新定义为 do\@@over并发出警告的策略。不过,这个警告只会发出一次,但修改行为并不困难,因此每一个使用会触发警告。

这是通过以下方式实现的\primfrac

\DeclareRobustCommand{\primfrac}[1]{%
  \PackageWarning{amsmath}{%
Foreign command \@backslashchar#1;\MessageBreak
\protect\frac\space or \protect\genfrac\space should be used instead%
\MessageBreak
  }
  \global\@xp\let\csname#1\@xp\endcsname\csname @@#1\endcsname
  \csname#1\endcsname
}

如您所见,以 开头的行将\global命令\over或同级重新定义为相应的原语。只需删除 即可\global

例子。

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\DeclareRobustCommand{\primfrac}[1]{%
  \PackageWarning{amsmath}{%
Foreign command \@backslashchar#1;\MessageBreak
\protect\frac\space or \protect\genfrac\space should be used instead%
\MessageBreak
  }
  \@xp\let\csname#1\@xp\endcsname\csname @@#1\endcsname
  \csname#1\endcsname
}
\makeatother

\begin{document}

Here I use a fraction $a\over b$.

Here I use a generalized fraction $a\choose b$.

Another fraction $a\over b$.

\end{document}

这将在日志文件中生成

Package amsmath Warning: Foreign command \over;
(amsmath)                \frac or \genfrac should be used instead
(amsmath)                 on input line 18.


Package amsmath Warning: Foreign command \atopwithdelims;
(amsmath)                \frac or \genfrac should be used instead
(amsmath)                 on input line 20.


Package amsmath Warning: Foreign command \over;
(amsmath)                \frac or \genfrac should be used instead
(amsmath)                 on input line 22.

不删除的话,只会出现前两个\global

但是,你会看到\choose会触发有关 的警告,\atopwithdelims而不是\choose。这是因为 LaTeX 采用了普通 TeX 的定义

\def\choose{\atopwithdelims()}

您可能想要添加

\let\@@choose\choose
\renewcommand{\choose}{\primfrac{choose}}

所以你也会得到

Package amsmath Warning: Foreign command \choose;
(amsmath)                \frac or \genfrac should be used instead
(amsmath)                 on input line 23.

除了后续使用时会出现相同的警告之外\atopwithdelims

答案2

我证明了用 声明的分数\over可以着色。我的实验代码是为 OpTeX 设计的:

\def\scanmath#1#{\scanmathA{#1}}
\def\scanmathA#1#2{\addto\mlist{#1}\ifx\_fin#2\else
   {\def\mlist{}\checkover {#2}\_ea}\_ea\addto\_ea\mlist\_ea{\_ea{\mlist}}%
   \_ea \scanmath\_fi}
\def\checkover #1{\def\tmp{#1}\isinlist\tmp{\over}\iftrue
   \addto\mlist{\Red #1}\else \scanmath #1{\_fin}\fi}
\def\checkmath #1${\def\mlist{}\checkover{#1}\mlist$}
\def\checkdisplay #1$${\def\mlist{}\checkover{#1}\mlist$$}

\everydisplay{\checkdisplay}
$$
  \eqalign{
     a &= {1\over2} b + {4\over 5} \cr
     b &= {7\over {8\over 9}} }
$$

\everymath{\checkmath}
The text $a\over b$ and $c={d\over e}$.

\bye

运行并运行。将整个数学公式读入参数,然后检查“外组级别”是否存在。如果为真,则\everydisplay附加。否则,我们检查是否存在类似的东西。每个这样的部分组都会被单独扫描,如果有,则附加。\checkdisplay\everymath\checkmath#1\over\Red...{...}...{...}...\over\Red

这个实验性的宏不是通用的。它不能正确检查类似 的模式\left(...\over...\right),因此您必须改写 \left({...\over...}\right)它。

相关内容