请参阅以下屏幕截图。
如您所见,那里有两个“过满”的水平框。但是,LaTeX 根本没有产生任何过满框警告。我尝试制作一个最小的工作示例,但由于没有完全相同的布局、字体和换行符,因此无法重现。很抱歉,我无法在这个问题中包含 MWE。(编辑:请在下方找到 MWE)。
不过我尝试诊断问题。由于 LaTeX 不会将这些视为溢出框,所以我猜这可能是突出问题。我使用 fontspec (LuaLaTeX) 设置 Minion 字体,如下所示,
\setmainfont[
UprightFeatures = {RawFeature = {protrusion = mnr}},
BoldFeatures = {RawFeature = {protrusion = mnr}},
ItalicFeatures = {RawFeature = {protrusion = mni}},
BoldItalicFeatures = {RawFeature = {protrusion = mni}},
RawFeature = {expansion = default},
Ligatures = {Required, Common, Contextual, TeX},
Numbers = {OldStyle, Proportional},
SizeFeatures = {
{Size = -8.41, OpticalSize = 8},
{Size = 8.41-13.01, OpticalSize = 11},
{Size = 13.01-19.91, OpticalSize = 19},
{Size = 19.91-, OpticalSize = 72}},
]{Minion Pro}
忽略其他因素(例如 SizeFeatures 用于解决 fontspec/luaotfload 无法选择正确的光学尺寸的问题)。问题出现在以下行
ItalicFeatures = {RawFeature = {protrusion = mmi}},
其中,突起在 设置的字体之前打开\pdfprotrudechars2
,是mni
Minion Pro Italic 的突起设置。我将MinionPro
包中的设置转换为与 LuaLaTeX 一起使用(因为 的官方版本microtype
尚不支持 加载 opentype 字体的 LuaTeX fontspec
)。设置突起的文件的一部分Lua
可以在下面找到,
fonts = fonts or { }
fonts.protrusions = fonts.protrusions or { }
fonts.protrusions.setups = fonts.protrusions.setups or { }
--omitted codes--
fonts.protrusions.setups["mni"] = { -- Minion Pro Italic
factor = 1, left = 1, right = 1,
-- omitted code--
[0x0067] = {-0.070, -0.070}, -- g
[0x0069] = { 0.000, -0.110}, -- i
[0x006A] = {-0.090, -0.150}, -- j
[0x0070] = {-0.040, 0.000}, -- p
[0x0072] = { 0.000, 0.080}, -- r
-- omitted --
}
g
II 改变字母和的突出度p
,即上图中的断点,则问题解决。
有人能解释一下这个问题吗?我的字体设置(使用)或突起设置文件有问题吗RawFeatures
(上述代码片段中省略的代码只是针对其他字母的设置,我认为它们应该彼此独立)?
似乎只要在斜体字符处发生换行并且激活了该字符的突出部分,就会出现问题。罗马字体不会发生这种情况。
編輯:进一步的实验表明,为突出因子分配正值而不是负值不会对斜体字体造成任何问题。我猜问题不在于斜体字体,但突出系数为负值。罗马字体不存在此类问题的原因是,没有为任何罗马字符分配负值。但一些斜体字符具有负突出值,因此它们不会超出边界太多。
最新编辑:这是触发该问题的最小文档。
\documentclass[a4paper]{article}
\usepackage{microtype}
\usepackage{amsthm}
\newtheorem{proposition}{Proposition}
\usepackage{lipsum}
\begin{document}
\begin{proposition}
\lipsum
\end{proposition}
\end{document}
使用 lualatex (展示错误):
使用 pdflatex (非常好):