在列表内的文本周围绘制一个矩形

在列表内的文本周围绘制一个矩形

我想在 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}

带有逐字记录的保存框

相关内容