
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 \boldsymbol
sem modificações, caso contrário quero modificar a sequência de controle colocando \up
no 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 bm
basta fazer o que quiser sem maiores redefinições?
\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 \ifstrequal
para 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á \detokenize
aplicado 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:
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!