Ich verwende pdfLaTeX und möchtealleVektoren setze ich in fetter, aufrechter Schrift. Leider sind, je nachdem, ob das Symbol lateinisch, kleingriechisch oder großgriechisch ist, unterschiedliche Befehle erforderlich, um es fett und aufrecht zu machen. Ich möchte in der Lage sein, ein einzelnes Makro zu definieren – sagen wir \vector
–, das unabhängig vom Argument das tut, was ich will, und ich nicht darüber nachdenken muss:
\vector{a} => \mathbf{a}
\vector{\alpha} => \boldsymbol{\upalpha}
\vector{\Omega} => \boldsymbol{\Omega}
Diese beliebte Fragebefasst sich mitmanchedieses Problems, aber die Lösungen dort haben immer noch die griechischen Vektoren in Kleinbuchstaben in fetter Kursivschrift, nicht in fetter Hochschrift. Viele andere Fragen berühren dieses Problem auf verschiedene Weise, aber ich konnte keine endgültige Antwort auf genau diese Variante finden. Vielleicht lautet die Antwort „das geht nicht“ – aber das habe ich auch nicht definitiv gesehen.
–
Bearbeitet \Alpha
, das nicht existiert, in \Omega
.
Antwort1
Eine Modifikation meiner Antwort aufAutomatisch prüfen, ob ein mathematisches Zeichen griechisch oder lateinisch istsollte tun:
\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}
Was bedeutet " \commexo_makeboldupright:n
do"? Es nimmt die Eingabe, also "say" \alpha
, entfernt den Backslash aus dem Namen \cs_to_str:N
und erstellt die Steuersequenz \upalpha
über \use:c
": "say" \use:c{upalpha}
ist gleichbedeutend mit "type" \upalpha
.
Antwort2
Da es für andere von Nutzen sein könnte, erwähne ich die Lösung, die ich derzeit verwende: In einem Dokument mit vielen griechischen Vektoren ändere ich die Dokumentschriftart von Computer Modern zu Charter und verwende das isomath
Paket, sodass \mathbf
es bei griechischen Zeichen wie erwartet funktioniert:
\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}
Ich habe die Frage gepostet, weil ich Computer Modern Charter vorziehe, aber da die Lösung in Computer Modern anscheinend zumindest ziemlich kompliziert ist, findet vielleicht jemand anders diese vergleichsweise einfachere Lösung nützlich.