我有以下代码
\documentclass{report}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
bla bla bla
\begin{tikzpicture}
\def\r{1}; % radius
\def\a{80}; % 1st angle
\def\b{170} % 2nd angle
\pgfmathsetmacro\px{\r/cos(\a)}
\pgfmathsetmacro\qy{\r/cos(\b-90)}
\coordinate (p) at (\px,0);
\coordinate (p1) at (2*\a:\px);
\coordinate (p2) at (-2*\a:\px);
\coordinate (q1) at (0,\qy);
\coordinate (q2) at (2*\b-90:\qy);
\path[name path=lineup] (p)-- (p1);
\path[name path=linedown] (p)-- (p2);
\path[name path=lineleft] (q1)-- (q2);
\draw[name intersections={of=lineup and lineleft,by={r1}}];
\draw[name intersections={of=linedown and lineleft,by={r2}}];
\draw (0,0) circle [radius=\r];
\draw (0,0) -- (\a:\r);
\draw (0,0) -- (-\a:\r);
\draw (0,0) -- (\b:\r);
\draw (p) -- (r1) -- (r2) -- cycle;
\end{tikzpicture}
bla bla bla
\end{document}
如你所见,三角形的上方和下方有很多空白区域。这是因为三角形的左角(代码中的 r1 和 r2)是虚拟线段(代码中的 lineup、linedown 和 lineleft)的交点。
问题:我怎样才能让 Tikz 在计算窗口大小时忽略这些虚拟线段?我尝试使用 \clip 进行一些操作,但没有成功。
请注意,我的图片取决于三个参数 \r、\a 和 \b,这些参数我在 tikzpicture 的开头定义。我不希望剪辑具有某个任意值,而该值仅对应于特定的参数选择。
答案1
坐标p
、p1
、p2
和q1
以及q2
使用它们的路径比您实际绘制的内容要大。PGF 仍将它们视为图片的一部分,因此图片的边界框会相应放大。
对于您来说,最简单的解决方案是将整个部分(包括name intersections
辅助路径)放在带有选项的范围内overlay
。这样整个范围就不会被视为边界框的一部分。
\begin{scope}[overlay]
\coordinate (p) at (\px,0);
\coordinate (p1) at (2*\a:\px);
\coordinate (p2) at (-2*\a:\px);
\coordinate (q1) at (0,\qy);
\coordinate (q2) at (2*\b-90:\qy);
\path[name path=lineup] (p)-- (p1);
\path[name path=linedown] (p)-- (p2);
\path[name path=lineleft] (q1)-- (q2);
\path[name intersections={of=lineup and lineleft,by={r1}}];
\path[name intersections={of=linedown and lineleft,by={r2}}];
\end{scope}
尽管name intersections
路径未声明所需边界框之外的坐标,因此不需要位于 内scope
,但由于name path
键在本地起作用,因此更容易包含它们。(还有global name path
。)
您也可以\pgfresetboundingbox
按照所说的使用(它的作用是),但是您应该确保它之前没有任何东西突出到最终边界框之外。