与 \lstset 和 unicode-math 包结合使用时,列表文件出现错误

与 \lstset 和 unicode-math 包结合使用时,列表文件出现错误

今天,我想编译一份当年早些时候运行完美的文档。然而,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

如果您确保在列表开始之前设置了脚本大小数学,它就会起作用:

在此处输入图片描述

\documentclass{article}
\usepackage{unicode-math}
\usepackage{listings}
\lstset{basicstyle=\scriptsize}

\begin{document}
\sbox0{\scriptsize $x$}
\lstinputlisting{test.cpp}
\end{document}

答案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}

相关内容