我想在 lstlisting 环境中围绕几个单词绘制一个矩形(仅轮廓,未填充)。我尝试了以下方法,但它不会像 lstlisting 那样将框内的文本视为“逐字”。(因此,例如,“%”被解释为开始注释。)理想情况下,我想要一个可以与“moredelim”一起使用的解决方案,这样我就可以在需要时轻松绘制这些框。以下是我到目前为止所做的:
\documentclass{article}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc,shapes,positioning}
\newcommand\tbox[1]{\tikz[overlay]\node[inner sep=2pt, draw=red, ultra thick, anchor=text, rectangle] {#1};\phantom{#1}}
\begin{document}
\begin{lstlisting}[escapechar=!]
#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 ( !\tbox{``z %d = %lf\n''}!, i, z );
z = pow(z,2) + c;
}
}
\end{lstlisting}
\end{document}
答案1
感谢上面的 Ignasi 向我指出这一点:
根据那里的示例,我重新编写了示例代码,如下所示。这是一个不错的解决方案,因为它让我可以自然地编写代码,然后根据需要添加标记以指示框的位置。
\documentclass{article}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc,shapes,positioning,tikzmark}
\begin{document}
\begin{lstlisting}[escapechar=!]
#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}
\end{document}
答案2
甚至\savebox{\tempbox}{\verb...}
不起作用。我不得不使用纯 TeX 版本。
\documentclass{article}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc,shapes,positioning,tikzmark}
\newcommand\tbox[1]{\tikz[baseline]{\node[inner sep=2pt, draw=red, ultra thick, anchor=text, rectangle] {#1};}}
\newsavebox{\tempbox}
\begin{document}
\setbox\tempbox=\hbox{\verb$``z %d = %lf\n''$}
\begin{lstlisting}[escapechar=!]
#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 ( !\tbox{\usebox{\tempbox}}!, i, z );
z = pow(z,2) + c;
}
}
\end{lstlisting}
\end{document}