
¡Buen día!
Busqué en Google todo el cambio de pila, pero no pude encontrar la respuesta. Soy bastante nuevo en Latex, por lo que mi enfoque no es el adecuado. Intento definir una macro que debería formatear la letra griega comovertical negrita. Sé que hay varias formas de hacerlo, me gustaría evitar el uso de isomath y ceñirme agriegopaquete.
quiero poder escribir
\gb{\alpha}
\gb{\Alpha}
y en ambos casos se obtienen caracteres verticales en negrita. Entonces, aquí está mi código adentro:
\newcommand{\gb}[1]{ % Imagine #1=\Psi
\StrGobbleLeft{\detokenize{#1}}{1}[\chrcodet] % variable "\Psi"
\StrGobbleRight{\chrcodet}{1}[\chrcode] % variable "Psi"
\StrLeft{\chrcode}{1}[\chrfirst] % first character "P"
\IfSubStr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\chrfirst} % Is it capital?
{\boldsymbol{#1}} % Yes - no modification
{\boldsymbol{\csname up\chrcode\endcsname}} % No - glue \up+Psi (that what happens!)
}
Estoy tratando de obtener el primer carácter de la secuencia de control y si está en mayúscula, lo llamo \boldsymbol
sin modificaciones; de lo contrario, quiero modificar la secuencia de control colocándola \up
al principio. Entonces, cuando hago eso, produce el siguiente error
! Undefined control sequence.
\bm@command ->\upPsi
Parece que la condición "si" siempre da falso, es decir, "P" no se reconoce como mayúscula, por lo que el siguiente MWE escribirá dos veces "minúscula":
\documentclass{article}
\usepackage{bm,upgreek}
\usepackage{etoolbox}
\usepackage{xstring}
\newcommand{\gb}[1]{
\StrGobbleLeft{\detokenize{#1}}{1}[\chrcodet]
\StrGobbleRight{\chrcodet}{1}[\chrcode]
\StrLeft{\chrcode}{1}[\chrfirst]
#1 - \IfSubStr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\chrfirst}{uppercase}{lowercase}
}
\begin{document}
\begin{equation}
\psi,\Psi,\gb{\psi},\gb{\Psi}
\end{equation}
\end{document}
¿Alguien puede darme una idea de por qué no funciona como se esperaba?
Respuesta1
¿No bm
haces simplemente lo que quieres sin más redefiniciones?
\documentclass{article}
\usepackage{bm,upgreek}
\begin{document}
\begin{equation}
\psi, \uppsi, \Psi,\bm{\psi},\bm{\uppsi},\bm{\Psi}
\end{equation}
\end{document}
Respuesta2
¡Muchas gracias a David Carlisle!
Era una idea exactamente correcta sobre los catcodes. Por falta de experiencia, no tenía idea de los catcodes. Al hacer mis intentos también me confundí, cuando lo intentécaja de herramientasFunción \ifstrequal
para comparar normal P
(código cat 11) y detokenizado P
(código cat 12) ¡y funcionó! Después decidí echar un vistazo al código fuente de la caja de herramientas y encontré que \detokenize
se aplicaba a ambos operandos. Así que modifiqué mi macro de manera similar, por lo que ahora funciona como se esperaba.
Macro:
\documentclass{article}
\usepackage{bm,upgreek}
\usepackage{etoolbox}
\usepackage{xstring}
\newcommand{\gb}[1]{
\StrGobbleLeft{\detokenize{#1}}{1}[\chrcode]
\StrGobbleRight{\chrcode}{1}[\chrcode]
\StrLeft{\chrcode}{1}[\chrfirst]
\edef\tempa{\detokenize{ABCDEFGHIJKLMNOPQRSTUVWXYZ}}
#1 - no\;detokenize: \IfSubStr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\chrfirst}{upper}{lower}, \,
detokenize\;both: \IfSubStr{\tempa}{\chrfirst}{upper}{lower}, \,
etoolbox: \expandafter\ifstrequal\expandafter{\chrfirst}{P}{upper}{lower}
}
\begin{document}
\begin{equation}
\gb{\psi}
\end{equation}
\begin{equation}
\gb{\Psi}
\end{equation}
\end{document}
Resultado:
Quizás no sea la mejor solución y creo que no es eficiente para el problema planteado, ¡pero fue una experiencia útil!