Griego vertical en negrita con condición en modo matemático

Griego vertical en negrita con condición en modo matemático

¡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 \boldsymbolsin modificaciones; de lo contrario, quiero modificar la secuencia de control colocándola \upal 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 bmhaces simplemente lo que quieres sin más redefiniciones?

ingrese la descripción de la imagen aquí

\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 \ifstrequalpara 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 \detokenizese 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: ingrese la descripción de la imagen aquí

Quizás no sea la mejor solución y creo que no es eficiente para el problema planteado, ¡pero fue una experiencia útil!

información relacionada