加载“语法”时,“列表”下划线导致语义嵌套错误

加载“语法”时,“列表”下划线导致语义嵌套错误

我使用 XeLaTeX 并安装了 TeXLive 2015。

我想同时使用listings打印代码包和syntax打印语法包。对于代码,我还想扩展某些符号作为数学字符串,例如,我想得到N0“N₀”,消耗两个字符。为此,可以使用包literate的功能listings,请参阅其文档

现在,我的问题来了xelatex

\documentclass{article}
\usepackage{
    listings,
%   syntax,
}

\begin{document}

\lstset{
    literate={N0}{{$N$}{$_0$}} 2
}

\begin{lstlisting}[mathescape]
    N0 $N_0$
\end{lstlisting}

\end{document}

产生预期的结果,但取消注释% syntax,加载syntax包的行,将在编译时出现语义嵌套错误:

! TeX capacity exceeded, sorry [semantic nest size=500].
<recently read> {

l.16 ^^IN0
           $N_0$
No pages of output.

我发现罪魁祸首是 中的数学下划线literate={N0}{{$N$}{$_0$}} 2,并且只出现在literate部分。将此行替换为literate={N0}{{$N$}{$0$}} 2(即删除下划线)将再次编译。请注意,列表环境中xelatex仍然有一个数学下划线。$N_0$

发生了什么事?我能阻止这种情况发生吗?

答案1

请不要使用该类minimal进行测试,请参阅为什么要避免使用最小类?

有两种方法可以避免无限循环:\lstset在序言中执行或使用\sb而不是_

第一种方式

\documentclass{article}
\usepackage{
    fontspec,
    unicode-math,
    listings,
    syntax,
}

\lstset{
    literate={N0}{{$ℕ$}{$_0$}}2
}

\begin{document}

\begin{lstlisting}[mathescape]
    N0 $ℕ_0$
\end{lstlisting}

\end{document}

第二种方式

\documentclass{article}
\usepackage{
    fontspec,
    unicode-math,
    listings,
    syntax,
}

\begin{document}

\lstset{
    literate={N0}{{$ℕ$}{$\sb0$}}2
}

\begin{lstlisting}[mathescape]
    N0 $ℕ_0$
\end{lstlisting}

\end{document}

两者的输出

在此处输入图片描述

相关内容