我正在寻找一种简单而可靠的方法来删除列表中的所有注释。我的方法(传递\@gobble
给commentstyle
键)正确地删除了所有单行注释和块注释。但是,块注释留下的空白仍然存在,在我的列表中造成了无用的空白。请参见下面的屏幕截图(红色矩形是我强调的)。有什么想法吗?
\documentclass{article}
\usepackage{xcolor}
\usepackage[T1]{fontenc}
\renewcommand{\ttdefault}{pcr}
\usepackage{listings}
\makeatletter
\lstset%
{%
basicstyle = \ttfamily,
morecomment = [l]{//},
morecomment = [s]{/*}{*/},
frame = single,
commentstyle = \itshape\color[gray]{.5},
rulecolor = \color{black},
breaklines,
}
\makeatother
\usepackage{filecontents}
\begin{filecontents*}{sample.c}
#include <stdio.h>
/*
block comment taking up white space
*/
main()
{
float fahr, celsius;
float lower, upper, step;
lower = 0; /* lower limit of temperature scale */
upper = 300; /* upper limit */
step = 20; /* step size */
celsius = lower;
printf("\nCelsius\tFahr\n");
while (celsius <= upper)
{
fahr = (9.0/5.0) * celsius+32.0;
printf("%3.0f\t%6.1f\n", celsius, fahr);
celsius = celsius + step;
}
}
\end{filecontents*}
\begin{document}
\makeatletter
\lstinputlisting[caption={with comments}]{sample.c}
\lstinputlisting[caption={without comments},commentstyle={\@gobble}]{sample.c}
\makeatother
\end{document}
答案1
第一个版本
下面我定义了两种列表样式,其中第一种由第二种加载,然后第一个注释定义被覆盖。对于块注释我使用了 nvisible 变体。不过,这不适用于行注释(有关此内容的更多信息,请参见本答案的底部)。但您可以添加已经用作第二个可选参数的命令,效果很好:
\documentclass{article}
\usepackage{xcolor}
\definecolor{commentcolor}{gray}{.5}
\definecolor{rulecolor}{named}{black}
\usepackage[T1]{fontenc}
\renewcommand{\ttdefault}{pcr}
\usepackage{listings}
\lstdefinestyle{c_with_comments}%
{
basicstyle = \ttfamily,
language=c,
morecomment = [l]{//},
morecomment = [s]{/*}{*/},
frame = single,
commentstyle = \itshape\color{commentcolor},
rulecolor = \color{rulecolor},
breaklines,
}
\makeatletter
\lstdefinestyle{c_without_comments}%
{
style=c_with_comments,
morecomment = [l][\@gobble]{//},
morecomment = [is]{/*}{*/},
}
\makeatother
\usepackage{filecontents}
\begin{filecontents*}{sample.c}
#include <stdio.h>
/*
block comment taking up white space
*/
main()
{
float fahr, celsius;
float lower, upper, step;
lower = 0; /* lower limit of temperature scale */
upper = 300; // upper limit
step = 20; // step size
celsius = lower;
printf("\nCelsius\tFahr\n");
while (celsius <= upper)
{
fahr = (9.0/5.0) * celsius+32.0;
printf("%3.0f\t%6.1f\n", celsius, fahr);
celsius = celsius + step;
}
}
\end{filecontents*}
\begin{document}
\lstinputlisting[caption={with comments},style=c_with_comments]{sample.c}
\lstinputlisting[caption={without comments},style=c_without_comments]{sample.c}
\end{document}
第二版
第二个版本只有一行不同。输出相同,但这个版本很可能更安全(感谢@tohecz 的提示,参见他在这个答案下面的评论)。替换\@gobble
为\nullfont
:
morecomment = [l][\nullfont]{//},
\@gobble
以某种方式定义,它需要一个参数,并且可能存在并非整行都//
被视为这样的情况。
不幸的是,这个相当简单的方法(使用不可见的变体)只适用于块注释。行注释输出是剪切至整个列表的末尾! 给出错误代码并输出编辑修订 3这个答案。
我隐约记得,不得不再次搜索,但这里有来自 listings
文档的引用:
最后,您可能希望在任何注释类型上使用前缀 i。这样注释不仅不可见,而且会从输出中完全丢弃!
单行注释没有警告。看起来像是 中的一个错误listings
,至少必须记录下来。