KOMA、eulerpx、\chapter 和 \mathbf 之间的交互:\reserved@a 的使用与其定义不符

KOMA、eulerpx、\chapter 和 \mathbf 之间的交互:\reserved@a 的使用与其定义不符

我正在使用pdflatexArch Linux 上的 TeX Live 发行版。xelatex并且lualatex遇到了同样的问题。

最小失败示例:

\documentclass{scrreport}
\usepackage{eulerpx}

\begin{document}
\(\mathbf{foo}\)
\chapter{foo}
\(\mathbf{foo}\)
\end{document}

产量:

! Use of \reserved@a doesn't match its definition.
\reserved@b ->\relax
                     \ifmmode \else \non@alpherr \mathbf  \fi \use@mathgroup...
l.7 \(\mathbf{foo}
                  \)

删除\usepackage{eulerpx}或切换到 都\documentclass{report}可以解决问题。有人知道这是怎么回事吗?这让我很抓狂,因为我想使用 KOMA,而且我希望能够在数学模式中轻松混合 Palatino 和 Euler。或者有人知道 的替代品吗eulerpx

这似乎与使用\chapter\section等有关;以下也全部因相同的错误而失败:

\documentclass{scrreport}
\usepackage{eulerpx}

\begin{document}
\(\mathbf{foo}\)
\section{foo}
\(\mathbf{foo}\)
\end{document}
\documentclass{scrreport}
\usepackage{eulerpx}

\begin{document}
\chapter{foo}
\(\mathbf{foo}\)
\chapter{foo}
\(\mathbf{foo}\)
\end{document}
\documentclass{scrreport}
\usepackage{eulerpx}

\begin{document}
\chapter{foo}
\(\mathbf{foo}\)
\section{foo}
\(\mathbf{foo}\)
\end{document}

答案1

嗯,eulerpx包装上写着

%% Get rid of the existing \mathbf font
\let\mathbf=\relax

这实在不是一件好事。

问题是什么?\DeclareMathAlphabet{\mathbf}后面的命令不会改变 的内部定义\mathbf。以下代码可以证明这一点

\expandafter\show\csname mathf \endcsname

第一个之后\(\mathbf{foo}\)(因为数学字母实际上只在第一次使用时分配)。这将显示

> \mathbf =macro:
->\relax \ifmmode \else \non@alpherr \mathbf  \fi \use@mathgroup \M@OT1 {8}.

在终端上,这与没有加载时得到的结果相同eulerpx,只有最终的数字会发生变化。另一方面,删除坏\let\mathbf=\relax线,我们得到

> \mathbf =macro:
->\relax \ifmmode \else \non@alpherr \mathbf  \fi \use@mathgroup \M@U {8}.

你能看出其中的细微差别吗?嗯,就是这个。确实,问题消失了。

完全没有必要“摆脱现有\mathbf字体”。数学字母是“按需”分配的,因此现有\mathbf字体。有一个\mathbf命令,但它会在第一次使用时对字体选择方案进行抖动,以便拾取请求的字体。

(实际上,还存在一些其他小故障eulerpx。)

答案2

在现代工具链中

既然你提到你可以使用 LuaLaTeX 或 XeLaTeX,你可以下载OpenType 版本的 Euler并使用unicode-math。在 Linux 中,保存euler.otf~/.fonts/以仅为您自己安装,或保存到 以/usr/local/share/fonts/在系统范围内安装。(子目录也可以。)

Optima 是一款由与 AMS Euler 和 Palatino 同一位设计师设计的无衬线字体,其克隆版 URW Classico 可通过 TUG 的getnonfreefonts脚本。(您想将其安装到您的TEXMFLOCAL目录中,使用--sys。)

\documentclass{scrreport}
\usepackage[math-style=upright]{unicode-math}

\defaultfontfeatures{ Scale=MatchLowercase, Ligatures=TeX }
\setmainfont{TeX Gyre Pagella}[Scale=1.0]
\setsansfont{URW Classico}
\setmonofont{Inconsolata}
\setmathfont{Asana Math}
\setmathfont{euler.otf}[range={up/{Latin,latin,Greek,greek},
                               bfup/{Latin,latin,Greek,greek},
                               cal,bfcal,frak,bffrak}]

\newcommand\vectorsym[1]{\symbf{#1}}
                               
\begin{document}
\[ a \vectorsym{i} \times b \vectorsym{j} = ab \vectorsym{k}
   \quad\mathbf{iff}\quad \vectorsym{i} \cdot \vectorsym{j} = 0 \]
\end{document}

Neo Euler/Asana Math/TeX Gyre Pagella 样本

此序言应为您提供与 类似的输出eulerpx,只是为\mathbf您提供了粗体文本字体。(我能想到的最不做作的例子是想要强调单词当且仅当。注意 ffi 连字符和当且仅当和基向量。)要获得向量的粗体数学字母,请使用\symbf

您也可以将bf=sym选项添加到unicode-math,从而\mathbf为 创建一个别名\symbf。然后,如果您在数学模式下需要一些粗体文本,可以编写类似 的内容\textnormal{\bfseries iff}

您可以\mathbf使用以下BoldFont=选项更改字体\setmathrm,例如

\setmathrm{URWClassico}[
   UprightFont = *-Regular,
   BoldFont = *-Bold,
   ItalicFont = *-Italic,
   BoldItalicFont = *-BoldItalic,
   Extension = .otf]

还有一个\setboldmathrm命令,但是它会改变 的输出\mathrm\mathversion{bold}不幸的是此设置不支持它。

如果您更喜欢 ISO 风格,即仅使用欧拉常数(例如 e、i 和 π),那么您可以更改[math-style=upright][math-style=ISO]

如果您不喜欢欧拉下标和上标的间距,您可以传递\setmathfont选项script-features={}sscript-features={}。这也会禁用更宽、更易读的字母。

PDFLaTeX 的解决方法

如果您需要使用传统的 8 位字体,则与粗体矢量符号eulerpx兼容,并且您可以在数学模式下使用粗体文本。bm\textnormal{\bfseries ...}

\documentclass{scrreport}
\usepackage{amsmath,eulerpx,bm,tgpagella,classico,inconsolata}

\newcommand\vectorsym[1]{\boldsymbol{#1}}
                               
\begin{document}
\[ a \vectorsym{i} \times b \vectorsym{j} = ab \vectorsym{k}
   \quad\textnormal{\bfseries iff}\quad \vectorsym{i} \cdot \vectorsym{j} = 0 \]
\end{document}

AMS Euler/newpx/Pagella 样本

相关内容