Grego em negrito vertical com condição no modo matemático

Grego em negrito vertical com condição no modo matemático

Bom dia!

Pesquisei todo o stackechange no Google, mas não consegui encontrar a resposta. Sou muito novo no Latex, então minha abordagem não é adequada. Tento definir uma macro, que deve formatar a letra grega comovertical em negrito. Eu sei que existem várias maneiras de fazer isso, gostaria de evitar o uso de isomata e seguirgregopacote.

Eu quero poder escrever

\gb{\alpha}
\gb{\Alpha}

e em ambos os casos obtenha caracteres verticais em negrito. Então, aqui está meu código interno:

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

Estou tentando pegar o primeiro caractere da sequência de controle e se for maiúsculo, chamo apenas \boldsymbolsem modificações, caso contrário quero modificar a sequência de controle colocando \upno início. Então, quando faço isso, produz o seguinte erro

! Undefined control sequence.
\bm@command ->\upPsi

Parece que a condição "se" sempre dá falso, ou seja, "P" não é reconhecido como maiúsculo, portanto o seguinte MWE escreverá duas vezes "minúsculo":

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

Alguém pode me dar uma ideia, por que não funciona como esperado?

Responder1

Não bmbasta fazer o que quiser sem maiores redefinições?

insira a descrição da imagem aqui

\documentclass{article}
\usepackage{bm,upgreek}


\begin{document}

\begin{equation}
    \psi, \uppsi, \Psi,\bm{\psi},\bm{\uppsi},\bm{\Psi}
\end{equation}

\end{document}

Responder2

Muito obrigado a David Carlisle!

Foi uma ideia exatamente correta sobre catcodes. Por falta de experiência, não tinha ideia sobre catcodes. Fazendo minhas tentativas eu também fiquei confuso, quando tenteietoolboxfunção \ifstrequalpara comparar normal P(catcode 11) e destokenizado P(catcode 12) e funcionou! Depois resolvi dar uma olhada dentro do código fonte da caixa de ferramentas e encontrei lá \detokenizeaplicado aos dois operandos. Então modifiquei minha macro de maneira semelhante, e agora funciona conforme o esperado.

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: insira a descrição da imagem aqui

Talvez não seja a melhor solução e acredito que não seja eficiente para o problema colocado, mas foi uma experiência útil!

informação relacionada