Ekspresyjne makro dla tensorów; podniesione i obniżone indeksy

Nov 27 2020

Czy ktoś ma satysfakcjonujące rozwiązanie problemu składu tensorów z podniesionymi / obniżonymi indeksami? Na przykład mogę napisać następujące równanie:\ddot x^\mu = \Gamma^{\mu}{}_{\alpha}{}_{\beta} \dot x^\alpha \dot x^\beta

Podczas pisania wielu tensorów jest to kłopotliwe.

To, czego szukam, to sposób na skonstruowanie polecenia, które może wytwarzać tensory, takie jak \Gammapowyżej, z bardziej wyrazistą składnią. Na przykład polecenie \tensdziałające w ten sposób byłoby idealne:

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

Kluczową cechą mojej pożądanej składni jest to, że istnieje dowolna liczba argumentów dwóch różnych typów . Argumenty zawarte w { }są podniesione indeksy, podczas gdy argumenty zamknięte w [ ]są indeksami obniżonymi. Nie potrzebuję polecenia, które wygląda dokładnie tak; Szukam czegoś równie wyrazistego.

Czy ktoś ma rozwiązanie tego problemu? Implementacja \tenspolecenia, które działa jak powyżej? Nie wiem, jak to zrobić.

Odpowiedzi

6 egreg Nov 27 2020 at 20:17

Moim zdaniem indeksy dolne i górne to jeden argument.

Możesz używać tensorpakietu bez ponownego odkrywania koła: ma bardzo przydatną składnię.

Wykonuję również \tenspolecenie według twoich preferencji.

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

5 Gaussler Nov 27 2020 at 18:23

Nie użyłbym takiej składni, ale SemanTeX można skonfigurować tak, aby osiągnąć coś podobnego (zastrzeżenie: jestem autorem). Zauważ, że będziesz potrzebować najnowszej aktualizacji SemanTeX (myślę, że październik lub później), aby ten przykład działał. Zauważ, że wolę również definiować klawisze doti ddotzamiast bezpośrednio używać poleceń \doti \ddot.

\documentclass{article}

\usepackage{semantex}

\NewVariableClass\tens[
    output=\tens,
    definekeys={
        {dot}{ command=\dot },
        {ddot}{ command=\ddot },
        {preindex}{ rightreturn, symbolputright={{}} },
        {postindex}{ rightreturn, symbolputright=\kern-\scriptspace },
    },
    definekeys[1]={
        {default}{ preindex, lower={#1}, postindex },
        {arg}{ preindex, upper={#1}, postindex },
    },
]

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


Osobiście wolałbym użyć składni bardziej opartej na wartościach klawiszy, jak poniżej:

\documentclass{article}

\usepackage{semantex}

\NewVariableClass\Tensor[
    output=\Tensor,
    definekeys={
        {dot}{ command=\dot },
        {ddot}{ command=\ddot },
        {preindex}{ rightreturn, symbolputright={{}} },
        {postindex}{ rightreturn, symbolputright=\kern-\scriptspace },
    },
    definekeys[1]={
        {up}{ preindex, upper={#1}, postindex },
        {low}{ preindex, lower={#1}, postindex },
    },
]

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

2 Noname Nov 27 2020 at 10:41

Oto coś, co działa tak, jak opisujesz, ale z okrągłymi nawiasami zamiast nawiasów klamrowych. Jak zwykle takie rzeczy mogą być trochę kruche, więc czasami trzeba \relaxtrochę oznaczyć, że działa, jak widać na drugim przykładzie.

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

Dla jasności: takie makra służą głównie do celów rekreacyjnych, a nie do rzeczywistego świata. W dzisiejszych czasach świat LaTeX ma wystarczająco dużo innych problemów ...

1 wipet Nov 30 2020 at 22:04

Definicja żądanego makra \tensprzy użyciu prymitywów TeX jest następująca:

\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}$