我又遇到了 Tikz 和 Rectangles 的问题。第二个矩形没有被绘制,但第一个矩形被绘制了。即使我删除了除第二个之外的所有内容fill
(包括画布变换和范围),它也不会被绘制。
\documentclass{beamer}
\usepackage{listings}
\usepackage{tikz}
\usepackage{pgfplots}
\lstset{
language=C++,
basicstyle=\ttfamily\scriptsize,
numbers=left,
captionpos=b
}
\usetikzlibrary{positioning,arrows,tikzmark,calc}
% This is the file main.tex
\usetheme{Darmstadt}
\begin{document}
\begin{frame}[fragile]
\frametitle{Wiedereintrittsfähiges Interface}
\begin{lstlisting}[mathescape,escapechar=\%]
float flicker_float(bool restart, ActiveConfig<Traits> config,
float sample)
{
// save to 'state'
%\tikzmark{statb}%static Impl state;%\tikzmark{state}%
$\ldots$
}
\end{lstlisting}
\begin{lstlisting}[mathescape,escapechar=\%]
float flicker_float_r(bool restart, ActiveConfig<Traits> config,
float sample, %\tikzmark{parb}%Impl *state%\tikzmark{pare}%)
{
// save to *state
$\ldots$
}
\end{lstlisting}
\begin{tikzpicture}[overlay, remember picture]
\begin{scope}[transform canvas={yshift=-2pt}]
\fill[opacity=.1] (pic cs:statb) rectangle ($(pic cs:state) + (0,10pt)$ -| {pic cs:state});
\fill[opacity=.1] (pic cs:parb) rectangle ($(pic cs:parb) + (0,10pt)$ -| {pic cs:pare});
\draw[->] (pic cs:statb) -| ([xshift=-5pt]pic cs:parb) -- +(5pt,0);
\end{scope}
\end{tikzpicture}
\end{frame}
\end{document}
如果我使用filldraw
而不是fill
,我会看到第二个矩形左边框的一小部分。这可能表明存在裁剪问题,但我不知道是什么原因造成的。
答案1
似乎是坐标问题,而不是裁剪问题。如果你尝试
\draw (pic cs:parb) -- ($(pic cs:parb) + (0,10pt)$ -| {pic cs:pare});
你会发现你得到了一条垂直线。也就是说,第二个坐标最终位于第一个坐标的正上方。我不明白为什么会这样,但可以采用一些更简单的方法
\fill[opacity=0.1] (pic cs:parb) rectangle ([yshift=10pt]pic cs:pare);
或者
\fill[opacity=0.1] (pic cs:parb) rectangle ($(pic cs:pare) + (0,10pt)$);
两者都运行良好。
\documentclass{beamer}
\usepackage{listings}
\usepackage{pgfplots} % loads tikz
\lstset{
language=C++,
basicstyle=\ttfamily\scriptsize,
numbers=left,
captionpos=b
}
\usetikzlibrary{positioning,arrows,tikzmark,calc}
% This is the file main.tex
\usetheme{Darmstadt}
\begin{document}
\begin{frame}[fragile]
\frametitle{Wiedereintrittsfähiges Interface}
\begin{lstlisting}[mathescape,escapechar=\%]
float flicker_float(bool restart, ActiveConfig<Traits> config,
float sample)
{
// save to 'state'
%\tikzmark{statb}%static Impl state;%\tikzmark{state}%
$\ldots$
}
\end{lstlisting}
\begin{lstlisting}[mathescape,escapechar=\%]
float flicker_float_r(bool restart, ActiveConfig<Traits> config,
float sample, %\tikzmark{parb}%Impl *state%\tikzmark{pare}%)
{
// save to *state
$\ldots$
}
\end{lstlisting}
\begin{tikzpicture}[overlay, remember picture]
\begin{scope}[transform canvas={yshift=-2pt}]
\fill[opacity=.1] (pic cs:statb) rectangle ($(pic cs:state) + (0,10pt)$ -| {pic cs:state});
\fill[opacity=0.1] (pic cs:parb) rectangle ([yshift=10pt]pic cs:pare);
% \fill[opacity=0.1] (pic cs:parb) rectangle ($(pic cs:pare) + (0,10pt)$);
% uncomment to see straight line
% \draw (pic cs:parb) -- ($(pic cs:parb) + (0,10pt)$ -| {pic cs:pare});
\draw[->] (pic cs:statb) -| ([xshift=-5pt]pic cs:parb) -- +(5pt,0);
\end{scope}
\end{tikzpicture}
\end{frame}
\end{document}