为什么 \mathchoice 会干扰我重新定义的上标?

为什么 \mathchoice 会干扰我重新定义的上标?

我重新定义了^根据它是上标、上上标等给出不同的颜色,方法如下:

\catcode`^\active
\def^#1{%
    \mathchoice{%
        \sp{\color{red}#1}%
    }{%
        \sp{\color{blue}#1}%
    }{
        \sp{\color{green}#1}%
    }{
        \sp{\color{orange}#1}%
    }%
}

这得出 在此处输入图片描述

这正是我想要的。但是,当我有一个像 这样的大运算符时\sum,代码

\sum_{n=1}^\infty \frac{1}{n}

产量 在此处输入图片描述 而不是\infty正确地将 放在限制中。如果我不使用\mathchoice,就不会发生这种情况。有办法解决这个问题吗?

附注:我不确定为什么颜色中省略了蓝色。 和 不应该k+1蓝色,而不是绿色吗?

答案1

以下内容避免使用\mathchoice,并使用@egreg、@David Carlisle 和@wipet 的意见进行了编辑。

首先请注意,更改 catcode 本身是有风险的。虽然有可能实现您想要的结果,但在某些情况下,其他代码(例如包)需要“标准”catcode。mathtools加载时会发生其中一种情况:如果^catcode 为 active,则会发生错误。@egreg 的答案通过在组内本地设置 catcode,然后在文档开头全局切换它来避免这种情况;我在这里借用了这一点。然而,可能还有其他令人讨厌的惊喜。

\documentclass{article}
\usepackage{mathtools}
\usepackage{xcolor}
\newcount\sup
\sup=0
\bgroup
\catcode`\^=13
\gdef^#1{\sp{\advance\sup by1 {\color{\ifcase\sup\or red\or blue\or green\else orange\fi}#1}}}
\egroup
\AtBeginDocument{\catcode`^=\active}
%
\begin{document}
\[ x^{1/4^{k^\alpha}+1} \quad \sum_{n=1}^\infty \frac{1}{n}\]
\end{document}

每次脚本级别上升时,计数器都会增加 1,而下降时计数器又会减少,因为增加发生在组内。这里我必须感谢 @wipet,他提出了这个非常简洁的实现。

在此处输入图片描述

答案2

我猜你误解了这些参数的用途\mathchoice

您没有得到蓝色的原因可能是您有公式\displaystyle

当你说

\mathchoice{a}{b}{c}{d}

TeX 将a在显示样式、b文本样式、c脚本样式以及最终的d脚本样式(第二级或更高级别的下标或上标)中使用。它们不是在基础、第一级、第二级或第三级中使用的,正如您可以从您的帖子中猜到的那样:TeX 将第三级上标/下标视为第二级。

普通 TeX 示例(与 LaTeX 相同):

$$
\mathchoice{a}{b}{c}{d}
+
{\mathchoice{a}{b}{c}{d}\over2}
+x^{\mathchoice{a}{b}{c}{d}}
+x^{y^{\mathchoice{a}{b}{c}{d}}}
$$
\bye

在此处输入图片描述

第一个\mathchoice结果是A因为 TeX 是显示样式;第二个产生b因为在显示样式中找到的分数的分子在文本样式中被处理。其他两种情况应该很清楚。

现在让我们尝试一下

$$
A\mathchoice{\sp{a}}{\sp{b}}{\sp{c}}{\sp{d}}
+
{A\mathchoice{\sp{a}}{\sp{b}}{\sp{c}}{\sp{d}}\over2}
$$

第一个\mathchoice是显示样式,第二个是文本样式,我们得到

在此处输入图片描述

这可能不是您所期望的,但了解确切规则时就可以预测。

现在让我们尝试一下

$$
\left( 1\over 2 \right)\mathchoice{\sp{a}}{\sp{b}}{\sp{c}}{\sp{d}}
$$

在此处输入图片描述

糟糕!\mathchoice在其自己的数学列表中处理,下标为不是到前一个没有接收上标场的原子。

使用 LuaTeX 你可以做得更好,但使用 TeX 你能得到的最好的结果是

\documentclass{article}
\usepackage{xcolor}

\begingroup
\catcode`^=\active
\protected\gdef^#1{%
  \sp{\mathchoice{}{}%
        {\mathcolor{green!80!blue}{#1}}%
        {\mathcolor{orange}{#1}}%
  }%
}
\endgroup
\AtBeginDocument{\catcode`^=\active}

\begin{document}

\[
x^{a^{b^{c}}}+\sum_{k=1}^{\infty} a^{k}
\]

\end{document}

在此处输入图片描述

使用 LuaTeX 可以做得更好,您可以随时查询当前\mathstyle(从 0 到 7 的整数):

\documentclass{article}
\usepackage{xcolor}

\begingroup
\catcode`^=\active
\protected\gdef^#1{%
  \ifcase\mathstyle
    \sp{\mathcolor{blue!80!green}{#1}}% 0 = D
  \or
    \sp{\mathcolor{blue!80!green}{#1}}% 1 = D'
  \or
    \sp{\mathcolor{blue!80!green}{#1}}% 2 = T
  \or
    \sp{\mathcolor{blue!80!green}{#1}}% 3 = T'
  \or
    \sp{\mathcolor{green!80!blue}{#1}}% 4 = S
  \or
    \sp{\mathcolor{green!80!blue}{#1}}% 5 = S'
  \or
    \sp{\mathcolor{orange}{#1}}% 6 = SS
  \or
    \sp{\mathcolor{orange}{#1}}% 7 = SS'
  \fi
}
\endgroup
\AtBeginDocument{\catcode`^=\active}

\begin{document}

\[
x^{a^{b^{c}}}+\sum_{k=1}^{\infty} a^{k}
\]

\end{document}

在此处输入图片描述

答案3

在此处输入图片描述

即使x^2你没有把上标放在 x 上,而是放在一个空原子上,就像x{^2}这样更明显\sum

移到\sp外面

\documentclass{article}
\usepackage{mathtools}
\usepackage{xcolor}

{\catcode`^\active
\gdef^#1{\sp{\mathchoice
    {\mathcolor{red}{#1}}%
    {\mathcolor{blue}{#1}}%
    {\mathcolor{green}{#1}}%
    {\mathcolor{orange}{#1}}%
    }%
}
}
\AtBeginDocument{\catcode`^\active}
\begin{document}

\[
x^{{1/4}^{k^\alpha}+1}
+
\sum_{n=1}^\infty \frac{1}{n}
\]

\end{document}

相关内容