如何删除所有(行和块)注释的列表而不留空格?

如何删除所有(行和块)注释的列表而不留空格?

我正在寻找一种简单而可靠的方法来删除列表中的所有注释。我的方法(传递\@gobblecommentstyle键)正确地删除了所有单行注释和块注释。但是,块注释留下的空白仍然存在,在我的列表中造成了无用的空白。请参见下面的屏幕截图(红色矩形是我强调的)。有什么想法吗?

在此处输入图片描述

\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,至少必须记录下来。

相关内容