pgfplots 或其他软件包中的错误

pgfplots 或其他软件包中的错误

此代码让 pdflatex 进入无限循环

\documentclass{scrbook}

% required for bug
\usepackage{onlyamsmath}
% required for tikzpicture
\usepackage{pgfplots}
\usetikzlibrary{calc}   
% changes error
\usepackage{siunitx}

\begin{document}

\begin{tikzpicture}
  \begin{axis}[name=plot1]
  \end{axis}

  \begin{axis}[name=plot2,at={($(plot1.east)+(0cm,0)$)},anchor=west]
  \end{axis}     
\end{tikzpicture}

\end{document}

在报告第一个错误之后(实际上第一个错误是其他错误,但这只是因为我将其简化为一个最小示例)

! Undefined control sequence.
\next ->\@nil 

有人可以追踪起源或告诉我解决方法吗?

答案1

我调试了您的示例:

该错误是 TikZcalc库与之间的不兼容onlyamsmath

这是由于onlyamsmath恶意改变了的含义,$导致TikZ无法解析表达式造成的。

更准确地说,onlyamsmath将 的 catcode 更改$为 active(代码 13),而 TikZ 的calc库需要标准数学模式美元(代码 3)。我建议您向 的作者提交错误报告onlyamsmath:以我的拙见,对标准 catcode 的更改几乎肯定会破坏与其他软件包的兼容性。

我在 CVS 版本的 TikZ 中添加了健全性检查并附带有用的错误消息,以便它检测并报告不兼容问题。

请注意,该问题与 pgfplots 完全无关:

\documentclass{scrbook}

% required for bug
\usepackage{onlyamsmath}
% required for tikzpicture
\usepackage{tikz}
\usetikzlibrary{calc}   
% changes error
\usepackage{siunitx}

\begin{document}

\message{Catcode is \the\catcode`\$^^J}%

%\catcode`\$=3
\begin{tikzpicture}

    \node (plot1) at (0,0) {};

  \node [at={({$({plot1.east})+(0cm,0)$})},anchor=west]
  \end{axis}     
\end{tikzpicture}

\end{document}

答案2

问题产生的原因有两个。首先,onlyamsmath使$active 具有定义

> $=macro:
->\ifx \protect \@typeset@protect \expandafter \futurelet \expandafter \next \e
xpandafter \checkdsp \else \expandafter $\fi .

\edef其次,在轴的启动处有一个隐藏:

\tikz@scan@no@calculator #1(#2)->\edef \tikz@temp {(#2)}\expandafter \tikz@@sca
n@@no@calculator \expandafter #1\tikz@temp 
#1<-\pgfplots@set@at 
#2<-$(plot1.east

因此,发生的事情是, 不是执行\futurelet,而是\edef尝试扩展\next。确切的含义取决于它上次的用途(因此如果siunitx已加载 ,则错误会发生变化),但问题是一样的。

我不确定是否存在明显的解决方法,因为对于代码at中参数的行为还有进一步的假设pgfplots

相关内容