我最近将一些常用的 TikZ 命令外部化为一个库。这很简单,只需将命令写入专用文件并命名即可tikzlibraryname.code.tex
。然后可以使用将其包含在内\usetikzlibrary{name}
。
但这仅当它与包含它的文件放在同一目录中或位于某个全局已知的包含路径中时才有效。尝试使用相对路径\usetikzlibrary{../name}
会导致错误
! I can't find file `tikzlibrary../name.code.tex'.
\input{../tikzlibraryname.code.tex}
\usetikzlibrary
是一种解决方法。不过最好使用正确的命令。
tikz 库可以从相对路径加载吗?
答案1
以下是\usetikzlibrary
\def\usetikzlibrary{\pgfutil@ifnextchar[{\use@tikzlibrary}{\use@@tikzlibrary}}%}
\def\use@tikzlibrary[#1]{\use@@tikzlibrary{#1}}
\def\use@@tikzlibrary#1{%
\edef\pgf@list{#1}%
\pgfutil@for\pgf@temp:=\pgf@list\do{%
\expandafter\pgfkeys@spdef\expandafter\pgf@temp\expandafter{\pgf@temp}%
\ifx\pgf@temp\pgfutil@empty
\else
\expandafter\ifx\csname tikz@library@\pgf@temp @loaded\endcsname\relax%
\expandafter\global\expandafter\let\csname tikz@library@\pgf@temp @loaded\endcsname=\pgfutil@empty%
\expandafter\edef\csname tikz@library@#1@atcode\endcsname{\the\catcode`\@}
\expandafter\edef\csname tikz@library@#1@barcode\endcsname{\the\catcode`\|}
\expandafter\edef\csname tikz@library@#1@dollarcode\endcsname{\the\catcode`\$}
\catcode`\@=11
\catcode`\|=12
\catcode`\$=3
\pgfutil@InputIfFileExists{tikzlibrary\[email protected]}{}{
\pgfutil@IfFileExists{pgflibrary\[email protected]}{%
\expandafter\usepgflibrary\expandafter{\pgf@temp}%
}{%
\tikzerror{I did not find the tikz library
'\pgf@temp'. I looked for files named
tikzlibrary\[email protected] and
pgflibrary\[email protected], but neither
could be found in the current texmf trees.}
}}%
\catcode`\@=\csname tikz@library@#1@atcode\endcsname
\catcode`\|=\csname tikz@library@#1@barcode\endcsname
\catcode`\$=\csname tikz@library@#1@dollarcode\endcsname
\fi%
\fi
}%
}
请注意,这\usetikzlibrary[fpu]
只是的替代方案\usetikzlibrary{fpu}
。它不吃选项。
从定义中你可以看出它\usetikzlibrary
处理以下问题
- 检查库是否已加载。某些库只能加载一次。
@
记住敏感字符、|
和的 catcode$
。这样你几乎可以\tikzlibrary
在任何地方使用它。实际上,你可以在 中使用它tikzpicture
。- 测试文件是否存在。如果存在,则输入。
最后一次检查的定义是
\def\pgfutil@InputIfFileExists#1#2#3{\pgfutil@IfFileExists{#1}
{\input #1\relax#2}
{#3}}%
你可以通过以下方式修改其定义
\def\pgfutil@InputIfFileExists#1#2#3{\pgfutil@IfFileExists{\tikz@library@directory #1}
{\input \tikz@library@directory #1\relax#2}
{#3}}%
具有定制的\tikz@library@directory
。