我刚刚升级到 MacTeX 2021,现在没有使用我的自定义 LaTeX 类不再符合要求。原因似乎是,当您加载文件并且有两个同名的可能性时,它现在会优先选择“本地”文件,而不是“中央”texmf 中的文件,而过去情况总是相反。
一个简单的例子是创建两个文件,一个在子目录中:
test.tex prob/article.cls
哪里test.tex
\documentclass{prob/article}
\begin{document}
Some text
\end{document}
并且prob/article.cls
是:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{prob/article}
\LoadClass{article}
然后pdflatex test.tex
可以与 TeXLive 2020 及更早版本配合使用,但不能与 TeXLive 2021 配合使用,我得到:
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2020-10-01> patch level 4
L3 programming layer <2021-02-18> (./prob/article.cls
Document Class: prob/article WTF edition
) (/usr/local/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def)
(./test.aux)
! LaTeX Error: The font size command \normalsize is not defined:
there is probably something wrong with the class file.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.2 \begin{document}
回想起来,拥有与标准库中同名的文件是自找麻烦,但这种新行为是内在的吗?有没有什么办法可以关闭它?无论使用哪个版本的 TeXLive,kpsewhich -all article.cls
都会给出相同的输出(特别是,文件以相同的顺序出现)。
答案1
这是一个故意的改变,因为 LaTeX 通过名称来识别包选项,因此支持不同文件夹中两个同名文件至少有点棘手。就你的情况而言,你有两个非常不同的文件,article.cls
但不会冲突。然而,也有人有 LaTeX 包的本地副本,因此类似这样的情况:
\usepackage{myunitemplate/array}
\usepackage{array}
会失败(并且可能\usepackage{myunitemplate/array}
隐藏在类文件和\usepackage{array}
另一个包中,使得更难检测到)。
出于这个和其他原因,自 2020-10-01 版本以来,LaTeX 强制要求通过名称和扩展名来标识包和类仅有的,这样就不会加载类似上述的用法array.sty
。
如果是恰恰你想做什么,你可以特殊处理这种情况,并使用类似
\expandafter\let\csname [email protected]\endcsname\relax
\expandafter\let\csname [email protected]\endcsname\relax
在加载 LaTeX 之前article.cls
,这样在 LaTeX 尝试加载之前,选项和文件版本就会被清除。我必须强制执行这个不应该做,而应该使用一个唯一的名称来标识您的班级。