![如何定义一个可以用作上标而不使用 {} 并且可以有下标的命令](https://linux22.com/image/471054/%E5%A6%82%E4%BD%95%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A5%E7%94%A8%E4%BD%9C%E4%B8%8A%E6%A0%87%E8%80%8C%E4%B8%8D%E4%BD%BF%E7%94%A8%20%7B%7D%20%E5%B9%B6%E4%B8%94%E5%8F%AF%E4%BB%A5%E6%9C%89%E4%B8%8B%E6%A0%87%E7%9A%84%E5%91%BD%E4%BB%A4.png)
我在文档中用了\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 中的颜色基于插入的\pdcolorstack
s(粗略地说)。当颜色开始变化时必须插入它们,当颜色恢复时,也必须插入它们。粗略地说:
{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}