数学模式下带条件的直立粗体希腊字母

数学模式下带条件的直立粗体希腊字母

再会!

我搜索了整个 stackechange,但找不到答案。我对 Latex 还很陌生,所以我的方法不太合适。我尝试定义一个宏,它应该将希腊字母格式化为直立粗体。我知道有几种方法可以做到这一点,我想避免使用 isomath 并坚持使用上希腊语包裹。

我希望能够写作

\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”条件总是给出错误,即“P”不被识别为大写,因此以下 MWE 将会写两次“小写”:

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

这是关于 catcodes 的完全正确的想法。由于缺乏经验,我对 catcodes 一无所知。尝试时我也感到困惑,当我尝试电子工具箱函数\ifstrequal比较正常P(catcode 11)和去标记化P(catcode 12),它成功了!我决定查看工具箱的源代码,发现它\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}

结果: 在此处输入图片描述

也许,这不是最好的解决方案,我确实认为它对于所提出的问题来说并不有效,但这是有用的经验!

相关内容