注释列表中的插入/删除

注释列表中的插入/删除

我想注释lstlisting环境中的一些行,表示它们已被添加或删除。为此,我想在行号旁边放置一个(+)或符号,如下所示:(-)

1       function foo {
2(-)      printf 'Hello whirled\n';
3(+)      printf 'Hello world\n';
4       }

有没有好的方法可以使用该listings包来实现这一点?到目前为止,我只是使用手动间距技巧来实现这一点。

这是一个小小的起点:

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[numbers=left,escapechar=",numbersep=8mm]
function foo {
"\rlap{\hspace{-7mm}\tt (-)}"  printf 'Hello whirled\n';
"\rlap{\hspace{-7mm}\tt (+)}"  printf 'Hello world\n';
}
\end{lstlisting}
\end{document}
\end{document}

答案1

我看到两种可能的方法来在需要时在行号后自动打印( - )或(+):

  1. 手动标记线条并进行一些解析。
  2. 在环境的开头指定添加/删除的行lstlisting

方法 1 似乎太复杂了。方法 2 虽然不太方便用户使用,但似乎更容易设置,特别是如果您创建两个新listings键来指定添加/删除的行列表。

这是方法 2 的实现。从算法复杂度来看,它可能不是很巧妙,但似乎可以解决问题。它与 和 都兼容numbers=leftnumbers=right您可以使用pgffor语法(例如1,...,4,7)来列出添加/删除的行。

在此处输入图片描述

\documentclass{article}

\usepackage{listings}
\usepackage{pgffor}

\makeatletter

% define a new listings key for specifying a list of added lines
\newcommand\listofaddedlines@jw{}
\lst@Key{addedlines}\relax{%
  \edef\listofaddedlines@jw{#1}%
}

% define a new listings key for specifying a list of deleted lines
\newcommand\listofdeletedlines@jw{}
\lst@Key{deletedlines}\relax{%
  \edef\listofdeletedlines@jw{#1}%
}

% redefiniion of the numbers key
% (I only inserted my \printdeloraddsign@jw in two places)
\lst@Key{numbers}{none}{%
    \let\lst@PlaceNumber\@empty
    \lstKV@SwitchCases{#1}%
    {none&\\%
     left&\def\lst@PlaceNumber{\llap{\normalfont
                \lst@numberstyle{\thelstnumber\printdeloraddsign@jw}\kern\lst@numbersep}}\\%
     right&\def\lst@PlaceNumber{\rlap{\normalfont
                \kern\linewidth \kern\lst@numbersep
                \lst@numberstyle{\thelstnumber}\printdeloraddsign@jw}}%
    }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}}

% auxiliary switch (used in \printdeloraddsign@jw)
\newif\ifaddordel@jw@

% macro for printing (+) or (-) or a hphantom equivalent
\newcommand\printdeloraddsign@jw{%
  \foreach \linenum in \listofaddedlines@jw{%
    \ifnum\thelstnumber=\linenum\relax%
      {\ttfamily(+)}%
      \global\addordel@jw@true%
    \fi
  }%
  \foreach \linenum in \listofdeletedlines@jw{%
    \ifnum\thelstnumber=\linenum\relax%
      {\ttfamily(-)}%
      \global\addordel@jw@true%
    \fi
  }%
  \ifaddordel@jw@\else
    \hphantom{\ttfamily(-)}%
  \fi
      \global\addordel@jw@false%
}

\makeatother

\begin{document}

\begin{lstlisting}[numbers=left,deletedlines=2,addedlines=3]
function foo {
  printf 'Hello whirled\n';
  printf 'Hello world\n';
}
\end{lstlisting}

\begin{lstlisting}[numbers=right,deletedlines={2,...,4},addedlines=5]
function foo {
  printf 'Hello whirled\n';
  \* rubbish *\
  \* more rubbish *\
  printf 'Hello world\n';
}
\end{lstlisting}

\end{document}

相关内容