使 \mathrm 产生直立希腊文

使 \mathrm 产生直立希腊文

我需要区分斜体和直立希腊字母。我使用包来做这件事。这允许我在数学模式中通过输入alphabeta来写一个直立字母。我可以扩展它以产生直立的吗?\mu$\text\mu$\mathrm\mu

\documentclass{article}

\usepackage{amsmath}
\usepackage{alphabeta}

\begin{document}

\begin{align}
\text{is italic mu: } & \mu \mathit \mu\\
\text{should be upright mu: } & \text \mu \mathrm \mu
\end{align}

\end{document}

答案1

的解决方案pdftex。未经广泛测试,因此可能存在我没有想到的问题。请注意alphabeta 不能无法加载,但提供了其基本功能。

\documentclass{article}

\usepackage{amsmath}% for \text
\usepackage{bm}
\usepackage{textalpha}

\makeatletter

\def\@tempa#1#2#3{%
   \let#2=#1
   \def#1{\TextOrMath{#3}{\ifnum\fam=0 \text{#3}\else#2\fi}}%
}

\@tempa\alpha\mathalpha\textalpha
\@tempa\beta\mathbeta\textbeta
\@tempa\gamma\mathgamma\textgamma
\@tempa\delta\mathdelta\textdelta
\@tempa\epsilon\mathepsilon\textepsilon
\@tempa\zeta\mathzeta\textzeta
\@tempa\eta\matheta\texteta
\@tempa\theta\maththeta\texttheta
\@tempa\vartheta\mathvartheta\texttheta
\@tempa\iota\mathiota\textiota
\@tempa\kappa\mathkappa\textkappa
\@tempa\lambda\mathlambda\textlambda
\@tempa\mu\mathmu\textmu
\@tempa\mnu\mathmnu\textmnu
\@tempa\xi\mathxi\textxi
\@tempa\rho\mathrho\textrho
\@tempa\varrho\mathvarrho\textrho
\@tempa\sigma\mathsigma\textsigma
\@tempa\tau\mathtau\texttau
\@tempa\upsilon\mathupsilon\textupsilon
\@tempa\phi\mathphi\textphi
\@tempa\chi\mathchi\textchi
\@tempa\psi\mathpsi\textpsi
\@tempa\omega\mathomega\textomega

\makeatother

\begin{document}

See \alpha\beta\gamma, but \theta\vartheta\ or \rho\varrho.\par
Normal: $a\alpha l\lambda r\rho\varrho x_{\mu}$\par
With \verb+\mathrm+: $\mathrm{a\alpha l\lambda r\rho\varrho x_{\mu}}$\par
With \verb+\bm+: $\bm{\alpha}$, but $\bm{\mathrm{\alpha}} $

\end{document}

在此处输入图片描述

答案2

使用 lualatex 或 xelatex 是最简单的,unicode-math因为 Unicode 数学字体已经包含两种 mu 样式:

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath}
\usepackage{unicode-math}

\begin{document}

\begin{align}
\text{is italic mu: } & \mu \\
\text{should be upright mu: } & \symup{\mu}
\end{align}

\end{document}

答案3

由于你似乎在数学模式中主要(专门?)使用希腊字母,你可能需要熟悉上希腊语包,它提供了名为\upalpha\upbeta等的宏。

在此处输入图片描述

\documentclass{article}
\usepackage{upgreek}
\begin{document}
\begin{tabular}{ll}
slanted greek math-mode letters: & $\alpha\beta\gamma\dots\mu\nu\dots\omega$ \\
upright greek math-mode letters: & $\upalpha\upbeta\upgamma\dots\upmu\upnu\dots\upomega$
\end{tabular}
\end{document}

答案4

在评论中,我提到了使用\unslant希腊字母的可能性,就像这里所做的那样:直立希腊字体适合计算机现代。但是,楼主想要一个可以自动执行此操作的宏。

在这里,我创建了一个宏\mathgr{},它使用一个标记循环来检查参数中的每个标记...如果它们\up<greek>可以,它就使用\unslant它们(即,它只使用 upgreek 来确定标记的希腊语性)。

因为 tokcycle 在排版之前会收集标记,所以宏和分组参数之类的东西不会造成困难。例如,在 MWE 中,在参数中\mathgr,我使用非希腊字母宏,我使用围绕指数的分组,我使用非希腊字母字符,我使用活动标记~以及嵌套的\textrm

\ThisStyle{...\SavedStyle...}该包的语法用于scalerel为非倾斜字符保留较小的数学样式。

此方法仅适用于 pdflatex。

\documentclass{article}
\usepackage{upgreek}% ONLY USED TO DEFINE NAMES \up...
\usepackage{tokcycle,scalerel}
\newsavebox{\foobox}
\newcommand{\slantbox}[2][0]{\mbox{%
        \sbox{\foobox}{#2}%
        \hskip\wd\foobox
        \pdfsave
        \pdfsetmatrix{1 0 #1 1}%
        \llap{\usebox{\foobox}}%
        \pdfrestore
}}
\newcommand\unslant[2][-.25]{\ThisStyle{\slantbox[#1]{$\SavedStyle#2$}}}

\makeatletter
\newcommand\mathgr[1]{\tokcycle
  {\addcytoks{##1}}
  {\processtoks{##1}}
  {\ifcsname up\expandafter\@gobble\string##1\endcsname
   \addcytoks{\unslant{##1}}%
    \else\addcytoks{##1}\fi}
  {\addcytoks{##1}}{#1}%
  \expandafter\mathrm\expandafter{\the\cytoks}%
}
\makeatother
\begin{document}
\begin{tabular}{ll}
slanted greek math-mode letters: & 
  $ab c \alpha\beta\gamma^{\pi+1}\dots\mu~\nu\dots\omega\textrm{a b c}$ \\
tokcycle + unslant & 
  $\mathgr{ab c \alpha\beta\gamma^{\pi+1}\dots\mu~\nu\dots\omega\textrm{a b c}}$
\end{tabular}
\end{document}

在此处输入图片描述

如果人们对的外观感到满意upgreek,并希望避免的变化\unslant,那么可以调整令牌循环以达到以下目的:

\documentclass{article}
\usepackage{upgreek}%
\usepackage{tokcycle}

\makeatletter
\newcommand\mathgr[1]{\tokcycle
  {\addcytoks{##1}}
  {\processtoks{##1}}
  {\ifcsname up\expandafter\@gobble\string##1\endcsname
   \addcytoks[1]{\csname up\expandafter\@gobble\string##1\endcsname}%
    \else\addcytoks{##1}\fi}
  {\addcytoks{##1}}{#1}%
  \expandafter\mathrm\expandafter{\the\cytoks}%
}
\makeatother
\begin{document}
\begin{tabular}{ll}
slanted greek math-mode letters: & 
  $ab c \alpha\beta\gamma^{\pi+1}\dots\mu~\nu\dots\omega\textrm{a b c}$ \\
tokcycle + unslant & 
  $\mathgr{ab c \alpha\beta\gamma^{\pi+1}\dots\mu~\nu\dots\omega\textrm{a b c}}$
\end{tabular}
\end{document}

在此处输入图片描述


补充

OP 似乎决心“覆盖” \mathrm。虽然我不建议替换它,但可以做到自动包含 token 循环

\documentclass{article}
\usepackage{upgreek}% ONLY USED TO DEFINE NAMES \up...
\usepackage{tokcycle,scalerel}
\newsavebox{\foobox}
\newcommand{\slantbox}[2][0]{\mbox{%
        \sbox{\foobox}{#2}%
        \hskip\wd\foobox
        \pdfsave
        \pdfsetmatrix{1 0 #1 1}%
        \llap{\usebox{\foobox}}%
        \pdfrestore
}}
\newcommand\unslant[2][-.25]{\ThisStyle{\slantbox[#1]{$\SavedStyle#2$}}}

\makeatletter
\newcommand\mathgr[1]{\tokcycle
  {\addcytoks{##1}}
  {\processtoks{##1}}
  {\ifcsname up\expandafter\@gobble\string##1\endcsname
   \addcytoks{\unslant{##1}}%
    \else\addcytoks{##1}\fi}
  {\addcytoks{##1}}{#1}%
  \expandafter\svmathrm\expandafter{\the\cytoks}%
}

\let\svmathrm\mathrm
\renewcommand\mathrm[1]{\mathgr{#1}}
\makeatother
\begin{document}
\begin{tabular}{ll}
slanted greek math-mode letters: & 
  $ab c \alpha\beta\gamma^{\pi+1}\dots\mu~\nu\dots\omega\textrm{a b c}$ \\
mathrm (tokcycle + unslant) & 
  $\mathrm{ab c \alpha\beta\gamma^{\pi+1}\dots\mu~\nu\dots\omega\textrm{a b c}}$
\end{tabular}
\end{document}

相关内容