数式モードで条件付き直立太字ギリシャ文字

数式モードで条件付き直立太字ギリシャ文字

良い一日!

私はstackechange全体をグーグルで検索しましたが、答えを見つけることができませんでした。私はLatexにかなり慣れていないので、私のアプローチは適切ではありません。ギリシャ文字を次のようにフォーマットするマクロを定義しようとしています。直立した大胆ないくつか方法があることは知っていますが、等値の使用を避けて、ギリシャ語パッケージ。

書けるようになりたい

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

どちらの場合も、直立した太字の文字が表示されます。以下は私のコードです。

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

制御シーケンスの最初の文字を取得しようとしています。大文字の場合は変更せずに呼び出しますが\boldsymbol、そうでない場合は先頭に配置することで制御シーケンスを変更したいです\up。そうすると、次のエラーが発生します。

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

「if」条件は常に false を返すようです。つまり、「P」は大文字として認識されないため、次の MWE では「小文字」が 2 回書き込まれます。

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

なぜ期待通りに動作しないのか、誰か教えてもらえませんか?

答え1

bmそれ以上の再定義なしで、必要な操作を実行できるのではないでしょうか?

ここに画像の説明を入力してください

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


\begin{document}

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

\end{document}

答え2

David Carlisle に心から感謝します!

キャットコードに関するまさに正しい考えでした。経験不足のため、キャットコードについては全く知りませんでした。私も試してみたところ、混乱しました。ツールボックス通常(catcode 11) とトークン解除(catcode 12)\ifstrequalを比較する関数が機能しました。その後、ツールボックスのソース コードを調べてみたところ、両方のオペランドに適用されていることが分かりました。そこで、マクロを同様の方法で変更したところ、期待どおりに動作するようになりました。PP\detokenize

大きい:

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

結果: ここに画像の説明を入力してください

おそらく、これは最善の解決策ではないし、提起された問題に対して効率的ではないと思いますが、有益な経験でした。

関連情報