问题
为什么在包加载时向列表传递错误(如不存在)选项会导致 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
预计要执行的位置起作用。
在这种情况下,预计会出现低级错误,早于软件包发出“未知选项”警告/错误。