考虑 TikZ 代码:
\begin{tikzpicture}
\draw <a square>;
\draw <an elephant>;
\draw <a toaster>;
\end{tikzpicture}
我想访问围绕大象和烤面包机的边界框的坐标,但忽略必须绘制的正方形前大象和烤面包机,因为大象和烤面包机中的某些坐标依赖于current bounding box
,并且这个边界框必须包含正方形。
问题在于,大象和烤面包机实际上是绘制和填充许多 TikZ 路径、创建许多节点等的复杂程序,并且这些程序(一般来说)无法报告其最顶部、最左边等坐标。因此,需要一种便利:
\begin{tikzpicture}
\draw <a square>;
<do something here to mark start of scope>
\draw <an elephant>;
\draw <a toaster>;
<do something here to mark end of scope>
\draw[red] ($(scoped bounding box.south west) - (2mm,2mm)$)
rectangle ($(scoped bounding box.north east) + (2mm,2mm)$);
\end{tikzpicture}
在大象和烤面包机周围绘制一个红色方框(内边距为 2 毫米),其scoped bounding box
工作原理完全相同,current bounding box
只是它只考虑在指定范围的开始和结束之间由代码绘制的对象。
我不需要这种特定的语法、设置或命令顺序。任何能够以可用于 TikZ 点算法的格式产生“部分”边界框坐标的东西都可以,唯一的警告是,无论注入什么代码一定不修改子程序中命令的坐标框架或样式选项以渲染大象和烤面包机。此外,如果大象和烤面包机子程序中的任何代码都不需要修改,那就更好了,尽管我知道这可能是必要的。
答案1
有一个专门用于此的语法,即。请参阅TikZ 手册的local bounding box
部分。106.4 Special Nodes
\documentclass[tikz,border=5mm]{standalone}
%\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (0,0)rectangle (2,2);
\begin{scope}[local bounding box=redbox]
\draw (4,0)circle(1cm);
\draw (4,-3)circle(1cm and 2cm);
\end{scope}
\draw[red] ($(redbox.south west) - (2mm,2mm)$)
rectangle ($(redbox.north east) + (2mm,2mm)$);
\end{tikzpicture}
\end{document}
答案2
我并没有完全理解,但我认为一个解决方案是将大象和烤面包机程序封装在两个节点中,然后使用 fit 库。不建议将 tikz 图形封装在节点中,但有时这样做很实用。
\documentclass{article}
\usepackage{geometry,graphicx}
\usepackage{tikz,amsmath,ppnmacro}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}
\node[draw,minimum size=1.5cm] (A) at (0,0) {square};
\node(elephant) at (5,3) {
\begin{tikzpicture}
\draw (0,0) -- (2,1) -- (5,-2) -- (0,-1)-- cycle;
\draw[blue] (2,1) coordinate(aa) circle (2cm);
\node at (aa){elephant};
\end{tikzpicture}
};
\node(toaster) at (3,-2) {
\begin{tikzpicture}
\draw[red] (2,1) coordinate(aa) circle (1cm);
\node[rectangle,draw,fill=purple] at (aa){toaster};
\end{tikzpicture}
};
\node[fit=(toaster) (elephant),draw, red,thick]{};
\end{tikzpicture}
\end{document}