
良い一日!
私は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
を比較する関数が機能しました。その後、ツールボックスのソース コードを調べてみたところ、両方のオペランドに適用されていることが分かりました。そこで、マクロを同様の方法で変更したところ、期待どおりに動作するようになりました。P
P
\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}
結果:
おそらく、これは最善の解決策ではないし、提起された問題に対して効率的ではないと思いますが、有益な経験でした。