是否可以加载 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}
结果是第\tikz
9 行第二条语句出现错误:
! 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 文件,您可能可以通过使用其他扩展来解决这个问题。