在我的 tikzpicture 中添加最后一行代码后,文本和图片之间出现了很大的空白。我不知道是什么导致了这个问题。
我已经看过类似的问题,但没有一个能解决这个问题。谢谢。
\documentclass[a4paper]{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}
some text
\begin{center}
\begin{tikzpicture}
\coordinate (M) at (0,0) ;
\coordinate (B) at (-5,1.3) ;
\coordinate (C) at (5,1.3) ;
\draw (B) -- (C) node[below] {$a$};
\coordinate (A) at (canvas polar cs:angle=10,radius=2cm);
\draw (M) circle (2cm);
\draw (A) -- (M) node[midway,sloped,fill=white] {$r$} ;
\tkzInterLC[R](B,C)(M,2cm) \tkzGetPoints{E}{D} %without this line%
\tkzDrawPoints(A,D,E,M) %without D,E,%
\tkzLabelPoints(A,D,E,M) %without D,E, >>> no problem at all%
\end{tikzpicture}
\end{center}
\end{document}
答案1
看了代码之后,我想我可以解释为什么会发生这种情况。
在计算直线 AB 与圆的交点时,tkz-euclide
定义一个坐标,该坐标位于一条垂直于 AB 的线上,并且该坐标到圆心的距离与 AB 的长度相同。
此坐标包含在边界框中,从而导致问题。如果缩短线 AB 的长度,您会看到图形上方的空白区域缩小。
一个简单的解决方法,借用 Ludovic 找到的答案,就是添加
\makeatletter
\def\tkz@Projection(#1,#2)(#3)#4{%
\begingroup
\pgfpointdiff{\pgfpointanchor{#1}{center}}%
{\pgfpointanchor{#2}{center}}%
\tkz@ax =\pgf@y%
\tkz@ay =\pgf@x%
\begin{pgfinterruptboundingbox}
\path[coordinate](#3)--++(-\tkz@ax,\tkz@ay) coordinate (tkz@point);
\end{pgfinterruptboundingbox}
\tkz@InterLL(#1,#2)(#3,tkz@point){#4}% définit tkzPointResult
\endgroup
}
\makeatother
回到序言部分,之后\usepackage{tkz-euclide}
。完整代码和输出如下:
\documentclass[a4paper]{article}
\usepackage{tkz-euclide}
\makeatletter
\def\tkz@Projection(#1,#2)(#3)#4{%
\begingroup
\pgfpointdiff{\pgfpointanchor{#1}{center}}%
{\pgfpointanchor{#2}{center}}%
\tkz@ax =\pgf@y%
\tkz@ay =\pgf@x%
\begin{pgfinterruptboundingbox}
\path[coordinate](#3)--++(-\tkz@ax,\tkz@ay) coordinate (tkz@point);
\end{pgfinterruptboundingbox}
\tkz@InterLL(#1,#2)(#3,tkz@point){#4}% définit tkzPointResult
\endgroup
}
\makeatother
\usetkzobj{all}
\begin{document}
some text
\begin{center}
\begin{tikzpicture}
\coordinate (M) at (0,0) ;
\coordinate (B) at (-5,1.3) ;
\coordinate (C) at (5,1.3) ;
\draw (B) -- (C) node[below] {$a$};
\coordinate (A) at (canvas polar cs:angle=10,radius=2cm);
\tkzDrawCircle(M,A)
\draw (A) -- (M) node[midway,sloped,fill=white] {$r$};
\tkzInterLC(B,C)(M,A) \tkzGetPoints{E}{D};
\tkzDrawPoints(A,D,E,M);
\tkzLabelPoints(A,D,E,M);
% the following draws the bounding box of the tikzpicture
\draw (current bounding box.south east) rectangle (current bounding box.north west);
\end{tikzpicture}
\end{center}
\end{document}
答案2
我发现有几个人遇到了这种“空白”的东西。这里有一个简单的解决方案:输入命令
\pgfresetboundingbox
紧接着\tkzInterLC[R](B,C)(M,2cm) \tkzGetPoints{E}{D}
。原因是该命令\tkzInterLC[R]
创建了一个新的边界框,即围绕当前图片的框。
PS:对我来说,pgfresetboundingbox
这是 TikZ 中最不清楚的命令。在极少数情况下,它无法按预期工作。