是否可以在本地加载 TikZ 库?

是否可以在本地加载 TikZ 库?

是否可以加载 TikZ 库并使其成为本地库tikzpicture

我正在写一篇长文档,感觉不同图表所需的不同 TikZ 库正在“扰乱”命名空间。

答案1

\usetikzlibrary定义在文件末尾tikz.code.tex。宏会记住已加载模块的状态<foo>。宏会记住已加载模块全球的\tikz@library@<foo>@loaded。如果一个模块在本地加载,其所有本地定义和赋值在组之后都会丢失,但tikz仍然认为模块已加载并忽略进一步的加载请求(示例取自 percusse 的评论):

\documentclass[tikz]{standalone}
\begin{document}
\begingroup
  \usetikzlibrary{calc}
  \tikz\draw(0,0) -- ($(1,1)+(2,2)$);
\endgroup
\begingroup
  \usetikzlibrary{calc}
  \tikz\draw(0,0) -- ($(1,1)+(2,2)$);
\endgroup
\end{document}       

结果是第\tikz9 行第二条语句出现错误:

! Package tikz Error: You need to say \usetikzlibrary{calc} for coordinate calculation.

可以修补宏\usetikzlibrary以使加载状态的记忆本地化:

\documentclass[tikz]{standalone}

\usepackage{etoolbox}
\makeatletter
\AtBeginDocument{%
  \patchcmd{\use@@tikzlibrary}{\global}{}{}{}%
}
\makeatother

\begin{document}
\begingroup
  \usetikzlibrary{calc}
  \tikz\draw(0,0) -- ($(1,1)+(2,2)$);
\endgroup
\begingroup
  \usetikzlibrary{calc}
  \tikz\draw(0,0) -- ($(1,1)+(2,2)$);
\endgroup
\end{document}

这对于模块 有效calc,因为它的定义(tikzlibrarycalc.code.tex)是本地的。但全局加载标记表明库应在顶层加载。宏是本地定义还是全局定义并不重要。因此,可能存在具有相关全局分配的模块,这些模块在分组后仍然存在并干扰进一步的tikz代码。

答案2

解决这个问题的一种方法是将 TikZ 图形存储为独立文档:

% file figures/myfigure.tikz
\documentclass{standalone}
\usepackage{tikz}    
\usetikzlibrary{shapes,arrows}
\begin{document}
  \begin{tikzpicture}
    % picture goes here
  \end{tikzpicture}
\end{document}

在主文件中,包含生成的 pdf \includegraphics{figures/myfigure.pdf}

为了让 latexmk 知道当 PDF 文件过期时应该重新编译它们,请将其添加到.latexmkrc

add_cus_dep( 'tikz', 'pdf', 0, 'tikz2pdf' );
sub tikz2pdf {
    $_[0] =~ m@^(.*/)([^/]+)$@;
    my ( $dir, $file ) = ($1,$2);
    system("pdflatex -output-directory $dir $_[0].tikz");
}

latexmk 部分仅在您未包含任何其他 PDF 文件时才有效。如果包含其他 PDF 文件,您可能可以通过使用其他扩展来解决这个问题。

相关内容