![为什么 listing 包中的 lstlang*.sty 文件要加载 3 次?](https://linux22.com/image/272223/%E4%B8%BA%E4%BB%80%E4%B9%88%20listing%20%E5%8C%85%E4%B8%AD%E7%9A%84%20lstlang*.sty%20%E6%96%87%E4%BB%B6%E8%A6%81%E5%8A%A0%E8%BD%BD%203%20%E6%AC%A1%EF%BC%9F.png)
在编译以下 MCE 期间:
\documentclass{article}
\usepackage{listings}
\lstset{language=TeX}
\begin{document}
\begin{lstlisting}
Foo
\end{lstlisting}
\end{document}
文件lstlang*.sty
被加载3次(和lstmisc.sty
2次):
[...]
(/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 文件在第三次传递时被跳过,因为所有内容都已解析。