重新使用 tikzmark 名称?

重新使用 tikzmark 名称?

tikzmark 名称似乎不能重复使用。在下面的代码中,我尝试在第一个 lstlisting 部分中绘制一个框轮廓,在第二个 lstlisting 部分中绘制一个填充框。在每个 lstlisting 中,我放置了两个名为“a”和“b”的 tikzmark。不幸的是,结果是第二个 lstlisting 同时获得了轮廓框和填充框,但第一个 lstlisting 都没有获得。

如果我重命名其中一个部分中的 tikzmark(例如“a1”和“b1”),事情就会按预期进行。有没有办法“忘记”tikzmark?我正在编写一个包含大量代码片段的文档,跟踪每个代码片段的唯一 tikzmark 会非常繁琐。

以下是示例代码:

\documentclass{article}

\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc,shapes,positioning,tikzmark}

\begin{document}
\thispagestyle{empty}

\section{Box}
\begin{lstlisting}[escapechar=!,basicstyle=\ttfamily]
#include <stdio.h>
#include <math.h>

int main () {
  double c=-1;
  double z=0;
  int i;

  printf (``For c = %lf:\n'', c );
  for ( i=0; i<10; i++ ) {
    printf ( !\tikzmark{a}!``z %d = %lf\n''!\tikzmark{b}!, i, z );
    z = pow(z,2) + c;
  }
}
\end{lstlisting}

\begin{tikzpicture}[remember picture,overlay]
\draw[red,rounded corners]
  ([shift={(-3pt,2ex)}]pic cs:a) 
    rectangle 
  ([shift={(3pt,-0.65ex)}]pic cs:b);
\end{tikzpicture}


\section{Filled Box}
\begin{lstlisting}[escapechar=!,basicstyle=\ttfamily]
#include <stdio.h>
#include <math.h>

int main () {
  double c=-1;
  double z=0;
  int i;

  printf (``For c = %lf:\n'', c );
  for ( i=0; i<10; i++ ) {
    printf ( !\tikzmark{a}!"z %d = %lf\n"!\tikzmark{b}!, i, z );
    z = pow(z,2) + c;
  }
}
\end{lstlisting}

\begin{tikzpicture}[remember picture,overlay]
\draw[fill=gray,opacity=0.1]
  ([shift={(-3pt,2ex)}]pic cs:a) 
    rectangle 
  ([shift={(3pt,-0.65ex)}]pic cs:b);
\end{tikzpicture}


\end{document}

输出,显示应用于第二部分的轮廓和填充框

答案1

这是一个利用tikzmarks 可以有前缀和后缀这一事实的解决方案。我们创建一个新的计数器,将其用作自动附加的后缀。然后,每次使用tikzmark存储的 s 时,我们都会增加计数器。通过将其全部包装成几种样式,机制就相当隐蔽了。

为了使其以当前形式工作,您必须tikzmark在定义 s 之后使用它们,但关键在于计数器何时步进,以便它可以轻松地适应更一般的情况。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/284311/86}

\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc,shapes,positioning,tikzmark}

\newcounter{tmkcount}

\tikzset{
  use tikzmark/.style={
    remember picture,
    overlay,
    execute at end picture={
      \stepcounter{tmkcount}
    },
  },
  tikzmark suffix={-\thetmkcount}
}

\begin{document}
\thispagestyle{empty}

\section{Box}
\begin{lstlisting}[escapechar=!,basicstyle=\ttfamily]
#include <stdio.h>
#include <math.h>

int main () {
  double c=-1;
  double z=0;
  int i;

  printf (``For c = %lf:\n'', c );
  for ( i=0; i<10; i++ ) {
    printf ( !\tikzmark{a}!``z %d = %lf\n''!\tikzmark{b}!, i, z );
    z = pow(z,2) + c;
  }
}
\end{lstlisting}

\begin{tikzpicture}[use tikzmark]
\draw[red,rounded corners]
  ([shift={(-3pt,2ex)}]pic cs:a) 
    rectangle 
  ([shift={(3pt,-0.65ex)}]pic cs:b);
\end{tikzpicture}

\section{Filled Box}
\begin{lstlisting}[escapechar=!,basicstyle=\ttfamily]
#include <stdio.h>
#include <math.h>

int main () {
  double c=-1;
  double z=0;
  int i;

  printf (``For c = %lf:\n'', c );
  for ( i=0; i<10; i++ ) {
    printf ( !\tikzmark{a}!"z %d = %lf\n"!\tikzmark{b}!, i, z );
    z = pow(z,2) + c;
  }
}
\end{lstlisting}

\begin{tikzpicture}[use tikzmark]
\draw[fill=gray,opacity=0.1]
  ([shift={(-3pt,2ex)}]pic cs:a) 
    rectangle 
  ([shift={(3pt,-0.65ex)}]pic cs:b);
\end{tikzpicture}


\end{document}

重复使用 tikzmark 名称

相关内容