我想注释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
我看到两种可能的方法来在需要时在行号后自动打印( - )或(+):
- 手动标记线条并进行一些解析。
- 在环境的开头指定添加/删除的行
lstlisting
。
方法 1 似乎太复杂了。方法 2 虽然不太方便用户使用,但似乎更容易设置,特别是如果您创建两个新listings
键来指定添加/删除的行列表。
这是方法 2 的实现。从算法复杂度来看,它可能不是很巧妙,但似乎可以解决问题。它与 和 都兼容numbers=left
。numbers=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}