amsmath 和 Minion 以及 TexLive 2020 的问题

amsmath 和 Minion 以及 TexLive 2020 的问题

以下文件是我 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 个软件包。)在理想世界中,这样的代码行是不必要的......

相关内容