我正在使用pdflatex
Arch 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}
此序言应为您提供与 类似的输出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}