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 \ce
Paketbefehl mhchem
ganz 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 \ce
besteht darin, die Zahlen als Index zu übertragen.
Ich möchte \phydimen
automatisch erkennen, wenn eine (positive oder negative) Ganzzahl im Argument vorkommt und diese „potenzieren“. Außerdem \phydimen
sollte 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.
Antwort2
Hier führe ich listofitems
ein zweistufiges Parsing durch, wobei ich auf der ersten Ebene nach Ziffern und negative
auf 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}
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 \ce
innerhalb 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.