今天,我想编译一份当年早些时候运行完美的文档。然而,LuaLaTex 抱怨 C++ 列表中的一些代码行。我将问题归结为以下最小示例:
测试.tex:
\documentclass{article}
\usepackage{unicode-math}
\usepackage{listings}
\lstset{basicstyle=\scriptsize}
\begin{document}
\lstinputlisting{test.cpp}
\end{document}
测试.cpp:
int main()
{
return (int)(-1.l);
}
如果我编译lualatex test.tex
我得到以下内容:
(./test.cpp
! Missing number, treated as zero.
<to be read again>
global
l.3 return (int)(-1.l
);
?
如果我取消注释 unicode-math 包或 lstset 命令或使用 xelatex,它就可以正常编译。出了什么问题?
答案1
答案2
问题是 fontspec/unicode-math 使用 luacode 读取字体尺寸。虽然第一次读取代码时 tex 代码中的 catcode 会被冻结,但从 directlua 获得的值则不然:执行时间的 catcode 设置很重要。因此,当尝试在 lstlisting 中间设置字体(这会激活所有字符)时,事情就会变得一团糟。
类似的问题在这里有关 csquotes 和 LuaLaTeX 的这个错误该由谁来承担责任?
通过在读取 dimens 时在 tex.sprint 的第一个参数中明确设置 catcode 表可以解决此问题。我将此建议添加到 unicode-math 的 github tracker 中。
\documentclass{article}
\usepackage{unicode-math}
\RequirePackage{luacode}
\begin{luacode}
local latexcatcodetable = luatexbase.registernumber("catcodetable@latex")
function fontspec.mathfontdimen(fnt, str)
local mathdimens = luaotfload.aux.get_math_dimension(fnt, str)
if mathdimens then
tex.sprint(latexcatcodetable,mathdimens)
tex.sprint(latexcatcodetable,"sp")
else
tex.sprint(latexcatcodetable,"0pt")
end
end
\end{luacode}
\usepackage{listings}
\lstset{basicstyle=\scriptsize}
\begin{document}
\begin{lstlisting}
-
\end{lstlisting}
\end{document}