列表中给定 Tikz-Marks 处的矩形未绘制,但不同标记处的相同矩形

列表中给定 Tikz-Marks 处的矩形未绘制,但不同标记处的相同矩形

我又遇到了 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}

相关内容