scrbook 和 dynkin-diagrams 之间的冲突

scrbook 和 dynkin-diagrams 之间的冲突

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\chapterscrbook.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-diagrams2023-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}

相关内容