我想包含要用列表格式化的 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
。这对制表符不起作用。