我正在准备一份使用 的文件pgfplots
以供提交。我成功地将图形等外部化。但是,现在我面临一个严重的问题:在目标系统上tikzexternal.sty
可能无法使用该文件(即使我提供它也不行)。因此,我尝试将其内联到我的.tex
文件中。这导致以下错误:
) (./tikzexternal.sty
! Missing number, treated as zero.
<to be read again>
@
l.24 \toksdef\t@
tikzexternal@tmpa=0
A number should have been here; I inserted `0'.
但是,在 tikzexternal.sty 中有一个注释,即原则上可以内联代码。我想知道我做错了什么,或者如何修改 tikzexternal 代码以使其正常工作。
这是一个 MWE,假设已经生成了外部图形:
\documentclass[]{article}
\usepackage{graphicx}
%\usepackage{pgfplots}
%\usepgfplotslibrary{external}
%\tikzexternalize[mode=list and make]
%\usepackage{tikzexternal} % <--- WORKS!!
\input{tikzexternal.sty} % <--- FAILS!!
\tikzexternalize
\begin{document}
\begin{figure}[h]
\begin{tikzpicture}
\begin{axis}[width=\columnwidth]
\addplot[dashed,very thick,color=gray]{sin(x)}; \label{tikz:test_1};
\end{axis}
\end{tikzpicture}
\caption[labelInTOC]{ \ref{tikz:test_1}}
\label{fig:test}
\end{figure}
\end{document}
答案1
深入研究 LaTeX 代码,可以追踪执行 时发生的情况\usepackage{tikzexternal}
。其中很多内容是检查包是否已加载以及处理不相关的选项和类似内容。是相关的是,在文件实际加载之前,\makeatletter
会调用该命令。完整解释如下\makeatletter 和 \makeatother 起什么作用?但简而言之,这意味着命令名称可以包含符号@
(通常不能)。仔细查看,tikzexternal.sty
我们发现很多带有 s的命令@
。
因此,当内联时tikzexternal.sty
(我假设您的意思是将其剪切并粘贴到您的序言中),您需要调用\makeatletter
自己,因为您正在绕过文件实际读取时和读取之间所有的垃圾\usepackage{tikzexternal}
。(然后您将\makeatother
一切恢复原样。)
你的测试文档应如下所示:
\documentclass[]{article}
\usepackage{graphicx}
%\usepackage{pgfplots}
%\usepgfplotslibrary{external}
%\tikzexternalize[mode=list and make]
%\usepackage{tikzexternal} % <--- WORKS!!
\makeatletter
\input{tikzexternal.sty} % <--- ALSO WORKS!!
\makeatother
\tikzexternalize
\begin{document}
\begin{figure}[h]
\begin{tikzpicture}
\begin{axis}[width=\columnwidth]
\addplot[dashed,very thick,color=gray]{sin(x)}; \label{tikz:test_1};
\end{axis}
\end{tikzpicture}
\caption[labelInTOC]{ \ref{tikz:test_1}}
\label{fig:test}
\end{figure}
\end{document}