我有一个包含该类的 tex 文档scartcl
。在序言中,我\it
通过重新定义\RenewDocumentCommand{\it}{...}{...}
。此外,我还需要在不同的环境中使用 LuaLaTeX 完成该文档。
- 版本 1.13.0(已修补 TeX Live 2021/CVE-2023-32700)(在我的本地机器上)
- 版本 1.15.0 (TeX Live 2022/Debian)(在 podman 容器内)
在我本地机器上的旧版本中,一切正常。我在日志中搜索了“err”、“warn”和“depr”,没有发现任何相关内容。
但是,在容器中的较新版本中,我得到了! LaTeX cmd Error: Command '\it' undefined
。以及一条错误消息,指出旧字体命令\it
将不再起作用。我尝试通过添加 来解决第一个问题\provideDocumentCommand{\it}
。结果LaTeX cmd Error: Invalid argument type '\RenewDocumentCommand ' in command
并且scratcl
错误仍然存在。
有人能向我解释一下这里的问题是什么吗?
泰·弗朗兹
答案1
考虑以下简短的测试文件:
% franz.tex
\documentclass{scrartcl}
\show\it
\end{document}
如果我在我的系统上运行(我从 2012 年开始保留 TeX Live),
/usr/local/texlive/2021/bin/universal-darwin/pdflatex franz
我明白了
> \it=macro:
->\protect \it .
l.2 \show\it
如果我这样做
/usr/local/texlive/2022/bin/universal-darwin/pdflatex franz
我明白了
> \it=undefined.
l.2 \show\it
发生了什么?在从 TL 2021 过渡到 TL 2022 的过程中,koma 类改变了旧字体命令的管理。在 TL 2021 之前,这些命令的定义是它们在序言中也能“起作用”。后来,它们仅在文档开头“定义”。
这就是造成差异的原因:如果您\RenewDocumentCommand{\it}{...}{...}
在序言中这样做,TL 2021 不会出错,因为\it
确实有定义。但是,在更高版本中会出错,因为序言中\it
不再有定义。
解决方案:
\providecommand{\it}{}% in case \it isn't defined
\RenewDocumentCommand{\it}{...}{...}
然而,我不建议\it
出于任何目的重复使用。