我对 TikZ 管道很感兴趣,即 TikZ 路径在“执行”时转换为的一系列低级操作。不幸的是,这在 TikZ 和 PGF 手册(针对版本 3.0.1a)中仅部分描述,因此无法避免卷起袖子深入源代码。根据此评论由 Mark Wibrow 编写,管道由\tikz@finish
中的宏实现<tex installation directory>/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
。
该\tikz@finish
宏具有以下结构:
% Step 1: The path background box
...
% Step 2: Decorate path
...
% Step 3: Preactions
...
...
% Step 13: Add labels and nodes
...
可以看出,在插入任何节点之前都会应用预操作。但是,手册在/tikz/behind path
第 215 页的节点选项描述中指出:
设置此键后,[...] TikZ 会收集当前路径上定义的所有节点,并设置此选项,然后在绘制路径之前按出现的顺序插入所有节点。[...] “在绘制路径之前”实际上意味着在将任何预操作应用于路径之前将节点插入到页面输出中
手册和源代码之间似乎存在差异。这是手册中的错误,还是我遗漏了什么?
答案1
这里没有任何矛盾或神秘之处。正如代码所表明的那样,\tikz@figbox@bg
在执行任何其他操作(步骤 1)之前会使用 的内容,并behind path
确保相关节点最终位于此框中。
为了看到效果,我们可以简单地重新定义behind path
为使用\tikz@figbox
(默认值)。
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw [draw=blue, fill=blue, fill opacity=.5] (0,0) -| (1,1) node [behind path, fill=yellow, opacity=1, text=red] {behind path} -| cycle;
\begin{scope}[yshift=-15mm, behind path/.code={\def\tikz@whichbox{\tikz@figbox}}]
\draw [draw=blue, fill=blue, fill opacity=.5] (0,0) -| (1,1) node [behind path, fill=yellow, opacity=1, text=red] {behind path} -| cycle;
\end{scope}
\end{tikzpicture}
\end{document}