Construyendo un comando para la dimensión física: analizando carácter por carácter

Construyendo un comando para la dimensión física: analizando carácter por carácter

Deseo tener un comando dedicado para imprimir la dimensión física. Algo como \phydimen{M2L-3T-1}. Esto debería generar el mismo resultado que $\textrm{M}^2\textrm{L}^{-3}\textrm{T}^{-1}$.

Creo que el \cecomando de mhchempaquete es bastante adecuado. Así que lo pirateo \newcommand{\phydimen}[1]{\ce{#1}}y luego emito un comando \phydimen{ML^2T^{-2}}para imprimir la dimensión. Sin embargo, todavía tengo que usar el molesto ^y { }. El comportamiento predeterminado \cees enviar los números como subíndice.

Quiero \phydimendetectar automáticamente cuándo hay un número entero (positivo o negativo) en el argumento y llevarlo al "poder". También \phydimendebería poder aceptar más caracteres que M,L,T. Además, si se proporcionan minúsculas, debería convertirlas automáticamente a mayúsculas.

¿Cómo analizo los argumentos carácter por carácter y decido si es una letra, un entero positivo o un entero negativo?

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}

Respuesta1

Puedes usar expresiones regulares:

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

La expresión de búsqueda coincide con un entero posiblemente con signo, la expresión de reemplazo especifica "carácter de superíndice, llave izquierda, la coincidencia, llave derecha".

ingrese la descripción de la imagen aquí

Respuesta2

Aquí suelo listofitemsrealizar un análisis de 2 niveles, buscando dígitos en el primer nivel y el negativesigno en el segundo nivel.

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

ingrese la descripción de la imagen aquí

Respuesta3

Analizar letra por letra es algo complicado en LaTeX. Podrías abrir mhchem.sty y ver cómo se hace. o verConceptos básicos del análisiso¿Cómo puedo analizar la primera palabra en una secuencia de tokens, token por token?.

No recomendaría usarlo \cedentro de su comando. Hace muchas más cosas que simplemente cambiar la fuente. Analizaría dos veces la entrada, creo que esto no será eficiente.

El comando que desea crear ya existe en mhchem para MathJax. En la pregunta se explica por qué no existe para LaTeX.¿Cómo utilizar el comando `MathJax mhchem \pu{}` en LaTex?, incluidas las razones para utilizar otro comando en su lugar.

información relacionada