此代码让 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
。