
Я использую 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, по меньшей мере, довольно сложное, возможно, кто-то другой найдет это сравнительно простое решение полезным.