Zeilenumbrüche mit lstlisting

Zeilenumbrüche mit lstlisting

Ich möchte mithilfe des Listings-Pakets mit ein paar Zeilen aus einer CSV-Datei anzeigen breaklines=true.

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{%
  backgroundcolor=\color{lightgray},
  basicstyle=\ttfamily\footnotesize,
  breaklines,
  showspaces
}

\begin{document}
\begin{lstlisting}
K01980;23S ribosomal RNA;11.79648646;17.54756407;16.55812848;7.070375553;9.904088434;10.33047681;11.34235283;12.84408234
K01977;16S ribosomal RNA;7.433653271;11.21805284;10.47502621;4.555449801;6.223779066;6.547853101;7.12047883;8.056722
K03046;DNA-directed RNA polymerase subunit beta' [EC:2.7.7.6];1.279373326;1.843958244;1.291530419;0.91598316;1.444456949;1.370082994;1.471863596;1.274232464
\end{lstlisting}
\end{document}

Allerdings ist das Ergebnis nicht ganz zufriedenstellend.

Bildbeschreibung hier eingeben

  • Der Umbruch erfolgt sehr früh, so dass am Ende der ersten Zeile viel Leerraum entsteht und die zweite Zeile die zur Verfügung stehende Textbreite überschreitet. In der zweiten Zeile erfolgt kein Zeilenumbruch.
  • Nach jeder Zeile steht eine Leerzeile.

Ich hätte gerne so etwas:

K01980;23S ribosomal RNA;11.79648646;17.54756407;16.55812848;
  7.070375553;9.904088434;10.33047681;11.34235283;12.84408234
K01977;16S ribosomal RNA;7.433653271;11.21805284;10.47502621;
  4.555449801;6.223779066;6.547853101;7.12047883;8.056722
K03046;DNA-directed RNA polymerase subunit beta' [EC:2.7.7.6];
  1.279373326;1.843958244;1.291530419;0.91598316;1.444456949;
  1.370082994;1.471863596;1.274232464

Antwort1

listingszerlegt keine Zeichenblöcke, wenn sie zur gleichen internen Kategorie gehören. In diesem FallBrief,ZifferUndandereKategorien sind von besonderem Interesse. Standardmäßig werden Zeichen den Kategorien wie erwartet zugeordnet, d. h. Buchstaben gehören zur KategorieBrief, Ziffern sindZifferund Symbole sindandere.

Wenn einBriefgefunden wird, alle folgendenBriefoderZifferZeichen werden gelesen, bis ein Nicht-Brief/nicht-Ziffergefunden wird. Diese Serie wird dann als ein Block ausgegeben. Dasselbe passiert nun mit allen Zeichen, die nichtBriefbis zum nächstenBriefgefunden wird. Die Verarbeitung der Eingabe auf diese Weise verhindert, dass die lange Reihe von Ziffern, Punkten und Semikolons in Ihrem Beispiel unterbrochen wird, da keineBriefwird gefunden, um einen neuen Block zu starten.

Hier sind zwei Vorschläge zur Lösung dieses Problems:

  • Ordnen Sie die Zeichenkategorien so an, dass die erstellten Blöcke den logischen Dateneinheiten Ihres spezifischen Anwendungsfalls entsprechen. Beispielsweise möchten Sie möglicherweise Ziffern und den Punkt auch in die Kategorie verschiebenBrief, wobei das Semikolon als Kategorie stehen bleibtandereDies kann erreicht werden durch Hinzufügen von

    alsoletter={0123456789.}
    

    zu \lstset. Zeilenumbrüche können jetzt auch nach allen Dezimalzahlen und nach dem Semikolon erfolgen.

  • Einfacher ist es, die literateOption zu verwenden und das Semikolon in eine Version umzudefinieren, die einen Zeilenumbruch nach dem Symbol zulässt:

    literate={;}{{;\allowbreak}}1
    

Beide Lösungen liefern nun das ansprechendere Ergebnis

Bildbeschreibung hier eingeben

verwandte Informationen