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
这是一个利用tikzmark
s 可以有前缀和后缀这一事实的解决方案。我们创建一个新的计数器,将其用作自动附加的后缀。然后,每次使用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}