张量的表达宏;升高和降低的指标

张量的表达宏;升高和降低的指标

有没有人能找到一个令人满意的解决方案来解决索引升高/降低的张量排版问题?例如,我可以写出以下等式: \ddot x^\mu = \Gamma^{\mu}{}_{\alpha}{}_{\beta} \dot x^\alpha \dot x^\beta

在此处输入图片描述

当编写大量张量时,这很麻烦。

我正在寻找一种构造命令的方法,该命令可以\Gamma使用更具表现力的语法生成上述张量。例如,\tens像这样运行的命令将是理想的:

\ddot \tens{x}{\mu} = \tens{Gamma}{\mu}[\alpha][\beta] \dot \tens{x}{\alpha} \tens{x}{\beta}

关键品质我想要的语法是存在任意数量的参数两种不同类型。 中含有的参数{ }是升序索引,而 中含有的参数[ ]是降序索引。 我不需要看起来像确切地像这样;我正在寻找一些同样富有表现力的东西。

有人能解决这个问题吗? 能实现一个\tens像上面一样工作的命令吗? 我不知道该怎么做。

答案1

在我看来,下标和上标一个论点。

您可以使用该tensor包,而不必重新发明轮子:它具有非常方便的语法。

我还\tens根据您的喜好提供了命令。

\documentclass{article}
\usepackage{tensor}

%\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\tens}{mo}
 {
  #1
  \IfNoValueTF { #2 } 
   {
    \__myridium_tens_up_lookup:
   }
   {
    \__myridium_tens_down_lookup: [ #2 ]
   }
 }

\cs_new_protected:Nn \__myridium_tens_down_lookup:
 {
  \peek_charcode_ignore_spaces:NTF [
   {
    \__myridium_tens_down:w
   }
   { \kern2\scriptspace }
 }
\cs_new_protected:Npn \__myridium_tens_down:w [ #1 ]
 {
  {\mathstrut}
  \sb{#1}
  \kern-\scriptspace
  \__myridium_tens_up_lookup:
 }
\cs_new_protected:Nn \__myridium_tens_up_lookup:
 {
  \peek_catcode_ignore_spaces:NTF \c_group_begin_token
   {
    \__myridium_tens_up:n
   }
   { \kern2\scriptspace }
 }
\cs_new_protected:Nn \__myridium_tens_up:n
 {
  {\mathstrut}
  \sp{#1}
  \kern-\scriptspace
  \__myridium_tens_down_lookup:
 }
\ExplSyntaxOff

\begin{document}

\subsection*{With \texttt{tensor}}
\[
\tensor{\ddot{x}}{^\mu}=
\tensor{\Gamma}{^\mu_\alpha_\beta}
\tensor{\dot{x}}{^\alpha} \tensor{\dot{x}}{^\beta}
\]

\[
\tensor{\Gamma}{_\mu^\nu^\rho_\alpha^\nu^\rho}
\tensor{\dot{\Gamma}}{_\mu^\nu^\rho_\alpha^\nu^\rho}
\]

\subsection*{With the hand-made macro}
\[
\tens{\ddot{x}}{\mu}=
\tens{\Gamma}{\mu}[\alpha\beta]
\tens{\dot{x}}{\alpha} \tens{\dot{x}}{\beta}
\]

\[
\tens{\Gamma}[\mu]{\nu\rho}[\alpha]{\nu\rho}
\tens{\dot{\Gamma}}[\mu]{\nu\rho}[\alpha]{\nu\rho}
\]

\end{document}

在此处输入图片描述

答案2

我不会使用这样的语法,但是语义可以设置为完成类似这样的操作(免责声明:我是作者)。请注意,您需要最近更新 SemanTeX(我认为是 10 月或更晚)才能使此示例正常运行。请注意,我还更喜欢定义键dot和,ddot而不是直接使用命令\dot\ddot

\documentclass{article}

\usepackage{semantex}

\NewVariableClass\tens[
    output=\tens,
    define keys={
        {dot}{ command=\dot },
        {ddot}{ command=\ddot },
        {pre index}{ right return, symbol put right={{}} },
        {post index}{ right return, symbol put right=\kern-\scriptspace },
    },
    define keys[1]={
        {default}{ pre index, lower={#1}, post index },
        {arg}{ pre index, upper={#1}, post index },
    },
]

\begin{document}

$ \tens{\dot x}{\mu} = \tens{\dot{\Gamma}}{\mu}[\alpha][\beta] 
    \tens{\dot{x}}{\alpha} \tens{\dot{x}}{\beta} $

$ \tens{\ddot x}{\mu} = \tens{\dot{\Gamma}}{\mu}[\alpha][\beta]
    \tens{\dot{x}}{\alpha} \tens{\dot{x}}{\beta} $

$ \tens{x}[ddot]{\mu} = \tens{\Gamma}[dot]{\mu}[\alpha][\beta]
    \tens{x}[dot]{\alpha} \tens{x}[dot]{\beta} $

\end{document}

在此处输入图片描述


就我个人而言,我更喜欢使用基于 keyval 的语法,如下所示:

\documentclass{article}

\usepackage{semantex}

\NewVariableClass\Tensor[
    output=\Tensor,
    define keys={
        {dot}{ command=\dot },
        {ddot}{ command=\ddot },
        {pre index}{ right return, symbol put right={{}} },
        {post index}{ right return, symbol put right=\kern-\scriptspace },
    },
    define keys[1]={
        {up}{ pre index, upper={#1}, post index },
        {low}{ pre index, lower={#1}, post index },
    },
]

\begin{document}

$ \Tensor{x}[dot,up=\mu] = \Tensor{\Gamma}[dot,up=\mu,low=\alpha,low=\beta]
    \Tensor{x}[dot,up=\alpha] \Tensor{x}[dot,up=\beta] $

$ \Tensor{x}[dot,up=\mu] = \Tensor{\Gamma}[dot,up=\mu,low=\alpha,low=\beta]
    \Tensor{x}[dot,up=\alpha] \Tensor{x}[dot,up=\beta] $

\NewObject\Tensor\tGamma{\Gamma}
\NewObject\Tensor\tx{x}

$ \tx[dot,up=\mu] = \tGamma[dot,up=\mu,low=\alpha,low=\beta]
    \tx[dot,up=\alpha] \tx[dot,up=\beta] $

$ \tx[dot,up=\mu] = \tGamma[dot,up=\mu,low=\alpha,low=\beta]
    \tx[dot,up=\alpha] \tx[dot,up=\beta] $

\end{document}

在此处输入图片描述

答案3

这里有一个像您描述的那样工作的东西,但使用圆括号而不是花括号。像往常一样,这些东西可能有点脆弱,所以有时你需要\relax一点时间才能让它完全工作,如第二个示例所示。

\documentclass{article}
\makeatletter
\edef\tens@u{(}
\edef\tens@l{[}
\def\tens@U#1)#2{{}^{#1}\expandafter\tens@i#2\relax}
\def\tens@L#1]#2{{}_{#1}\expandafter\tens@i#2\relax}
\def\tens@i#1#2{\edef\tens@t{#1}%
\ifx\tens@t\tens@u
\expandafter\tens@U#2
\else
\ifx\tens@t\tens@l
\expandafter\tens@L#2
\else
#1#2
\fi
\fi}
\def\tens#1#2{#1\expandafter\tens@i#2}
\makeatother
\begin{document}
\begin{tabular}{rl}
works: &
$\tens{\Gamma}[\mu](\nu\rho)[\alpha](\nu\rho) \dot\tens{x}(\alpha)
\dot\tens{x}(\beta)$ \\[2em]

does not work: & 
$\tens{\Gamma}[\mu](\nu\rho)[\alpha](\nu\rho) \dot\tens{x}(\alpha)
\tens{x}(\beta)$ \\[2em]

relax and it works again: &
$\tens{\Gamma}[\mu](\nu\rho)[\alpha](\nu\rho) \dot\tens{x}(\alpha)\relax
\tens{x}(\beta)$ \\
\end{tabular}
\end{document}

在此处输入图片描述

需要明确的是:此类宏主要用于娱乐目的,而不是用于现实世界。如今,LaTeX 世界有足够多的其他问题……

答案4

使用 TeX 原语的所需宏的定义\tens如下:

\def\tens#1{#1\futurelet\next\tensA}
\def\tensA{\def\tensX{}%
   \ifx\next[\def\tensX[##1]{{}_{##1}\futurelet\next\tensA}\fi 
   \ifx\next\bgroup \def\tensX##1{{}^{##1}\futurelet\next\tensA}\fi
   \tensX}

%% test:

$\tens\Gamma [\mu]{\nu\rho}[\alpha]{\nu\rho}$

$\ddot\tens{x}{\mu} = \tens{\Gamma}{\mu}[\alpha][\beta] 
                      \dot\tens{x}{\alpha} \dot\tens{x}{\beta}$

相关内容