使用 \textcolor 在数学模式下调整下标的间距

使用 \textcolor 在数学模式下调整下标的间距

这是可能的在数学模式中使用\textcolor;但是,它会改变下标的间距。

\documentclass{article}
\usepackage[usenames]{xcolor}
\begin{document}
$Y_i$ vs $\textcolor{red}{Y}_i$ vs $\mathord{\textcolor{red}{Y}}_i$ vs $\color{red}Y\color{black}_i$ vs $\begingroup\color{red}Y\endgroup_i$
\end{document}

有没有什么办法可以修复间距?建议(最后两个例子)也没有帮助。

另一个复杂之处在于我打算在宏中使用它。因此,我的目标是:

\newcommand{\parameter}{\textcolor{red}{Y}}
We use both $\parameter$ and $\parameter_i$

tex --version输出TeX 3.1415926 (TeX Live 2013)

答案1

也许你需要这个:

\def\parameter{\color{red}Y\futurelet\next\parameterA}
\def\parameterA{\ifx\next_\expandafter\parameterB\else\color{black}\fi}
\def\parameterB_#1{_{\color{black}#1}\color{black}}

$Y_i, \parameter_i, \parameter$ etc.

编辑:上面的代码是我第一次尝试解决这个问题。但这里没有处理两个想法。第一个:颜色堆栈(例如,外部颜色可能是蓝色),第二个:指数(\parameter_i^2例如,您可以写)。这就是我建议使用第二个版本的宏的原因:

\def\parameter{\bgroup\colorlet{outcolor}{.}\color{red}Y\futurelet\next\parameterA}
\def\parameterA{\ifx\next_\expandafter\parameterB\else\egroup\fi}
\def\parameterB_#1{_{{\color{outcolor}#1}}\futurelet\next\parameterC}
\def\parameterC{\ifx\next^\expandafter\parameterD\else\egroup\fi}
\def\parameterD^#1{^{\color{outcolor}#1}\egroup}

问题解释: 索引定位时没有对基字符进行斜体校正,但对指数进行斜体校正。如果基的最后一个对象不是字符,即它是\pdfliteral或,则上一句不成立\special,以便返回到外部颜色。然后在这样的之前应用斜体校正\pdfliteral。以下索引(如果存在)无法从此斜体校正中删除空格。结果是:我们无法关闭基中的颜色。我们需要手动返回索引中的外部颜色。

第二个问题:我们无法在索引后关闭组(或放置\pdfliteral),因为指数(如果存在)位于这样的关闭组之后,并且距离底数太远。这就是为什么在许多宏中指数的处理方式相似,并且设置在指数之后的原因。注意最后一个技巧:索引中的\egroup双括号。LaTeX包中的颜色设置是通过 TeX-groups 依赖原始来实现的。这会在组后放置一些材料,其中{{..}}xcolor\aftergroup\color。我们需要保存这些材料里面指数,指数关闭后,不再有效。

答案2

由于\textcolor{red}{Y}_{i}您会丢失有关“Y”的字体度量信息,因此 TeX 无法调整下标的字距。这是一个在最简单情况下(没有上标且仅在主级别(不在下标或上标中))工作的宏。如果您需要全套功能,那么它会更加复杂。

\documentclass{article}
\usepackage{xcolor}

\makeatletter
\newcommand\parameter{%
  \textcolor{red}{Y}%
  \@ifnextchar_{\parameter@subscript}{}%
}
\newcommand\parameter@subscript[2]{%
  % #1 is _, #2 is the actual subscript
  \sbox0{$Y_{#2}$}\sbox2{$Y{}_{#2}$}%
  _{\kern\dimexpr\wd0-\wd2\relax#2}%
}
\makeatother

\begin{document}
$Y_i$

$\parameter_i$
\end{document}

在此处输入图片描述

一种更简单的实现,也适用于下标。

\documentclass{article}
\usepackage{xcolor}

\makeatletter
\newcommand\parameter{%
  \begingroup
  \color{red}Y\@ifnextchar_{\do@parameter}{\endgroup}%
}
\newcommand{\do@parameter}[2]{%
  _{\color{black}#2}\endgroup
}
\makeatother
\begin{document}
$Y_i$

$\parameter_i$

$A_{\parameter_i}$
\end{document}

在此处输入图片描述

答案3

我结合了@egreg 和@wipet 的答案作为我的最终解决方案,它似乎适用于我尝试过的所有测试用例。它还具有允许通过参数设置文本的附加功能,因此它的操作类似于\textcolor

\documentclass{article}
\usepackage[usenames]{xcolor}

\makeatletter
\newcommand{\mathcolor}[2]{%
  \begingroup
  \colorlet{out}{.}\color{#1}#2\@ifnextchar_{\do@mathcolorsub}{\endgroup}%
}
\newcommand{\do@mathcolorsub}[2]{%
  _{{\color{out}#2}}\@ifnextchar^{\do@mathcolorsup}{\endgroup}%
}
\newcommand{\do@mathcolorsup}[2]{%
  ^{\color{out}#2}\endgroup
}
\makeatother

它可以轻松定义多个参数。

\newcommand{\Y}{\mathcolor{red}{Y}}
\newcommand{\A}{\mathcolor{green}{A}}
\newcommand{\Ar}{\mathcolor{blue}{\mathrm{A}}}
\newcommand{\Oc}{\mathcolor{red}{O}}

测试用例如下:

\begin{document}
$Y_i+Y^i+Y_i^i+Y+Z_{Y_i}+Z^{Y_i}$\par
$\color{blue} \Y_i+\Y^i+\Y_i^i+\Y+Z_{\Y_i}+Z^{\Y_i}$\par
$A_i+A^i+A_i^i+A+Z_{A_i}+Z^{A_i}$\par
$\A_i+\A^i+\A_i^i+\A+Z_{\A_i}+Z^{\A_i}$\par
$\mathrm{A}_i+\mathrm{A}^i+\mathrm{A}_i^i+\mathrm{A}+Z_{\mathrm{A}_i}+Z^{\mathrm{A}_i}$\par
$\Ar_i+\Ar^i+\Ar_i^i+\Ar+Z_{\Ar_i}+Z^{\Ar_i}$\par
$A_i^{Y_k}+\A_i^{\Y_k}+O^i+\Oc^i$
\end{document}

测试用例

我认为这值得发布,但如果被认为是多余的,我很乐意删除。

相关内容