为什么在 usepackage 命令中使用 lstset 选项会导致 pdflatex 不会终止?

为什么在 usepackage 命令中使用 lstset 选项会导致 pdflatex 不会终止?

问题

为什么在包加载时向列表传递错误(如不存在)选项会导致 pdflatex 运行不终止,而不是 - 比如说 - 一个简单的错误消息?

背景

部分2.2 包加载listings.pdf表示只有单词0.21, final, draft, savemem(以及可能一些未记录的实验开关)是有效选项支持包加载:

\usepackage[options]{listings}

但是,这并没有阻止我高兴地尝试包含一个basicstyle=\ttfamily只能通过设置的选项\lstset

奇怪的是,这个错误并没有触发一个简单的unknown option错误,而是让pdflatex陷入无限循环,最后的日志输出是:

(C:\miktex-portable\tex\latex\listings\listings.sty
! Missing \endcsname inserted.
<to be read again> 
                   \protect 
l.2235 \lst@RequireAspects
                          \lst@loadaspects
? 

MnWE(最小不工作示例)

\documentclass{scrartcl}
%% Ok
%\usepackage{listings}
%\lstset{basicstyle=\ttfamily}

%% NOT Ok
\usepackage[basicstyle=\ttfamily]{listings}

\begin{document}
\lstinline{int k = 0;}
\end{document}

答案1

您可能已经注意到,即使选项中带有键值语法的包也不允许在值中使用控制序列。

这与 LaTeX 如何管理选项列表有关,以便消除空格并在逗号处将其分成几部分。

由于\ttfamily是一个被定义为具有 的强大命令\DeclareRobustCommand,因此不允许它在\zap@space预计要执行的位置起作用。

在这种情况下,预计会出现低级错误,早于软件包发出“未知选项”警告/错误。

相关内容