因此,我listings
使用该选项在代码列表中换行breaklines
。幸运的是,在大多数情况下,我可以保留默认换行符,因为我列出的 Python 代码对换行相当宽容(PEP8 甚至更喜欢隐式延续而不是显式延续)。但是,该规则有一个例外,那就是评论。Python 没有块注释,只有行注释,换行注释意味着你必须#
在换行符后放置一个注释字符 ( ),就像 Python 注释不能以反斜杠继续
例如:
\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[language=python,breaklines=true]
# This is a really quite long Python comment that causes lines to wrap. We keep on going...and going...and going, just like a snake that swallowed the Energizer bunny.
\end{lstlisting}
\end{document}
这会产生一个非常不理想的结果(如果不先清理干净,您就无法将其复制粘贴回编辑器并运行它):
我知道这个答案您可以使用宏postbreak=
,但我如何获得有条件的我想要的行为是,它#
仅在包装注释时插入,而不是常规的源代码行?
答案1
我找到了一种方法,让评论的每一行都以 开头#
。我没有对此进行广泛的测试,因此我不确定这是否会破坏其他功能。
\documentclass{article}
\usepackage{listings}
\makeatletter
\lst@AddToHook{AfterBeginComment}{%
\CommentLinetrue%
}
\makeatother
\newif\ifCommentLine%
\newcommand*{\CommentLineContinued}{\ifCommentLine\#\space\fi}
\begin{document}
\begin{lstlisting}[%
language=python%
,breaklines=true%
,postbreak=\CommentLineContinued%
]
this is a test of a really long python code line which causes lines to wrap. We keep on going...and going...and going, just like a snake that swallowed the Energizer bunny.
# This is a really quite long Python comment that causes lines to wrap. We keep on going...and going...and going, just like a snake that swallowed the Energizer bunny.
this is a test of a really long python code line which causes lines to wrap. We keep on going...and going...and going, just like a snake that swallowed the Energizer bunny.
\end{lstlisting}
\end{document}
编辑:的另一种定义\CommentLineContinued
,使宏更加灵活(如果您打算在同一文档中对多种语言使用此方法):
\newcommand*{\CommentLineContinuedSymbol}{\#\space}% default value
\newcommand*{\CommentLineContinued}[1][]{%
\ifx\relax#1\relax\else%
\gdef\CommentLineContinuedSymbol{#1}%
\fi%
\ifCommentLine\CommentLineContinuedSymbol\fi}%
这样,您可以使用可选参数来改变所使用的符号,直到下次使用可选参数为止。
如果在键之外指定可选参数postbreak=
,它应该只会改变符号但不会打印任何内容。
请注意,如果您想在列表中使用可选参数key=value
,则必须用花括号将命令括起来:(postbreak={\CommentLineContinued[//\space]}
用于类似 C++ 的注释)。