Calc 和 \settocdepth 中断 \tikzexternalize

Calc 和 \settocdepth 中断 \tikzexternalize

这可能是我见过的最奇怪的 TeX 行为,这说明了很多问题。就标题而言,以下内容确实是 MWE:

\documentclass{memoir}
\settocdepth{subsection}
\usepackage{calc}
\usepackage{pgfplots}
\usepgfplotslibrary{external}
\tikzexternalize
\begin{document}
\begin{center}
\begin{tikzpicture}
    \begin{axis}[view={45}{45}]
    \addplot3[surf,samples=20,domain=-1:1,domain y=-1:1]
        {1-exp(-x^2-y^2)};
    \end{axis}
\end{tikzpicture}
\end{center}
\end{document}

删除包calc\settocdepth定义,一切都会好起来。但是,当两者都存在时,pdflatex -shell-escape将停止,输出日志中将显示以下内容:

! Undefined control sequence. \@calc@post@scan ...st@scan \else \def \calc@next 
                                                                               {\calc@error #1}\fi \fi \f...
l.14 \end{tikzpicture}

如果我想提交错误报告,我甚至不知道在哪里 :/ 有没有其他人看到这种行为,你能说出是什么原因造成的吗?

答案1

该软件包calc将命令\setcounter和朋友更改为脆弱的。所以你必须让它们变得健壮。下面的示例使用了etoolboxwith \robustify

\documentclass{memoir}
\usepackage{calc}
\usepackage{etoolbox}
\robustify\setcounter
\robustify\addtocounter
\robustify\setlength
\robustify\addtolength

\settocdepth{subsection}
\usepackage{pgfplots}
\usepgfplotslibrary{external}
\tikzexternalize




\begin{document}
\begin{center}
\begin{tikzpicture}
    \begin{axis}[view={45}{45}]
    \addplot3[surf,samples=20,domain=-1:1,domain y=-1:1]
        {1-exp(-x^2-y^2)};
    \end{axis}
\end{tikzpicture}
\end{center}
\end{document}

通常不需要calc。相反,您应该使用 etex 命令\dimexprnumexpr。这可以避免此类不良行为。

答案2

必须\settocdepth{subsection}在 之后\tikzexternalize。如果在包或文档类中使用 ,则包\AfterPreamble中的宏etoolbox对于防止出现此类情况很有用\settocdepth,尽管回忆录手册中的建议(完全不要\settocdepth在序言中使用)现在已经过时了。

相关内容