下列
\documentclass{article}
\usepackage{amsthm,polyglossia}
\setmainfont{CharisSIL}
\newtheorem{defi}{Definition}
\begin{document}
\begin{defi}
Harmless definition
\end{defi}
\end{document}
当通过 lualatex 运行时,会产生以下错误:
warning (node filter): error: ...es/MiKTeX/tex/luatex/luaotfload/luaotfload-ha
rf-plug.lua:408: bad argument #1 to 'char' (value out of range)
.
\par ...@m \@noitemerr {\@@par }\fi \else {\@@par
}\fi
l.12 \end{defi}
?
如果我删除 amsthm 或用 Times New Roman 或 Sylfaen 替换 CharisSIL,xelatex 不会出现错误,lualatex 也不会出现错误。
可能是什么原因?
以下是日志:
Command Line: lualatex.exe --interaction=errorstopmode --synctex=-1 "test.tex"
Startup Folder: C:\Users\me\Desktop\vv
This is LuaHBTeX, Version 1.12.0 (MiKTeX 20.11)
restricted system commands enabled.
(./test.tex
LaTeX2e <2020-10-01> patch level 2
L3 programming layer <2020-12-03> xparse <2020-03-03>
("C:/Program Files/MiKTeX/tex/latex/base/article.cls"
Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
...
(./test.aux) ("C:/Program Files/MiKTeX/tex/latex/base/ts1cmr.fd")
warning (node filter): error: ...es/MiKTeX/tex/luatex/luaotfload/luaotfload-ha
rf-plug.lua:408: bad argument #1 to 'char' (value out of range)
.
\par ...@m \@noitemerr {\@@par }\fi \else {\@@par
}\fi
l.12 \end{defi}
?
[1{C:/Users/me/AppData/Local/MiKTeX/pdftex/config/pdftex.map}] (./test.aux))
411 words of node memory still in use:
3 hlist, 1 vlist, 1 rule, 2 glue, 3 kern, 1 glyph, 4 attribute, 49 glue_spec
, 4 attribute_list, 1 write nodes
avail lists: 2:35,3:14,4:1,5:23,6:2,7:154,9:12,11:6
<C:/Users/me/AppData/Roaming/MiKTeX/fonts/truetype/SIL/charissil/charissil-r.tt
f><C:/Users/me/AppData/Roaming/MiKTeX/fonts/truetype/SIL/charissil/charissil-i.
ttf><C:/Users/me/AppData/Roaming/MiKTeX/fonts/truetype/SIL/charissil/charissil-
b.ttf>
答案1
这是luaotfload
HarfBuzz 渲染器代码中的一个错误,该错误已在开发代码中得到解决。polyglossia
强制使用 HarfBuzz 渲染器,从而触发错误,但与此同时,您可以改用节点渲染器,使用 Barbara 或 Davislor 的答案中描述的方法。
答案2
这似乎与 LuaLaTeX HarfBuzz 渲染器有某种关系。当我关闭它时,您的 MWE 会编译:
\documentclass{article}
\usepackage{amsthm}
\usepackage[luatexrenderer=Node]{polyglossia}
\setmainfont{CharisSIL}
\newtheorem{defi}{Definition}
\begin{document}
\begin{defi}
Harmless definition
\end{defi}
\end{document}
无论加载顺序如何,这似乎都可以工作。如果您需要 HarfBuzz 渲染器来渲染其他字体,您也可以将其设置为字体选项。
\documentclass{article}
\usepackage{polyglossia}
\setmainfont{Charis SIL}[Renderer=Node]
\usepackage{amsthm}
\newtheorem{defi}{Definition}
\begin{document}
\begin{defi}
Harmless definition
\end{defi}
\end{document}
另一个解决方法可能是使用 XCharter 作为替代,因为 Charis SIL 基于 Charter。
作为对 Barbara Beeton 的出色解决方法的一个小补充,如果您要进一步向下移动,请务必\usepackage{fontspec}
先加载。\setmainfont
\usepackage{polyglossia}
答案3
这个答案基于成功的猜测,因为我无法访问 Charis SIL 字体,因此无法测试。
这需要 XeLaTeX 或 LuaLaTeX,因为 Charis SIL 是 8 位(utf8
)字体。
必须加载字体前 amsthm
:
\setmainfont{CharisSIL}
\usepackage{amsthm}
\usepackage{polyglossia}