问题的根源

问题的根源

这是以前的我之前问过的问题。

我正在使用newpxtexteulerpx包,我想将运算符名称的排版更改为使用无衬线类型。我实现了 egreg 的回答

\documentclass{amsart}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{mathtools,newpxtext,eulerpx}

% a new symbol font for names of operators
\DeclareSymbolFont{sfoperators}{OT1}{cmss}{m}{n}
% don't waste a math group
\DeclareSymbolFontAlphabet{\mathsf}{sfoperators}
% tell LaTeX to use sfoperators for names of operators
\makeatletter
\renewcommand{\operator@font}{\mathgroup\symsfoperators}
\makeatother

这适用于已定义的运算符名称(\max,\sin,etc.)以及自定义的运算符名称(通过DeclareMathOperator)。当我尝试定义涉及重音的运算符名称时,会出现问题:具体来说,我想定义运算符名称“máx”(代表“máximo”,在葡萄牙语中意为“最大”)。以下代码

\DeclareMathOperator{\grau}{grau}
\DeclareMathOperator{\mAx}{máx}

\begin{document}
$\deg\quad\grau\quad\max\quad\mAx$
\end{document}

有输出

在此处输入图片描述

除了重音符号“a”未出现在无衬线字体中之外,还会生成警告

‘命令 \’ 在输入行 ** 的数学模式下无效,

这是意料之中的,因为我们必须在数学模式而不是文本模式下工作。如果我使用

\DeclareMathOperator{\mAx}{m\acute{a}x}

相反,输出有和我一样的问题以前的问题:

在此处输入图片描述

尝试实施 Davislor 的解决方案

\DeclareMathOperator{\mAx}{m\acute{\mathsf a}x}

也不起作用:它的输出与以前完全相同。

最后,这里有一个可行的强力替代方法:

\DeclareMathOperator{\mAx}{m\mbox{$\acute{\mathsf a}$}x}

在此处输入图片描述

(显然,我不想采用这种丑陋的方法)。有什么方法可以解决这个问题吗?

答案1

问题的根源

\DeclareSymbolFont{sfoperators}{OT1}{cmss}{m}{n}您使用 OT1 编码将符号字体定义为。但是,您选择了\usepackage[T1]{fontenc},这会将默认编码设置为 T1。在 T1 中,重音符号的插槽是"01,但您告诉 LaTeX 使用 OT1 字体中的字形,其中该插槽包含 Δ。

解决方案是切换到一致的编码。(如果您需要混合字体编码,还有其他各种技巧可以使用,但您不必这么做。)

在现代工具链中

unicode-math软件包允许您更改\mathrm字母表,用于数学模式中的单词(例如运算符名称),与字母表分开\symup。执行此操作的命令\setmathrm来自fontspec。此示例以 ISO 样式设置欧拉恒等式,常量为 Neo Euler,运算符名称为 Classico,数字和变量为 Asana Math。它们分别是 AMS Euler、Optima 和 Palatino 的克隆,所有这些都是 Hermann Zapf 的作品。

\documentclass[varwidth=5cm, preview, 12pt]{standalone}
\usepackage{mathtools}
\usepackage{unicode-math}

\defaultfontfeatures{Scale=MatchLowercase}
\setmainfont{TeX Gyre Pagella}[
  Scale=1.0,
  Ligatures={Common, Discretionary, TeX}]
\setsansfont{URW Classico}
\setmathfont{Asana Math}
\setmathfont[range={up/{Latin,latin,Greek,greek},
                    bfup/{Latin,latin,Greek,greek},
                    cal, bfcal, frak, bffrak},
              script-features={},
              sscript-features={}
            ]{Neo Euler}
\setmathrm{URW Classico}

\newcommand\upi{\symup{i}}
\newcommand\upe{\symup{e}}

\begin{document}
\begin{align*}
  \upe^{\upi x} &= \cos{x} + \upi \sin{x} \\
  \upe^{\upi \uppi} + 1 &= 0
\end{align*}
\end{document}

Neo Euler 示例

在 PDFLaTeX 中

选择支持 T1 编码的无衬线字体系列,最好是 TS1。该eulerpx软件包建议使用 Palatino 作为衬线字体,使用 Optima 作为无衬线字体,因此它使用了 Pagella 和 Classico 的克隆版本:

\documentclass[varwidth=5cm, preview, 12pt]{standalone}

\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage[type1]{classico}
\usepackage{tgpagella, eulerpx}
\usepackage{mathtools}

\DeclareSymbolFont{sfoperators}{T1}{URWClassico-LF}{m}{n}
\SetSymbolFont{sfoperators}{bold}{T1}{URWClassico-LF}{b}{n}

\makeatletter
\renewcommand{\operator@font}{\mathgroup\symsfoperators}
\makeatother

\DeclareMathOperator{\grau}{grau}
\DeclareMathOperator{\mAx}{máx}

\begin{document}
\begin{align*}
  e^{i x} &= \cos{x} + i \sin{x} \\
  e^{i \pi} + 1 &= 0
\end{align*}
\[ \deg \grau \mAx \] 
\end{document}

Eulerpx/URW Classico 样本

如果您不想使用 URW Classico(或者您想将此文档用于商业用途,但字体许可不允许),您可以用其他字体系列代替,如{T1}{cmss}{m}{n},只要编码与您使用的编码相匹配。

相关内容