Erstellen eines Befehls für die physikalische Dimension - Zeichen für Zeichen analysieren

Erstellen eines Befehls für die physikalische Dimension - Zeichen für Zeichen analysieren

Ich wünsche mir einen eigenen Befehl zum Drucken physikalischer Abmessungen. So etwas wie \phydimen{M2L-3T-1}. Dies sollte dasselbe Ergebnis wie ergeben $\textrm{M}^2\textrm{L}^{-3}\textrm{T}^{-1}$.

Ich finde, dass der \cePaketbefehl mhchemganz gut geeignet ist. Also hacke ich ihn so, dass er funktioniert, \newcommand{\phydimen}[1]{\ce{#1}}und gebe dann einen Befehl \phydimen{ML^2T^{-2}}zum Drucken der Dimension ein. Allerdings muss ich immer noch das lästige ^und verwenden { }. Das Standardverhalten \cebesteht darin, die Zahlen als Index zu übertragen.

Ich möchte \phydimenautomatisch erkennen, wenn eine (positive oder negative) Ganzzahl im Argument vorkommt und diese „potenzieren“. Außerdem \phydimensollte es mehr Zeichen als M, L, T akzeptieren können. Außerdem sollte es Kleinbuchstaben automatisch in Großbuchstaben umwandeln.

Wie analysiere ich die Argumente Zeichen für Zeichen und entscheide, ob es sich um einen Buchstaben oder eine positive oder negative Ganzzahl handelt?

MWE:

\documentclass{article}
\usepackage{mhchem}

\newcommand{\phydimen}[1]{\ce{#1}}
\begin{document}
    $\textrm{M}^2\textrm{L}^{-3}\textrm{T}^{-1}$ 

    \phydimen{ML^2T^{-2}} % instead I want \phydimen{ML2T-2}
\end{document}

Antwort1

Sie können reguläre Ausdrücke verwenden:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\phydimen}{m}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \regex_replace_all:nnN { (\-?\d+) } { \cU\^\cB\{\1\cE\} } \l_tmpa_tl
  \ensuremath { \mathrm { \tl_use:N \l_tmpa_tl } }
 }

\ExplSyntaxOff

\begin{document}

\phydimen{ML2T-2}

\end{document}

Der Suchausdruck entspricht einer möglicherweise vorzeichenbehafteten Ganzzahl, der Ersetzungsausdruck gibt „hochgestelltes Zeichen, linke Klammer, die Übereinstimmung, rechte Klammer“ an.

Bildbeschreibung hier eingeben

Antwort2

Hier führe ich listofitemsein zweistufiges Parsing durch, wobei ich auf der ersten Ebene nach Ziffern und negativeauf der zweiten Ebene nach dem Vorzeichen suche.

\documentclass{article}
\usepackage{listofitems}
\newcommand\phydimen[1]{%
  \setsepchar{0||1||2||3||4||5||6||7||8||9/-}%
  \greadlist\Dim{#1}%
  \foreachitem\i\in\Dim{%
    \textrm{\Dim[\icnt,1]}\ensuremath{^{\Dimsep[\icnt,1]\Dimsep[\icnt]}}}%
}
\begin{document}
\phydimen{ML2T-2}
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Das Parsen von Buchstabe zu Buchstabe ist in LaTeX eine komplizierte Angelegenheit. Sie können mhchem.sty öffnen und nachschauen, wie das gemacht wird. Oder sehen SieGrundlagen des ParsensoderWie kann ich das erste Wort in einem Token-Stream Token für Token analysieren?.

Ich würde nicht empfehlen, es \ceinnerhalb Ihres Befehls zu verwenden. Es macht viel mehr, als nur die Schriftart zu ändern. Es würde die Eingabe doppelt analysieren, was meiner Meinung nach nicht effizient ist.

Der Befehl, den Sie erstellen möchten, existiert bereits in mhchem für MathJax. Warum er für LaTeX nicht existiert, wird in der Frage erklärtWie verwende ich den Befehl „MathJax mhchem \pu{}“ in LaTex?, einschließlich Gründen, stattdessen einen anderen Befehl zu verwenden.

verwandte Informationen