Ekspresyjne makro dla tensorów; podniesione i obniżone indeksy
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 \Gamma
powyżej, z bardziej wyrazistą składnią. Na przykład polecenie \tens
dział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 \tens
polecenia, które działa jak powyżej? Nie wiem, jak to zrobić.
Odpowiedzi
Moim zdaniem indeksy dolne i górne to jeden argument.
Możesz używać tensor
pakietu bez ponownego odkrywania koła: ma bardzo przydatną składnię.
Wykonuję również \tens
polecenie 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}

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 dot
i ddot
zamiast bezpośrednio używać poleceń \dot
i \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}

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 \relax
trochę 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 ...
Definicja żądanego makra \tens
przy 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}$