我使用 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}