再会!
我搜索了整个 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}
结果:
也许,这不是最好的解决方案,我确实认为它对于所提出的问题来说并不有效,但这是有用的经验!