有时,嵌套tikzpicture
环境似乎是不可避免的,例如,如果你想要一个node
包含 TikZ 图片的环境。(是吗?)然而,嵌套tikzpicture
环境是有问题的,也因为内部环境继承所有 TikZ 属性来自周围tikzpicture
环境。
在对类似问题马丁·沙勒 (Martin Scharrer) 认为
一个 [重置所有 TikZ/PGF 属性的] 命令将非常难以维护,因为所有 TikZ 属性都需要用它明确设置。
有没有办法,在目前的实施中,保存/恢复全部TikZ/PGF 的内部状态,以便将其应用于嵌套tikzpicture
环境?如果没有,那么为嵌套环境实现“使用默认值的干净启动”真正需要什么tikzpicture
?有什么想法吗?
答案1
由于 Joseph 已经发布了“不完全是答案”,我也将发布我的“不完全是答案”的答案。之所以说这是“不完全是答案”,是因为我认为这个问题的答案不正确。这个问题问的是如何保护内tikzpicture 来自外一。我的“答案”是:
- 你不想。
- 如果需要,请使用盒子。
第一个原因是你很可能想要一些继承某些东西,很可能是由于大小。您可能还想继承颜色。对于这种部分继承,最好的方法是确保内部 tikzpicture 明确设置它需要的值没有想要继承,然后让其余部分保持不变。这与 TeX 组和 s 的正常作用域行为相同pgfscope
。
内部和外部 tikzpictures 的真正问题不是保护内部不受外部影响,而是保护外部不受内部影响。tikzpicture 的某些部分是全局设置的,因为某些信息需要从某些内部分组中移出,而通过设置全局宏来做到这一点要容易得多。我遇到的有:
- 图片的边界框。
- 节点的坐标。
可能还有其他的。问题是在 tikzpicture 的开头设置的最重要的变量是什么?范围是什么?被要求收集这些信息。使用边界框,参见https://tex.stackexchange.com/a/46792/86对于节点,请参阅tikz:如何在嵌套节点中引用节点(还有很多其他的例子)。
有一些代码可以解决这两个问题。它被称为包subpicture
,是(优秀)的一部分tikz-qtree
包(这可能是为什么没有多少人听说过它的原因——我只知道,因为我正在研究该代码以回答本网站上的其他问题)。这也是为什么这“不是一个答案”的原因:我从未尝试单独使用该代码,因此不知道它在包之外会如何工作tikz-qtree
。但是,我是最坚定的“不要嵌套 tikzpictures”倡导者之一。但如果我做过必须嵌套 tikzpictures,这就是我要采取的方式。
我所知道的是,它在内部确实使用了框。但它保存了边界框和节点信息,因此外部 tikzpicture 仍然可以访问这些信息。所以从这个意义上来说,它是两全其美的。
答案2
不完全是答案,但我能得到的最接近的答案。TeX 的分组方法意味着您无法轻松地将“内部”环境与“外部”环境隔离开来。因此,最好的方法是先排版内部代码,将其存储在一个框中,然后在“外部”代码中使用该框
\newsavebox{\mybox}
\sbox{\mybox}{%
\begin{tikzpicture}
% Inner picture
\end{tikzpicture}
}
\begin{tikzpicture}
% Outer picture
% to include somewhere
\usebox{\mybox}
\end{tikzpicture}