当我排版我的免费物理教科书时,我得到了microtype
警告
Unknown slot number of character `\j'
(这种情况只发生在这个字符上,其他字符都不会发生。)多年来,我都收到此消息,无论是在我的 2008 tex 系统上,还是在我全新、完全更新的 2014 texlive 系统中。旧系统显示 microtype.cfg/183(protrusion)
,新系统 显示microtype.cfg/201(protrusion)
。
系统使用 MinionPromicrotype
和许多其他带有 latex2e 的软件包。我该如何摆脱这个消息?只有microtype
和 MinionPro 一起使用时才会出现这个消息。
这是一个触发错误的最小工作示例:
\documentclass{book}
\usepackage{MinionPro}
\usepackage{microtype}
\usepackage[T1]{fontenc}
\begin{document}
Hallo.
\end{document}
事实上,如果先加载微类型,错误就会消失。但我读到 MinionPro 不允许这样做。该怎么办?
答案1
编辑:感谢@sebschub,这个问题现在已经修复。
此警告意味着microtype
,在读取(突出)设置时,无法将命令转换\j
为字体的插槽号。由于 MinionPro 中确实没有无点 j,因此此消息无害且可以忽略 - 它不是错误。
鉴于此警告无害,最简单的解决方案可能是在microtype
之前加载MinionPro
,正如您所说,这将使消息消失。(我不明白为什么这会成为问题。)另一个解决方案是microtype
加载verbose=silent
这会将所有警告变成纯粹的信息消息,这样它们只会显示在日志文件中,而不是控制台上(但这适用于全部警告,因此相关警告可能会被忽视)。
现在来解释一下发生了什么:MinionPro
取消声明命令\j
,因为字体中没有无点 j(或者插槽用于另一个字形)。但是microtype
的默认继承设置仍然包含继承对j = \j
。因此,在解析这些设置时,microtype
会遇到未定义的\j
。这也解释了为什么第一次加载时消息会消失microtype
:此时,\j
仍然是定义的。
因此,正确的解决方案是将 MinionPro 的自定义继承设置添加到mt-MinionPro.cfg
,其中包含默认设置(来自microtype.cfg
)中的所有内容,但以下设置除外j
:
\DeclareCharacterInheritance
{ encoding = T1,
family = {MinionPro-OsF,MinionPro-LF,MinionPro-TOsF,MinionPro-TLF} }
{ A = {\`A,\'A,\^A,\~A,\"A,\r A,\k A,\u A},
a = {\`a,\'a,\^a,\~a,\"a,\r a,\k a,\u a},
% ...
% j = {\j},
% ...
Z = {\'Z,\.Z,\v Z},
z = {\'z,\.z,\v z}
}
(如果LY1
编码存在突出设置,则其继承设置也必须进行相应调整。)