在我的文字编辑工作中,我需要修复所提交论文中方程式的布局。
\over
为了使其更容易和更快,将命令生成的所有分数以红色显示在文档中会很有帮助.pdf
。
有办法实现这个吗?(也许重新定义\over
命令或在序言中添加其他内容?)
答案1
你不能。为了理解原因,你需要知道\over
工作原理。
当 TeX 找到\over
(或\atop
、\above
、\overwithdelims
、\atopwithdelims
、\abovewithdelims
) 时,它会将目前的数学列表 (分子) 保存在一个特殊堆栈中,并继续构建一个包含后面内容的新数学列表(分母)。当前组结束时(可能以、或\over
开始),TeX 最终知道 (广义) 分数应采用哪种样式排版。此时,TeX 可以为分子和分母中的每个项目分配正确的数学样式,从而实际将分数原子附加到当前数学列表中。$
$$
{
\left
因此,您无法对已经在数学列表中转换的分子执行任何其他操作,只需等待为其项目分配样式。
您可以重新定义\over
执行原始\over
和问题\color{red}
,这将为分母着色。但请注意,在的情况下,您需要读取两个参数\...withdelims
。
这类似于amsmath
tat 另存\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)
它。