为什么 listing 包中的 lstlang*.sty 文件要加载 3 次?

为什么 listing 包中的 lstlang*.sty 文件要加载 3 次?

在编译以下 MCE 期间:

\documentclass{article}
\usepackage{listings}
\lstset{language=TeX}
\begin{document}
\begin{lstlisting}
Foo
\end{lstlisting}
\end{document}

文件lstlang*.sty被加载3次(和lstmisc.sty2次):

[...]
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstmisc.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/listings.cfg))
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang1.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang2.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang3.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang1.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang2.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang3.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang1.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang2.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang3.sty)
(/usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstmisc.sty)
[...]

有必要吗?

答案1

正如 egreg 在评论中所说,这似乎是由于 中的方言系统造成的listings。如果你“闯入”文件加载过程,比如在 中\lst@LAS,你会发现对于 TeX,三个过程与三个不同的参数搜索相关:

  • []{TeX}
  • [common]{TeX}
  • [primitive]{TeX}

还需注意以下几点:

  • 加载周期的数量取决于有多少种方言(例如只需一个Delphi,两个COBOL,...)
  • 加载的文件数量取决于语言的定义位置。

因此,发生的事情似乎大致如下。在第一遍中,listings除非有预设的方言,否则始终寻找“裸”语言。一旦找到并处理了这个“基本”位置,它就会停止读取文件。如果已将其定义为依赖于第二种方言,则将重新读取文件以加载它。这本身可能依赖于第三种方言,依此类推,直到到达底部。

在 TeX 的情况下,配置文件已将默认值设置为[plain],因此listings会加载该值。plain定义说[plain]{TeX}[common]{TeX},因此第二次传递会加载[common]{TeX}。然后它依赖于[primitive]{TeX},从而强制进行第三次传递。TeX 内容全部在第三个语言文件中,因此它们都被读取了三次,而 misc 文件在第三次传递时被跳过,因为所有内容都已解析。

相关内容