在循环内动态创建和使用宏名称来重新定义小写希腊字母

在循环内动态创建和使用宏名称来重新定义小写希腊字母

这是这个。我的目标是让希腊字母的行为与普通拉丁字母相同,当需要使它们直立时。目前,我正在使用\mathrm数学模式使字母直立。

所以\mathrm{\delta d}应该返回一个直立d和直立的三角洲。自定义命令\upright也是一个选项,但我不知道从哪里开始。重要的是,我可以将该命令用于希腊字母和拉丁字母,一样- 无需额外的命令,如\deltaup\updelta。原因是我需要使用不同的类、不同的字体甚至不同的编译器,所以我需要获得一个最通用的解决方案。使用 fontspec/unicode-math(可以解决问题,但不是一种选择)。


从我之前的问题中我了解到乌尔里克·菲舍尔答案是,对于我的情况,没有办法不用\deltaup。她提供了一个巧妙的解决方案:

\let\deltait\delta\renewcommand\delta{\ifnum\fam=0 \deltaup\else \deltait\fi}

如果我的一些同事使用 upgreek 包并且\updelta我包装了一个 if 条件:

\makeatletter
\ifcsname deltaup\endcsname%
    \let\deltait\delta\renewcommand\delta{\ifnum\fam=0 \deltaup\else \deltait\fi}
\else
    \ifcsname updelta\endcsname
        \let\deltait\delta\renewcommand\delta{\ifnum\fam=0 \updelta\else \delta\fi}
    \fi
\fi% 

现在我想知道是否可以把它放入循环中来处理所有小写​​希腊字母。我考虑过包含所有字母的列表,但我不知道如何在这种情况下获取动态输入参数\let\deltait\delta

当然,我可以为每个字母写相同的行,但也许另一种字体比px字体以后需要另一种解决方案,而总是重新定义整个字母表似乎很麻烦。


此外jfbu 在他的回答/评论中提到使用根本\mathrm不是一个好的选择,因为我正在更改字体系列,而我不应该这样做。


平均能量损失

\documentclass{article}

\usepackage[utf8x]{luainputenc}
\usepackage[T1]{fontenc}
\usepackage{pxfonts}
\usepackage{siunitx}
%\usepackage{isomath}
%\usepackage{upgreek}
\usepackage[ISO]{pxgreeks}


\makeatletter
\ifcsname deltaup\endcsname%
    \let\deltait\delta\renewcommand\delta{\ifnum\fam=0 \deltaup\else \deltait\fi}
\else
    \ifcsname updelta\endcsname
        \let\deltait\delta\renewcommand\delta{\ifnum\fam=0 \updelta\else \deltait\fi}
    \fi
\fi%

\begin{document}
\begin{equation}
    \Phi_{\mathrm{\delta}} = \SI{42}{\micro\Omega} \cdot \delta_{\mathrm{\Phi}} 
\end{equation}  
\begin{equation}
    P_{\mathrm{d}} = \SI{42}{\nano\ampere} \cdot d_{\mathrm{P}}
\end{equation}  
\end{document}

答案1

如果我理解你的需要,你只想节省宏空间并仅输入:

\setsmartgreek \alpha\beta\gamma\delta\epsilon \relax

而不是重新定义\alpha,然后\beta,然后\gamma等等。你可以尝试这个:

\def\setsmartgreek{%
   \expandafter\ifx\csname deltaup\endcsname\relax 
   \else \def\stgreekC##1##2;{##2up}\fi
   \expandafter\ifx\csname updelta\endcsname\relax 
   \else \def\stgreekC##1##2;{up##2}\fi
   \ifx\stgreekC\undefined \errmessage{upright greek letters are not available}%
   \else \expandafter\setsmartgreekA \fi
}
\def\setsmartgreekA#1{\ifx#1\relax \else
   \expandafter \let \csname it:\string#1\endcsname = #1%
   \edef#1{\noexpand\ifnum\fam=0
          \expandafter\noexpand\csname\expandafter\stgreekC\string#1;\endcsname
          \noexpand\else \expandafter\noexpand\csname it:\string#1\endcsname
          \noexpand\fi}%
   \expandafter\setsmartgreekA \fi
}

\setsmartgreek\alpha\beta\gamma\delta\epsilon\relax

\message{\meaning \gamma}

答案2

这是一种可能性。有点痛苦,但现在已经完成了。请注意,代码假设希腊字母已设置为斜体,如果不是,则不会发生任何变化,但定义的宏\alphait\Gammait不会执行其名称所指示的操作。

\documentclass{article}
\usepackage[utf8x]{luainputenc}
\usepackage[T1]{fontenc}
\usepackage{pxfonts}
\usepackage{siunitx}
%\usepackage{isomath}
%\usepackage{upgreek}
\usepackage[ISO]{pxgreeks}

% for what comes next we need that Greek letters are set-up to all be in
% italic by previous packages (nothing will break if not, but "\alphait" then
% would not say what it names indicate).

% The code checks existence of \alphaup, \upalpha and \otheralpha. The last
% wins on the previous.

\makeatletter
\@tfor\@tempa:={Gamma}{Delta}{Theta}{Lambda}{Xi}{Pi}{Sigma}{Upsilon}
{Phi}{Psi}{Omega}{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}
{varrho}{varsigma}{varphi}\do
{%
    \let\TWWW@next\@gobble
\ifcsname\@tempa up\endcsname
    \expandafter\let\csname\@tempa it\expandafter\endcsname
                    \csname\@tempa\endcsname
    \edef\@tempb 
     {\noexpand\noexpand\expandafter\noexpand\csname\@tempa up\endcsname}%
    \edef\@tempc 
      {\noexpand\noexpand\expandafter\noexpand\csname\@tempa it\endcsname}
    \let\TWWW@next\@firstofone
\fi
\ifcsname up\@tempa\endcsname
    \expandafter\let\csname\@tempa it\expandafter\endcsname
                    \csname\@tempa\endcsname
    \edef\@tempb 
     {\noexpand\noexpand\expandafter\noexpand\csname up\@tempa\endcsname}%
    \edef\@tempc 
      {\noexpand\noexpand\expandafter\noexpand\csname\@tempa it\endcsname}
    \let\TWWW@next\@firstofone
\fi
\ifcsname other\@tempa\endcsname
    \expandafter\let\csname\@tempa it\expandafter\endcsname
                    \csname\@tempa\endcsname
    \edef\@tempb 
      {\noexpand\noexpand\expandafter\noexpand\csname other\@tempa\endcsname}%
    \edef\@tempc 
      {\noexpand\noexpand\expandafter\noexpand\csname\@tempa it\endcsname}
    \let\TWWW@next\@firstofone
\fi
\TWWW@next{\expandafter\edef\csname\@tempa\endcsname
        {\noexpand\ifnum\fam=\z@\@tempb\noexpand\else\@tempc\noexpand\fi}}%
}
\makeatletter

% to check the redefinitions in the log
\@tfor\@tempa:=\Gamma \Delta \Theta \Lambda \Xi \Pi \Sigma \Upsilon
\Phi \Psi \Omega \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
\varrho \varsigma \varphi\do {\typeout{\expandafter\meaning\@tempa}}

\makeatother

\begin{document}\thispagestyle{empty}
$\Gamma \Delta
  \Theta \Lambda \Xi \Pi \Sigma \Upsilon \Phi \Psi \Omega \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
  \varrho \varsigma \varphi $

$\mathrm{\Gamma \Delta
  \Theta \Lambda \Xi \Pi \Sigma \Upsilon \Phi \Psi \Omega \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
  \varrho \varsigma \varphi}$

\end{document}

引用

答案3

最简单的方法是使用expl3(填写缺失的名称):

\documentclass{article}

\usepackage{amsmath}
\usepackage{pxfonts}
\usepackage{siunitx}
%\usepackage{isomath}
%\usepackage{upgreek}
\usepackage[ISO]{pxgreeks}
\usepackage{expl3}

\ExplSyntaxOn
\cs_if_exist:NTF \alphaup
 {
  \cs_new:Nn \thewaywewalk_greek:n
   {
    \int_compare:nTF { \fam = 0 } { \use:c { #1up } } { \use:c { #1it } }
   }
 }
 {
  \cs_new:Nn \thewaywewalk_greek:n
   {
    \int_compare:nTF { \fam = 0 } { \use:c { up#1 } } { \use:c { #1it } }
   }
 }

\clist_map_inline:nn
 {
  alpha,beta,gamma,delta,epsilon,zeta,...
 }
 {
  \cs_set_eq:cc { #1it } { #1 }
  \cs_set:cpn { #1 } { \thewaywewalk_greek:n { #1 } }
 }
\ExplSyntaxOff

\begin{document}

\begin{gather}
\alpha\beta\gamma\delta\ne\mathrm{\alpha\beta\gamma\delta} \\
\Phi_{\mathrm{\delta}} = \SI{42}{\micro\Omega} \cdot \delta_{\mathrm{\Phi}} \\
P_{\mathrm{d}} = \SI{42}{\nano\ampere} \cdot d_{\mathrm{P}}
\end{gather}  
\end{document}

在此处输入图片描述

相关内容