使用上标或下标前的框的高度

使用上标或下标前的框的高度

在编写有关相对论的公式时,我经常需要编写张量符号,其中指标(在下标和上标中)的顺序很重要。也就是说,我希望有多个高度匹配的下标和上标。理想情况下,我想输入

\[ 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

这是该包的工作tensor

\documentclass{article}
\usepackage{tensor}

\begin{document}

\[
\tensor{T}{^\mu_\nu^\rho^\sigma_\eta}
\]

\end{document}

在此处输入图片描述

答案2

在整个文档中使^和处于活动状态会带来麻烦。因此,我在这里创建了两个宏,当您希望实现此特殊脚本模式时,可在数学模式下调用它们:_

  1. \specialscriptmode^是重新定义和在脚本之前添加空组的模式声明_。这解决了双重上/下标问题。它确实有一个缺点,即脚本的垂直位置虽然都是统一的,但不是由底座的高度决定的。如果这对用户很重要,那么我们使用

  2. \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

从其他答案来看,我猜我实际问题的答案是这确实是不可能的。

然而,对于我的应用程序,有可能解决这个问题,正如其他答案所指出的那样。

相关内容