Ausdrucksstarkes Makro für Tensoren; erhöhte und gesenkte Indizes

Nov 27 2020

Hat jemand eine zufriedenstellende Lösung für das Problem des Satzens von Tensoren mit erhöhten / abgesenkten Indizes? Zum Beispiel kann ich die folgende Gleichung schreiben:\ddot x^\mu = \Gamma^{\mu}{}_{\alpha}{}_{\beta} \dot x^\alpha \dot x^\beta

Wenn Sie viele Tensoren schreiben, ist dies umständlich.

Was ich suche, ist eine Möglichkeit, einen Befehl zu konstruieren, der Tensoren wie \Gammaoben mit ausdrucksstärkerer Syntax erzeugen kann . Ein Befehl \tens, der so funktioniert, wäre beispielsweise ideal:

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

Die Schlüsselqualität meiner gewünschten Syntax besteht darin, dass es eine beliebige Anzahl von Argumenten zweier unterschiedlicher Typen gibt . Eingeschlossene Argumente { }sind erhöhte Indizes, während eingeschlossene Argumente [ ]abgesenkte Indizes sind. Ich brauche keinen Befehl, der genau so aussieht . Ich suche etwas, das ähnlich ausdrucksstark ist.

Hat jemand eine Lösung für dieses Problem? Eine Implementierung eines \tensBefehls, der wie oben funktioniert? Ich weiß nicht, wie ich das machen soll.

Antworten

6 egreg Nov 27 2020 at 20:17

Meiner Meinung nach sind die Tief- und Hoch sind ein einziges Argument.

Sie können das tensorPaket verwenden, ohne das Rad neu zu erfinden: Es hat eine sehr praktische Syntax.

Ich gebe auch einen \tensBefehl nach Ihren Wünschen.

\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

Ich würde eine solche Syntax nicht verwenden, aber SemanTeX kann so eingerichtet werden, dass etwas Ähnliches erreicht wird (Haftungsausschluss: Ich bin der Autor). Beachten Sie, dass Sie ein aktuelles Update von SemanTeX benötigen (Oktober oder später, glaube ich), damit dieses Beispiel funktioniert. Beachten Sie, dass ich auch lieber Schlüssel definiere dotund ddotanstatt die Befehle \dotund direkt zu verwenden \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}


Persönlich würde ich es vorziehen, eine mehr auf Schlüsselwerten basierende Syntax zu verwenden, wie unten:

\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

Hier ist etwas, das so funktioniert, wie Sie es beschreiben, aber mit runden Klammern anstelle von lockigen. Wie üblich können solche Dinge etwas zerbrechlich sein, daher müssen Sie gelegentlich \relaxein wenig, um zu markieren, dass sie vollständig funktionieren, wie im zweiten Beispiel zu sehen ist.

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

Um es klar auszudrücken: Solche Makros dienen hauptsächlich Erholungszwecken und nicht der realen Welt. In diesen Tagen hat die LaTeX-Welt genug andere Probleme ...

1 wipet Nov 30 2020 at 22:04

Die Definition Ihres gewünschten Makros \tensmithilfe von TeX-Grundelementen lautet wie folgt:

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