我正在使用 pdfLaTeX,我想要全部我排版的向量为粗体直立字体。不幸的是,根据符号是拉丁字母、小写希腊字母还是大写希腊字母,需要使用不同的命令才能使其粗体直立。我希望能够定义一个宏 — — 比如 — \vector
— 这样它无论参数是什么都能执行我想要的操作,而我不必考虑它:
\vector{a} => \mathbf{a}
\vector{\alpha} => \boldsymbol{\upalpha}
\vector{\Omega} => \boldsymbol{\Omega}
这个热门问题处理一些这个问题,但那里的解决方案仍然将小写希腊字母向量以粗体斜体表示,而不是以粗体直立表示。许多其他问题以各种方式涉及这个问题,但我无法找到针对这一确切变体的明确答案。也许答案是“你不能”——但我也没有看到明确的答案。
—将不存在的
编辑为。\Alpha
\Omega
答案1
我对以下问题的回答进行了修改自动检查数学字符是希腊字符还是拉丁字符应该做:
\documentclass{article}
\usepackage{xparse}
\usepackage{bm,upgreek}
\ExplSyntaxOn
\NewDocumentCommand\Vector{m}
{
\commexo_vector:n { #1 }
}
\cs_new_protected:Npn \commexo_vector:n #1
{
\tl_map_inline:nn { #1 }
{
\commexo_vector_inner:n { ##1 }
}
}
\cs_new_protected:Npn \commexo_vector_inner:n #1
{
\tl_if_in:VnTF \g_commexo_latin_tl { #1 }
{% we check whether the argument is a Latin letter
\mathbf { #1 } % a Latin letter
}
{% if not a Latin letter, we check if it's an uppercase Greek letter
\tl_if_in:VnTF \g_commexo_ucgreek_tl { #1 }
{
\bm { #1 } % a Greek uppercase letter
}
{% if not, we check if it's a lowercase Greek letter
\tl_if_in:VnTF \g_commexo_lcgreek_tl { #1 }
{
\commexo_makeboldupright:n { #1 }
}
{% none of the above, just issue #1
#1 % fall back
}
}
}
}
\cs_new_protected:Npn \commexo_makeboldupright:n #1
{
\bm { \use:c { up \cs_to_str:N #1 } }
}
\tl_new:N \g_commexo_latin_tl
\tl_new:N \g_commexo_ucgreek_tl
\tl_new:N \g_commexo_lcgreek_tl
\tl_gset:Nn \g_commexo_latin_tl
{
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
}
\tl_gset:Nn \g_commexo_ucgreek_tl
{
\Gamma\Delta\Theta\Lambda\Pi\Sigma\Upsilon\Phi\Chi\Psi\Omega
}
\tl_gset:Nn \g_commexo_lcgreek_tl
{
\alpha\beta\gamma\delta\epsilon\zeta\eta\theta\iota\kappa
\lambda\mu\nu\xi\pi\rho\sigma\tau\upsilon\phi\chi\psi\omega
\varepsilon\vartheta\varpi\varphi\varsigma\varrho
}
\ExplSyntaxOff
\begin{document}
$\Vector{X}\Vector{\Lambda}\Vector{\alpha}\Vector{\beta}$
$\Vector{X\Lambda}$
\end{document}
它做什么\commexo_makeboldupright:n
?它获取输入,比如说\alpha
,用 去掉名称中的反斜杠,并通过\cs_to_str:N
构建控制序列:说这相当于输入。\upalpha
\use:c
\use:c{upalpha}
\upalpha
答案2
由于它可能对其他人有益,我将提到我目前使用的解决方案:在包含大量希腊字母矢量的文档中,我将文档字体从 Computer Modern 切换为 Charter 并使用该isomath
包,这样就\mathbf
可以按预期对希腊字母进行工作:
\documentclass{article}
\usepackage[charter,cal=cmcal]{mathdesign}
\usepackage[OMLmathrm,OMLmathbf]{isomath}
\newcommand{\vect}[1]{\mathbf{#1}}
\begin{document}
$\a$, $\omega$, $\Omega$
$\vect a$, $\vect\omega$, $\vect\Omega$
\end{document}
我发布这个问题是因为我更喜欢《Computer Modern》而不是《Charter》,但由于《Computer Modern》中的解决方案显然至少相当复杂,也许其他人会发现这个相对简单的解决方案很有用。