Ausdrucksstarkes Makro für Tensoren; erhöhte und gesenkte Indizes
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 \Gamma
oben 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 \tens
Befehls, der wie oben funktioniert? Ich weiß nicht, wie ich das machen soll.
Antworten
Meiner Meinung nach sind die Tief- und Hoch sind ein einziges Argument.
Sie können das tensor
Paket verwenden, ohne das Rad neu zu erfinden: Es hat eine sehr praktische Syntax.
Ich gebe auch einen \tens
Befehl 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}

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 dot
und ddot
anstatt die Befehle \dot
und 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}

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 \relax
ein 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 ...
Die Definition Ihres gewünschten Makros \tens
mithilfe 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}$