Python-Kommentare mit Listings ausblenden

Python-Kommentare mit Listings ausblenden

Ich möchte Python-Code einbinden, der mit Listen formatiert werden soll, aber ich möchte, dass der Code ordentlich und kompakt ist. Es sollen überhaupt keine Kommentare gedruckt werden, ebenso wenig wie leere Zeilen.

DereinfachDer beste Weg wäre, den Code von Kommentaren zu befreien, aber das umgeht das Problem und führt nicht zu einer Lösung. Ich möchte eine Lösung. Eine Lösung würde bedeuten, dass ich die importierte Quelldatei NICHT bearbeiten muss.

Ich habe Folgendes versucht:

Ansatz 1

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

Dadurch werden die Kommentare nicht gedruckt, aber die Zeilen bleiben dort, da der Text die Ausgabe erreicht, nur dass LaTeX ihn mit druckt nullfont.

Ansatz 2

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

Ansatz 2 ignoriert alle Kommentarzeilen vom Ende #bis zum Ende der Zeile. Das Problem ist, dass auch das Ende der Zeile verschwindet! Angenommen, Sie haben diesen Code:

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

Der Ausdruck würde folgendermaßen aussehen:

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

Das ist unerwünscht, unpythonisch und hässlich.

Ansatz 3

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

Dies sollte einwandfrei funktionieren, löscht jedoch aus irgendeinem Grund den gesamten Code ab dem ersten Kommentar (siehe foo()Beispiel).

Ich suche daher nach etwas anderem, das ich ausprobieren kann. Kann es sein, dass dies mit Listings nicht möglich ist?

Grüße und Danke im Voraus.


Bearbeitung 1:

MWE finden SieHier

Antwort1

Hier ist etwas, das funktioniert. Es spielt mit einigen der listingsinternen Komponenten von '. Ich bin nicht sicher, ob es eine bessere Lösung gibt. Das Verwenden des Zeilenende-Trennzeichens (Ihr Ansatz 2 oben) und dessen erneutes Hinzufügen, wenn die Zeile nicht leer ist, scheint nicht zu funktionieren.

\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}

Das Ergebnis ist: Ergebnis

Wenn Kommentare vorhanden sind, wird am Ende des Textes möglicherweise eine leere Zeile gedruckt. Ich weiß nicht genau, wie ich das entfernen kann.


Bearbeiten: In meiner ursprünglichen Antwort wurde „hook“ OutputBoxanstelle von verwendet PostOutput. Mit Tabs funktionierte das nicht gut.

verwandte Informationen