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 \ce
comando de mhchem
paquete 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 \ce
es enviar los números como subíndice.
Quiero \phydimen
detectar automáticamente cuándo hay un número entero (positivo o negativo) en el argumento y llevarlo al "poder". También \phydimen
deberí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".
Respuesta2
Aquí suelo listofitems
realizar un análisis de 2 niveles, buscando dígitos en el primer nivel y el negative
signo 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}
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 \ce
dentro 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.