以下文件是我 2000 页免费物理教科书的精简版,无法正确编译:
\documentclass{book}
\usepackage[fullfamily,textlf, opticals, swash, onlytext]{MinionPro}
\usepackage[extraops,textcomp,withamsmath,amssymb]{minionmath}
\makeatletter
\let\arc\@undefined % else conflict with ``curves.sty''
\DeclareMathAccent{\arcacc} {\mathord} {letters} {5}
\makeatother
\usepackage{amsmath} % allows {align}
\usepackage{minionamsmath}
\usepackage{curves,calc}
\usepackage{bm} % makes bold math possible using \bm{...}
\begin{document}
\begin{equation}
m{\bm{\ddot x}}= q {\bm E} + q {\bm {\dot x}} \times {\bm B}
\end{equation}
\end{document}
在我的 TexLive 2020 系统上(latex 采用 dvi - ps - pdf 路径,因此我使用:latex 测试;dvips 测试;然后是 Distiller)((我没有使用 pdflatex;我的错误))命令 \ddot 和 \dot 行为错误(它们在 TexLive 2017 中行为正确);它们不会产生点,而是在粗体 x 上产生奇怪的符号。罪魁祸首是 amsmath;如果我将其取出(忽略错误),公式排版正确。但是有了它,就会出错。(我确实需要 amsmath......)
所有系统都会发生这种情况吗?该怎么办?
PS xelatex 也犯了同样的错误。pdflatex 也犯了同样的错误。这是因为一些软件包不兼容。
PPS 我使用了带和不带 amsmath 的 tracingmacros=1,并比较了这两个文件。乳胶代码就是这样,甚至更简单的方程式:
\begin{equation}
m{\boldsymbol{\ddot x}}
\end{equation}
(两个 400kByte 日志文件的) 主要区别可能在于这部分:
9113c9178
< \ddot ->\protect \mathaccentV {ddot}104
---
> \ddot ->\protect \ddot
9116a9182,9183
> \ddot ->\mathaccentV {ddot}07F
>
9216c9283
< \bm@command ->\mathaccent 30724
---
> \bm@command ->\mathaccent 30591
9252c9319
< \bm@command ->\mathaccent 30724 \mathchar 31096
---
> \bm@command ->\mathaccent 30591 \mathchar 31096
看来在两种情况下 \ddot 被映射到不同的数学重音……
PPPS 我有几百个 eps 图形,使用 psfrag 并使用原始 postscript 代码。我还使用精彩的 MinionMath 字体、包含许多细节的 microtype 包和一个 5000 行长的 cls 文件。看来 latex 命令已经过时了。我应该切换到 XeLateX 吗?还是切换到 Luatex?我很想听听专业人士的想法和建议...
答案1
该问题影响所有“标准数学口音”:
\hat \check \tilde \acute \grave \dot \ddot \breve \bar \vec
该问题是由于 amsmath.sty 中的宏发生变化造成的。
amsmath.sty 2017/09/02 v2.17a 第 725 行:
\def\@tempa#1{\@xp\@tempb\meaning#1\@nil#1}
amsmath.sty 2020/01/20 v2.17e 现在包含第 747 行至第 753 行:
\def\@tempa#1{%
\@ifundefined{\@xp\@gobble\string#1\space}%
{\@xp\@tempb\meaning#1\@nil#1}%
{\@xp\@xp\@xp\@tempb\@xp\meaning
\csname\@xp\@gobble\string#1\space\endcsname\@nil#1}% }
随着这个定义的改变,Minion Math 中的重音不再起作用。
解决此问题的一个简单方法是从文件 fontmath.minion(由 Minion Math 的 LaTeX 支持提供)中取出带有 \DeclareMathAccent 的行,并将它们放在 amsmath.sty 之后的序言中,例如
\DeclareMathAccent{\hat} {\mathalpha}{letters} {2}
\DeclareMathAccent{\ddot} {\mathalpha}{letters} {4}
\DeclareMathAccent{\dot} {\mathalpha}{letters} {10}
\DeclareMathAccent{\dddot} {\mathord} {letters} {11}
\DeclareMathAccent{\ddddot} {\mathord} {letters} {12}
这可以包含在 LaTeX 支持中,在文件 minion.sty 和 minionamsmath.sty 中,当我更新支持文件时我会这样做。
一些补充说明:
我也强烈建议尽可能使用 unicode-math 和 LuaLaTeX 或 XeLaTeX。所有与字体和编码有关的问题都更容易处理,它不需要所有支持文件,并且可以轻松访问字体中的所有字形。我确实为 Minion Math 提供了 LaTeX 支持,主要用于旧版文档。
LaTeX 对 Minion Math 的支持默认使用“newmath”编码,每个编码有 256 个槽位。这在某些方面与 amsmath 相冲突(例如,amsmath 从组件“合成”一些字形 - 多个整数符号、dddot 和 ddddot 重音符号等 - 而这些是 Minion Math 中的“真实字形”)。
因此,LaTeX 支持的主要软件包 minionmath.sty 有一个选项“withamsmath”,它只是取消定义冲突的命令。还有第二个小软件包 minionamsmath.sty,其唯一任务是在 amsmath 加载后重新定义这些命令。
对于当前的 amsmath,似乎应该将重音添加到 minionmath.sty 中的“未定义的命令”和 minionamsmath.sty 中的“重新定义的命令”中。
因此包的加载顺序(如原始问题中所述)是正确且有意的:
minionmath (带有选项“withamsmath”)
数学
小数学
“newmath” 是一个 TeX 项目,旨在为 TeX 数学字体定义新的编码标准,类似于文本字体的“ec”,但它被 Unicode 数学取代,从未成为标准。我仍然将它用作 Minion Math 的起点。
此外,我认为,原问题中的重音不应该加粗:
\begin{equation}
m\ddot{\bm{x}}= q {\bm E} + q \dot{\bm{x}} \times {\bm B}
\end{equation}
答案2
Davislor 让我走上了正确的道路。这是部分解决方案。
以下文件使用 latex-dvip-Distiller、pdflatex 和 xelatex 正确编译。我将 amsmath 的加载上移,并为 \iint 和 \iiint 添加了两个定义。
\documentclass{book}
\usepackage{amsmath}
\usepackage[fullfamily,textlf, opticals, swash, onlytext]{MinionPro}
\usepackage[extraops,textcomp,withamsmath,amssymb]{minionmath}
\makeatletter
\let\arc\@undefined % else conflict with ``curves.sty''
\DeclareMathAccent{\arcacc} {\mathord} {letters} {5}
\makeatother
\def\iint{\relax}
\def\iiint{\relax}
\usepackage{minionamsmath}
\usepackage{curves,calc}
\usepackage{bm} % makes bold math possible using \bm{...}
\begin{document}
\tracingmacros=1
\begin{equation}
m{\boldsymbol{\ddot x}}
\end{equation}
\end{document}
请注意 \iint 和 \iint 的奇怪定义是必要的,因为不兼容性仍然存在。此外,整本 2000 页的书似乎再次排版正确。
以下是关于 Latex 的一般性评论。我的 5000 行 cls 文件肯定有超过 1000 行代码,例如
\makeatletter
\let\arc\@undefined % else conflict with ``curves.sty''
\DeclareMathAccent{\arcacc} {\mathord} {letters} {5}
\makeatother
\def\iint{\relax}
\def\iiint{\relax}
仅需要这些代码行来避免软件包之间的冲突/不兼容。(免费物理书中使用了大约 60 个软件包。)在理想世界中,这样的代码行是不必要的......