scrbook
我发现和之间存在奇怪的冲突dynkin-diagrams
,这里是代码
\documentclass{scrbook}
\usepackage{dynkin-diagrams}
\begin{document}
\chapter{One}
Here is one \dynkin A2
\end{document}
显示错误消息“Command \do undefined。”。
但是如果我使用
\documentclass{scrbook}
\usepackage{dynkin-diagrams}
\begin{document}
Here is one \dynkin A2
\end{document}
然后它就起作用了。
我想知道是什么原因造成的以及如何修复这个错误?
答案1
样式文件在定义临时宏时dynkin-diagrams.sty
使用 LaTeX 的,因为它假设先前的宏已经定义了。这几乎总是一个正确的假设,但在使用宏 from时则不然。此宏重新定义并最终执行。然后以下调用 from失败。\renewcommand
\do
\do
\chapter
scrbook.cls
\do
\let\do=\relax
\renewcommand\do
\dynkin
dynkin-diagrams.sty
如果有\def\do
且没有,那会更正确\renewcommand\do
,但我们不是这个宏文件的作者。
一个不太明显的解决方法如下:
\documentclass{scrbook}
\usepackage{dynkin-diagrams}
{\catcode`\@=11 \expandafter\gdef\expandafter\dynkin@save
\expandafter{\dynkin@save \let\do=\LaTeX}} % :)
\begin{document}
\chapter{One}
Here is one \dynkin A2
\end{document}
答案2
更新日期 2023-05-20
dynkin-diagrams
2023-05-18 发布的新版本已修复此问题,通过在每次使用前加上\renewcommand{\do}[1]{...}
by \providecommand{\do}{}
。
原始答案
由于历史原因,在文档的开始处(即,在\begin{document}
处理之后),\do
具有 的含义\noexpand
。
曾经有过关于删除这一“隐藏功能”的讨论,但人们认为保留这一功能很重要,因为它已经存在了大约 30 年,而且包裹可能用它。
正如您所发现的,确实如此。如果您查看 的文档etoolbox
,您会发现几个示例
\renewcommand{\do}[1]{...}
并dynkin-diagrams
大量使用etoolbox
来进行列表处理。它可以省去它,通过选择expl3
而不是将其中的一些与etoolbox
和混合xstrings
。
因此,任何类或包都不应发出\let\do\relax
,因为就\renewcommand
而言,相当于 的东西\relax
被视为未定义。不幸的是,scrbook
确实如此。
您可以使用变通方法。启动图表时,包会发出问题\dynkin@save
,您可以将其挂接以提供定义\do
。
\documentclass{scrbook}
\usepackage{dynkin-diagrams}
\AddToHook{cmd/dynkin@save/before}{\providecommand{\do}{}}
\begin{document}
\chapter{One}
Here is one \dynkin A2
\end{document}