命令 \unit 已定义

命令 \unit 已定义

序列

\documentclass{amsbook} 
\usepackage{pst-eucl} 
\usepackage{prerex}    
\begin{document}
\end{document}

生成“命令 \unit 已定义”错误。这两个包单独使用都没有问题。即使使用最大更新,MikTex 2.9 也不会出现此错误消息。但是,使用 MikTex 23.10 似乎会导致出现此问题。

最后,我能够使用以下步骤消除该问题。

\documentclass{amsbook}
\usepackage{savesym}
\usepackage{pst-eucl}
\savesymbol{unit}
\usepackage{prerex}
\restoresymbol{PREREX}{unit}
\begin{document}
\begin{chart}
\end{chart}
\end{document} 

这让我跳过了序言。但是,第一次调用 prerex (\begin{chart}) 引发了新的错误“!missing number,treated as zero...\xparse not expandable ....1.8 \begin{chart}”。谢谢。

答案1

prerex包确实

\newlength{\unit}

这是导致错误的原因,再加上pst-eucl加载了许多pstricks相关子包,其中包括pst-calculate加载的子包siunitx,而这个子包定义了\unit

我认为这\unit作为可调参数的名称prerex不是一个好的选择。

由于prerex也会​​加载hyperref(我真的不知道为什么),因此应该尽可能晚地加载,并且可能会检查是否\unit已定义,在这种情况下会提供不同的名称。代码可能是

\@ifundefined{unit}{%
  \newlength{\unit}%
  \let\prerex@unit\unit
}{%
  \newlength{\prerexunit}%
  \let\prerex@unit\prerexunit
  \PackageWarning{prerex}{\protect\unit already defined, use \protect\prerexunit instead}
}

\unit将软件包代码中的所有其他 改为\prerex@unit。这样,使用 的用户代码prerex将与以前一样工作,不会产生冲突。警告将告诉用户该怎么做。当然这是软件包维护者的工作。

暂时,如果您需要来自的命令,请先执行,\let\unit\relax然后\usepackage{prerex}使用。\si\unitsiunitx

相关内容