使用 \tkzInterLC[R] 后 tikz 图片中出现不必要的空白

使用 \tkzInterLC[R] 后 tikz 图片中出现不必要的空白

在我的 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 中最不清楚的命令。在极少数情况下,它无法按预期工作。

相关内容