
В настоящее время я объединяю предложенные решенияздесьдля определения цикла команд издесьдля заглавной буквы, заставляющей определять математические обозначения в цикле.
Цель — создать сочетание клавиш для всех букв латинского и греческого алфавитов, выделенных жирным шрифтом и в верхнем/нижнем регистре.
Для латинского алфавита текущее решение работает нормально, но для греческого оно не сработает.
Итак, у меня на самом деле два вопроса:
- 1: Возможно ли автоматически перебирать греческие буквы с помощью pgffor, как и латинские буквы?
- 2: Есть ли причина, по которой мое текущее решение не работает с греческими буквами?
Как обычно, ответ может быть очень коротким или очень длинным, поэтому заранее спасибо.
\documentclass{article}
% Command forcing 1st letter of argument to be capital one
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand \firstcap { m } { \tl_mixed_case:n {#1} }
\ExplSyntaxOff
% Loop over latin alphabet (working)
\usepackage{pgffor}
\foreach \x in {a,...,z}{%
\expandafter\xdef\csname \firstcap{\x}mat\endcsname{\noexpand\ensuremath{\noexpand\mathbf{\firstcap{\x}}}}
}
\foreach \x in {a,...,z}{%
\expandafter\xdef\csname \firstcap{\x}vec\endcsname{\noexpand\ensuremath{\noexpand\mathbf{\x}}}
}
% Loop over greek alphabet (non working)
%\foreach \x in {alpha,zeta}{%
%\expandafter\xdef\csname \firstcap{\x}mat\endcsname{\noexpand\ensuremath{\noexpand\mathbf{\firstcap{\x}}}}
%}
%\foreach \x in {\alpha,...,\zeta}{%
%\expandafter\xdef\csname \firstcap{\x}vec\endcsname{\noexpand\ensuremath{\noexpand\mathbf{\x}}}
%}
\begin{document}
$\Amat \Bmat \Cmat \Avec \Bvec \Cvec$
%$\Alphamat \Betamat \Alphavec \Betavec$
\end{document}
решение1
Список нужно определить самому, но это одноразовая работа. Кроме того, определение \Alphamat
as \bm{\Alpha}
не даст ничего разумного, as \Alpha
не определено.
Я считаю, что проще использовать его напрямую, expl3
а не неудобно \foreach
с \csname
, \noexpand
и друзьями.
Как обычно, я опустил \ensuremath
это, это не имеет никакого смысла: \Amat
это команда для математического символа.
Я не совсем понимаю, в чем смысл команды \Avec
, которая печатает строчную букву «a» жирным шрифтом.
\documentclass{article}
\usepackage{amsmath,bm}
% Command forcing 1st letter of argument to be capital one
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \bamboo_define:nnnnN
{
\cs_new_protected:cpx { #1 #3 } { \exp_not:N #4{#5{#2}} }
}
\int_step_inline:nnn { `A } { `Z }
{
\bamboo_define:nnnnN
{ \char_generate:nn { #1 } { 11 } } % character
{ \char_generate:nn { #1 } { 11 } } % character
{ mat } % suffix
{ \mathbf } % decoration
\use:n % just the argument
}
\int_step_inline:nnn { `a } { `z }
{
\bamboo_define:nnnnN
{ \char_generate:nn { #1 -32 } { 11 } } % character
{ \char_generate:nn { #1 } { 11 } } % uppercase variant
{ vec } % suffix
{ \mathbf } % decoration
\use:n % just the argument
}
\clist_map_inline:nn
{
Gamma,Delta,Theta,Lambda,Xi,Pi,Sigma,Phi,Psi,Omega
}
{
\bamboo_define:nnnnN
{ #1 } % the Greek letter name with first uppercase
{ #1 } % the Greek letter name with first uppercase
{ mat } % suffix
{ \bm } % decoration
\use:c % make a control sequence
}
\clist_map_inline:nn
{
alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,
lambda,mu,nu,xi,pi,rho,sigma,tau,phi,chi,psi,omega
}
{
\bamboo_define:nnnnN
{ \tl_mixed_case:n { #1 } } % the Greek letter name with first uppercase
{ #1 } % the Greek letter name
{ vec } % suffix
{ \bm } % decoration
\use:c % make a control sequence
}
\ExplSyntaxOff
\begin{document}
$\Amat \Bmat \Cmat \Avec \Bvec \Cvec$
$\Gammamat \Deltamat \Alphavec \Betavec$
\end{document}
Учитывая все вышесказанное, я считаю, что вы потеряли больше времени на определении циклов, чем на определении всех команд вручную. ;-)
Но, конечно, академический интерес играет свою роль.
решение2
Пакетunicode-math
определяет их для вас в математическом режиме.