这是以前的我之前问过的问题。
我正在使用newpxtext
和eulerpx
包,我想将运算符名称的排版更改为使用无衬线类型。我实现了 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}
在 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}
如果您不想使用 URW Classico(或者您想将此文档用于商业用途,但字体许可不允许),您可以用其他字体系列代替,如{T1}{cmss}{m}{n}
,只要编码与您使用的编码相匹配。