这不是一个实际问题,而是一个“为什么会发生这种情况”的问题。在处理较大的文档时,我开始从 和环境中收到虚假且(对我来说)无法解释的Improper \halign inside $$'s.
错误。amsmath
align
align*
切换到 MWE,我很快发现我加载了 和fontspec
,lmodern
后者可能是在我切换到 Libertinus 字体之前留下的。不加载lmodern
就解决了问题,但我仍然好奇为什么这发生过。
这是一个 MWE(我正在使用 XeTeX,以防万一):
%!TEX TS-program = xelatex
\documentclass{article}
\usepackage{amsmath}
\usepackage{lmodern} % (1)
\usepackage{fontspec} % (2)
\usepackage{microtype} % (3)
\setmainfont{Libertinus Serif} % (4)
\begin{document}
\begin{align}
a & b
\end{align}
\end{document}
注释掉任何标记为 (1)--(4) 的行使问题消失(当然,如果你注释掉 (2),你也必须注释掉 (4))。
我对幕后发生的事情感到很困惑。有人能解释一下吗?
答案1
编辑:这个问题已在microtype
v3.0 中修复。
这是一个错误microtype
:
下列语句中,应该使用and而不是{
and :}
\begingroup
\endgroup
\def\MT@set@inh@list#1#2{%
\MT@ifempty\MT@inh@feat{%
\MT@map@clist@c\MT@features{\begingroup % <--
\MT@ifstreq{##1}{tr}\relax{\MT@declare@char@inh{##1}{#1}{#2}}%
\endgroup}% <--
}{%
\MT@map@clist@c\MT@inh@feat{\begingroup % <--
\KV@@sp@def\@tempa{##1}%
\MT@ifempty\@tempa\relax{%
\edef\@tempa{\csname MT@rbba@\@tempa\endcsname}%
\MT@ifstreq\@tempa{tr}\relax{%
\MT@exp@one@n\MT@declare@char@inh{\@tempa}{#1}{#2}}}%
\endgroup}% <--
}%
\MT@end@catcodes
}
这解释了@David 发现的四个空数学原子。我将在下一个版本中对此进行更改,但现在将上述内容添加到序言中应该可以解决问题。
(顺便说一句:感谢完美的 MWE!)
答案2
如果这是第一个数学表达式,则只会出现错误。一些初始设置是在微妙的时刻发生的。您可以在丢弃的框中使用简单的数学表达式。
\documentclass{article}
\usepackage{amsmath}
\usepackage{lmodern} % (1)
\usepackage{fontspec} % (2)
\usepackage{microtype} % (3)
\setmainfont{Libertinus Serif} % (4)
\begin{document}
\sbox0{$x$}
\begin{align}
a & b
\end{align}
\end{document}