Comprueba automáticamente si un carácter matemático es griego o latino

Comprueba automáticamente si un carácter matemático es griego o latino

Mi pregunta es similar aMatemáticas en negrita: ¿Elección automática entre \mathbf y \boldsymbol para símbolos latinos y griegos?, pero ligeramente diferente. Mi ejemplo mínimo no compilable es el siguiente:

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

¿Es alcanzable lo que se sugiere? Del siguiente ejemplo, entiendo que no existe un cambio eficiente en este momento entre los alfabetos matemáticos latino y griego si se usa pdflatex. También entiendo que una solución sería cambiar a lualatex, donde los alfabetos latino y griego se manejan de manera diferente.

Respuesta1

No tengo las mtpro2fuentes, así que usaré una selección de fuentes diferente.

La idea es que las letras latinas se llamen por sí mismas (es decir, caracteres), mientras que las letras griegas se llamen mediante secuencias de control. Entonces

\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}

ingrese la descripción de la imagen aquí

Limitación.Sólo se debe dar un token como argumento \tensor. Cualquiera \tensor{AB}de \tensor{A\Lambda}las variaciones de tokens múltiples del mismo fallaría.


Una macro multitoken basada en la misma idea:

\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}

Por supuesto, esto seguirá fallando si se utilizan entradas arbitrarias.

Una versión quizás más robusta, con respaldo para tokens desconocidos.

\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}

Respuesta2

Si desea algo más flexible, quizás esto pueda resultarle útil en el futuro:

\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}

información relacionada