Automatisch prüfen, ob ein mathematisches Zeichen griechisch oder lateinisch ist

Automatisch prüfen, ob ein mathematisches Zeichen griechisch oder lateinisch ist

Meine Frage ist ähnlich wieBold math: Automatische Auswahl zwischen \mathbf und \boldsymbol für lateinische und griechische Symbole?, aber etwas anders. Mein nicht kompilierbares Minimalbeispiel ist das folgende:

\documentclass{book}
\usepackage{amssymb}
\newcommand{\tensor}[1]{if latin alphabet \mathbb{#1} else \mathbf{#1}}
\begin{document}
$\tensor{A}$ $\tensor{\Lambda}$
\end{document}

Ist das, was vorgeschlagen wird, umsetzbar? Aus dem folgenden Beispiel verstehe ich, dass es derzeit keinen effizienten Wechsel zwischen lateinischem und griechischem mathematischem Alphabet gibt, wenn man pdflatex verwendet. Ich verstehe auch, dass eine Lösung darin bestehen würde, auf lualatex umzusteigen, wo lateinisches und griechisches Alphabet unterschiedlich behandelt werden.

Antwort1

Ich habe die Schriftarten nicht mtpro2, deshalb wähle ich eine andere Schriftart aus.

Die Idee ist, dass lateinische Buchstaben durch sich selbst (also Zeichen) aufgerufen werden, während griechische Buchstaben durch Steuersequenzen aufgerufen werden.

\documentclass{article}
\usepackage{bm}
\newcommand\tensor[1]{%
  \ifcat\noexpand#1\relax % check if the argument is a control sequence
    \bm{#1}% probably Greek
  \else
    \textsf{#1}% single character
  \fi
}

\begin{document}
$\tensor{X}\tensor{\Lambda}$
\end{document}

Bildbeschreibung hier eingeben

Einschränkung.Als Argument darf nur ein Token angegeben werden \tensor. Entweder \tensor{AB}oder \tensor{A\Lambda}oder jede Variante mit mehreren Token würde fehlschlagen.


Ein Multitoken-Makro, das auf derselben Idee basiert:

\documentclass{article}
\usepackage{xparse}
\usepackage{bm}

\ExplSyntaxOn
\NewDocumentCommand\tensor{m}
 {
  \pluton_tensor:n { #1 }
 }

\cs_new_protected:Npn \pluton_tensor:n #1
 {
  \tl_map_inline:nn { #1 }
   {
    \token_if_cs:NTF ##1 { \bm { ##1 } } { \textsf { ##1 } }
   }
 }
\ExplSyntaxOff
\begin{document}
$\tensor{X}\tensor{\Lambda}$

$\tensor{X\Lambda}$
\end{document}

Natürlich schlägt dies immer noch fehl, wenn beliebige Eingaben verwendet werden.

Eine möglicherweise robustere Version mit einem Fallback für unbekannte Token.

\documentclass{article}
\usepackage{xparse}
\usepackage{bm}

\ExplSyntaxOn
\NewDocumentCommand\tensor{m}
 {
  \pluton_tensor:n { #1 }
 }

\cs_new_protected:Npn \pluton_tensor:n #1
 {
  \tl_map_inline:nn { #1 }
   {
    \pluton_tensor_inner:n { ##1 }
   }
 }

\cs_new_protected:Npn \pluton_tensor_inner:n #1
 {
  \tl_if_in:VnTF \g_pluton_latin_tl { #1 }
   {
    \textsf { #1 } % a Latin letter
   }
   {
    \tl_if_in:VnTF \g_pluton_greek_tl { #1 }
     {
      \bm { #1 } % a Greek letter
     }
     {
      #1 % fall back
     }
   }
 }

\tl_new:N \g_pluton_latin_tl
\tl_new:N \g_pluton_greek_tl
\tl_gset:Nn \g_pluton_latin_tl
 {
  ABCDEFGHIJKLMNOPQRSTUVWXYZ
  abcdefghijklmnopqrstuvwxyz
 }
\tl_gset:Nn \g_pluton_greek_tl
 {
  \Gamma\Delta\Theta\Lambda\Pi\Sigma\Upsilon\Phi\Chi\Psi\Omega
 }

\ExplSyntaxOff
\begin{document}
$\tensor{X}\tensor{\Lambda}$

$\tensor{X\Lambda}$
\end{document}

Antwort2

Wenn Sie etwas Flexibleres wünschen, könnte dies in Zukunft vielleicht von Nutzen sein:

\documentclass{book}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\keys_define:nn { pluton / tensor } {
  latin          .tl_set:N = \pluton_tensor_latin_tl,
  greek          .tl_set:N = \pluton_tensor_greek_tl,
  latin-alphabet .tl_set:N = \pluton_tensor_latin_alphabet_tl,
  greek-alphabet .tl_set:N = \pluton_tensor_greek_alphabet_tl,
}
\cs_new:Nn \pluton_tensor:n {
  \tl_if_in:NnTF \pluton_tensor_latin_alphabet_tl { #1 } {
    \pluton_tensor_latin_tl { #1 }
  } {
    \tl_if_in:NnT \pluton_tensor_greek_alphabet_tl { #1 } {
      \pluton_tensor_greek_tl { #1 }
    }
  }
}
\NewDocumentCommand \tensor { O{} m } {
  \group_begin:
  \keys_set:nn { pluton / tensor } {
    latin-alphabet = abcdefhijklmnopqrstuvwxyz
                     ABCDEFHIJKLMNOPQRSTUVWXYZ,
    greek-alphabet = \alpha\beta\delta\epsilon
                     \phi\gamma\eta\iota\theta
                     \kappa\lambda\mu\nu\pi\chi
                     \rho\sigma\tau\omega\xi\psi\xi
                     \Alpha\Beta\Delta\Epsilon  % capitals; some of
                     \Phi\Gamma\Eta\Iota\Theta  % these *definitely*
                     \Kappa\Lambda\Mu\Nu\Pi\Chi % aren't defined, but
                     \Rho\Sigma\Tau\Omega\Xi\Psi\Xi, % emacs helps :)
    latin = \mathbf,
    greek = \mathrm,
    #1
  }
  \pluton_tensor:n { #2 }
  \group_end:
}
\ExplSyntaxOff
\begin{document}
$\tensor{A}$ $\tensor{\Lambda}$
\end{document}

verwandte Informationen