在编写有关相对论的公式时,我经常需要编写张量符号,其中指标(在下标和上标中)的顺序很重要。也就是说,我希望有多个高度匹配的下标和上标。理想情况下,我想输入
\[ T^\mu_\nu^\rho^\sigma_\eta \]
并得到与
\[ T^\mu\vphantom{T}_\nu\vphantom{T}^\rho\vphantom{T}^\sigma\vphantom{T}_\eta \]
我想到一种解决方案,我让^
和_
(数学) 活动来实现这一点,但是我需要第一个^
或之前的框的高度_
。据我所知,获得这个(至少直接)是不可能的,因为在我的例子中,TeX 在T
读取之前吞掉了^
。这是准确的吗?
是否可以从子标/上标内部确定子标或上标降低或升高的高度?这样我就可以为以下子标/上标保存此高度。
注意:我确实意识到,通过在张量名称之前放置一个宏可以轻松规避此问题,这可能是更简洁的 TeX 样式。这个问题更多的是关于调整 TeX 以以这种方式运行的可能性。
答案1
答案2
在整个文档中使^
和处于活动状态会带来麻烦。因此,我在这里创建了两个宏,当您希望实现此特殊脚本模式时,可在数学模式下调用它们:_
\specialscriptmode
^
是重新定义和在脚本之前添加空组的模式声明_
。这解决了双重上/下标问题。它确实有一个缺点,即脚本的垂直位置虽然都是统一的,但不是由底座的高度决定的。如果这对用户很重要,那么我们使用\specialscript{<base>}
这也会打开特殊脚本模式,但重新定义^
并_
设置相对于底座适当高度的脚本。我\vphantom
注意到不是足以达到此目的,因此必须依靠\left.\vphantom{<base>}\right.
合适的负预字距调整。
\restorescriptmode
如果有人需要退出特殊模式并返回到^
和的正常定义,则提供宏_
。离开数学模式时,这将自动发生,但如果您需要恢复定义,则可能需要该宏前离开数学模式。
\documentclass{article}
\let\svss^
\let\svsb_
\catcode`^=\active %
\catcode`_=\active %
\def^{{}\svss}
\def_{{}\svsb}
\newcommand\specialscript[1]{
\specialscriptmode
\def^{\mkern-7mu\left.\vphantom{#1}\right.\svss}
\def_{\mkern-7mu\left.\vphantom{#1}\right.\svsb}
#1
}
\catcode`^=7 %
\catcode`_=8 %
\newcommand\specialscriptmode{\catcode`^=\active \catcode`_=\active }
\newcommand\restorescriptmode{\catcode`^=7 \catcode`_=8 }
\begin{document}
\[
\specialscriptmode
T^\mu_\nu^\rho^\sigma_\eta
\]
\[
\specialscript{T}^\mu_\nu^\rho^\sigma_\eta
\quad\textrm{vs.}\quad
\specialscript{\left(\frac{a}{b}\right)}^\mu_\nu^\rho^\sigma_\eta
\]
\end{document}
答案3
您可以使用以下六行宏,然后只需在张量前放置\tensor
前缀。无需括号。
\def\tensor#1{\def\tensorA{{\vphantom{#1}}}#1\def\tensorD{\mkern-3mu}\tensorB}
\def\tensorB{\futurelet\next\tensorC}
\def\tensorC{\ifx\next_\tensorD\def\tensorD{}\tensorA
\else\ifx\next^\def\tensorD{\mkern-4mu}\tensorA\else\tensorE\fi\fi\tensorF}
\def\tensorE#1\tensorF{\fi\fi}
\def\tensorF#1#2{#1#2\tensorB}
$\tensor Z^\mu_\nu^\rho^\sigma_\eta_\alpha $
\bye
答案4
从其他答案来看,我猜我实际问题的答案是这确实是不可能的。
然而,对于我的应用程序,有可能解决这个问题,正如其他答案所指出的那样。