使用 Listings 隐藏 Python 注释

使用 Listings 隐藏 Python 注释

我想包含要用列表格式化的 Python 代码,但我只希望代码整洁紧凑。不应打印任何注释,也不应打印空行。

简单的方法是删除代码中的注释,但这是绕过问题而不是找到解决方案。我想要一个解决方案。解决方案意味着我不必编辑正在导入的源文件。

我尝试了以下方法:

方法 1

\lstdefinestyle{py_without_comments}{%
    language     = python,
    morecomment  = [l][\nullfont]{\#},
    emptylines   = *1,
}

它不会打印注释,但由于文本到达输出,所以行会保留在那里,只是 LaTeX 用 打印它nullfont

方法 2

\lstdefinestyle{py_without_comments}{%
    language     = python,
    morecomment  = [is]{\#}{\^^M},
    emptylines   = *1,
}

方法 2 忽略从行首到行尾的所有注释行#。问题是,行尾也会消失!假设您有以下代码:

def foo():
    if cond1: bar() #Some explanation
    if cond2: baz() #Some other explanation
    if cond3: bye() #Even more explanations

打印结果如下:

def foo():
    if cond1: bar()        if cond2: baz()        if cond3: bye()

这是不受欢迎的、不符合蟒蛇风格的、而且很丑陋。

方法 3

\lstdefinestyle{py_without_comments}{%
    language     = python,
    morecomment  = [il]{\#},
    emptylines   = *1,
}

这个应该可以很好地工作,但由于某种原因,它会抹去从第一个注释开始的所有代码(参见foo()示例)。

因此,我正在寻找其他方法尝试。这可能是因为列表无法实现吗?

提前欢呼并致谢。


编辑1:

可以找到 MWE这里

答案1

这是可行的方法。它使用了一些listings' 内部函数。我不确定是否有更好的解决方案。使用行尾分隔符(上面的方法 2)并在行不为空时将其添加回来似乎不起作用。

\documentclass[11pt]{article}
\usepackage{xcolor}
\usepackage{listings}

% Default settings.
\lstset{
  basicstyle=\ttfamily,
  numbers=left,
  numbersep=5pt,
  numberstyle=\tiny\color{gray},
  rulecolor=\color{black},
}

% The \incomment macro and auxiliary stuff.
\newif\ifnocomment
\newif\ifemptyline
\makeatletter
% When a line starts, it's empty and we're not in a comment.
\lst@AddToHook{InitVarsBOL}{\global\emptylinetrue\global\nocommenttrue}
% When something is printed, the line is not empty.
\lst@AddToHook{PostOutput}{\global\emptylinefalse}
% When we're in a comment...
\def\incomment#1{%
  % if we just entered...
  \ifnocomment%
    \global\nocommentfalse%
    % and the line is empty, then remove this line.
    \ifemptyline\global\advance\lst@newlines\m@ne\fi%
  \fi}
\makeatother

\lstdefinestyle{python_without_comments}{%
  language=python,
  morecomment=[l][\incomment]{\#},
}

\begin{document}
\begin{lstlisting}[style=python_without_comments]
def f(x): return x + 1 #

# This is function foo...
def foo():
  if cond1: bar()  # Some explanation
  if cond2: baz()  # Some other explanation
  if cond3: bye()  # Even more explanations

# And this is function bar
def bar():  # let's see
  # some more comment
  return 42 # here?
\end{lstlisting}
\end{document}

结果是: 结果

如果有注释,它可能会打印一个空行在文本末尾;我不确定如何删除它。


编辑:我原来的答案使用了 hookOutputBox而不是PostOutput。这对制表符不起作用。

相关内容