正确嵌套 tikzpicture 环境:将所有 PGF 值重置为其默认值

正确嵌套 tikzpicture 环境:将所有 PGF 值重置为其默认值

有时,嵌套tikzpicture环境似乎是不可避免的,例如,如果你想要一个node包含 TikZ 图片的环境。(是吗?)然而,嵌套tikzpicture环境是有问题的,也因为内部环境继承所有 TikZ 属性来自周围tikzpicture环境。

在对类似问题马丁·沙勒 (Martin Scharrer) 认为

一个 [重置所有 TikZ/PGF 属性的] 命令将非常难以维护,因为所有 TikZ 属性都需要用它明确设置。

有没有办法,在目前的实施中,保存/恢复全部TikZ/PGF 的内部状态,以便将其应用于嵌套tikzpicture环境?如果没有,那么为嵌套环境实现“使用默认值的干净启动”真正需要什么tikzpicture?有什么想法吗?

答案1

由于 Joseph 已经发布了“不完全是答案”,我也将发布我的“不完全是答案”的答案。之所以说这是“不完全是答案”,是因为我认为这个问题的答案不正确。这个问题问的是如何保护tikzpicture 来自一。我的“答案”是:

  1. 你不想。
  2. 如果需要,请使用盒子。

第一个原因是你很可能想要一些继承某些东西,很可能是由于大小。您可能还想继承颜色。对于这种部分继承,最好的方法是确保内部 tikzpicture 明确设置它需要的值没有想要继承,然后让其余部分保持不变。这与 TeX 组和 s 的正常作用域行为相同pgfscope

内部和外部 tikzpictures 的真正问题不是保护内部不受外部影响,而是保护外部不受内部影响。tikzpicture 的某些部分是全局设置的,因为某些信息需要从某些内部分组中移出,而通过设置全局宏来做到这一点要容易得多。我遇到的有:

  1. 图片的边界框。
  2. 节点的坐标。

可能还有其他的。问题是在 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}

相关内容