列表——将断线注释改为注释

列表——将断线注释改为注释

因此,我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}

这会产生一个非常不理想的结果(如果不先清理干净,您就无法将其复制粘贴回编辑器并运行它):

上述 LaTeX 代码的输出

我知道这个答案您可以使用宏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++ 的注释)。

相关内容