如何定义一个可以用作上标而不使用 {} 并且可以有下标的命令

如何定义一个可以用作上标而不使用 {} 并且可以有下标的命令

我在文档中用了\theta数百次。现在我决定将所有的 theta 都设为红色。

所以我想重新定义命令\theta来创建红色的 theta。

梅威瑟:

\documentclass{article}
\usepackage{xcolor}

\let\oldtheta\theta
\renewcommand{\theta}{\mathcolor{red}{\oldtheta}}
\newcommand{\thetaWrongSpacing}{{\mathcolor{red}{\oldtheta}}}


\begin{document}

$M^\theta$ %gives error message
$\theta_1\oldtheta_1$ %works perfectly
$M^\thetaWrongSpacing$ %works perfectly
$\thetaWrongSpacing_1$ %wrong spacing
$M^\alpha$ % seems to work perfectly, but David Carlisle says this should not be used according to the LaTeX manual

\end{document}

$M^\theta$结果却出现了错误。我可以通过用 括住命令定义来解决这个问题{},但这样一来间距就不正确了。

如何\theta在不对文档进行任何更改的情况下在序言中重新定义?

PS: \renewcommand{\theta}{\begingroup\mathcolor{red}{\oldtheta}\endgroup}也会产生错误$M^\theta$,并且 的间距存在缺陷\theta_1

答案1

您的示例中彩色 theta 间距不好的原因是由于颜色实现的旧概念。pdftex 或 XeTeX 中的颜色基于插入的\pdcolorstacks(粗略地说)。当颜色开始变化时必须插入它们,当颜色恢复时,也必须插入它们。粗略地说:

{color-change text}_subscript

扩展为

{pdfcolorstack text}pdfcolorstack_subscript

第二pdfcolorstack是问题的原因。

另一方面,如果我们使用现代颜色概念(使用 LuaTeX 提供的属性),则不存在间距问题。例如,在 OpTeX 中:

\let\oritheta=\theta

\def\theta{{\Red\oritheta}}

Test $a^\theta$ and $\theta_1$.
\bye

间距正确。或者您可以根据颜色属性使用带有适当颜色包的 LuaLaTeX。

注意 1:带有\begingroup...的宏\endgroup无法解决下标的间距问题。\pdfcolorstack这里也有,并且不需要的 kern 0.2779pt(来自 theta 的斜体校正)也在这里。您在源文件中的评论“完美运行”是不正确的。

注2(由于此处的讨论):TeX 是为人类设计的,他们创建和阅读 TeX 的源文件。它$M^\theta$比写起来舒服得多$M^{\theta}$。因此,我们不能禁止第一个更适合人类的语法。

答案2

正如 wipet 所提到的,您可以使用 Lua 属性来为字形着色而不改变间距。在 LaTeX 中,您可以使用包来实现这一点luacolor

结果xcolor

\documentclass{article}
\usepackage{xcolor}

\let\oldtheta\theta
\renewcommand*{\theta}{{\mathcolor{red}\oldtheta}}

\begin{document}    
    $M^\theta M^\oldtheta$
    
    $\theta_1 \oldtheta_1$
    
    % check that the spacing is the same 
    $M^\theta$\llap{$M^\oldtheta$}
    
    $\theta_1$\llap{$\oldtheta_1$}
\end{document}

在此处输入图片描述

结果luacolor

\documentclass{article}
\usepackage{luacolor}

\let\oldtheta\theta
\renewcommand*{\theta}{{\color{red}\oldtheta}}

\begin{document}    
    $M^\theta M^\oldtheta$
    
    $\theta_1 \oldtheta_1$
    
    % check that the spacing is the same 
    $M^\theta$\llap{$M^\oldtheta$}
    
    $\theta_1$\llap{$\oldtheta_1$}
\end{document}

在此处输入图片描述

相关内容