
내 질문은 다음과 비슷합니다굵은 수학: 라틴어와 그리스어 기호에 대해 \mathbf와 \boldsymbol 사이의 자동 선택?, 그러나 약간 다릅니다. 컴파일할 수 없는 최소한의 예는 다음과 같습니다.
\documentclass{book}
\usepackage{amssymb}
\newcommand{\tensor}[1]{if latin alphabet \mathbb{#1} else \mathbf{#1}}
\begin{document}
$\tensor{A}$ $\tensor{\Lambda}$
\end{document}
제안된 내용이 달성 가능합니까? 아래 예를 통해 현재 pdflatex를 사용하는 경우 라틴어와 그리스어 수학 알파벳 사이에 효율적인 전환이 없다는 것을 이해합니다. 또한 한 가지 해결책은 라틴어와 그리스어 알파벳이 다르게 처리되는 lualatex로 전환하는 것임을 이해합니다.
답변1
글꼴 이 없어서 mtpro2
다른 글꼴을 사용하겠습니다.
라틴 문자는 그 자체(즉, 문자)로 호출되는 반면 그리스 문자는 제어 시퀀스로 호출된다는 아이디어입니다. 그래서
\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}
한정.하나의 토큰만 에 인수로 제공되어야 합니다 \tensor
. \tensor{AB}
또는 \tensor{A\Lambda}
여러 토큰 변형 중 하나가 실패합니다 .
동일한 아이디어를 기반으로 한 멀티토큰 매크로:
\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}
물론 임의의 입력을 사용하면 여전히 실패합니다.
알 수 없는 토큰에 대한 대체 기능을 갖춘 더욱 강력한 버전일 수 있습니다.
\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}
답변2
좀 더 유연한 것을 원한다면 아마도 이것이 미래에 유용할 수 있습니다.
\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}