Hervorhebung des Quellcodes in LaTeX

196

Ich muss den Quellcode in LaTeX hervorheben. Das Paket listingsscheint die beste Wahl für die meisten Anwendungsfälle zu sein, und für mich war es das bis jetzt.

Jetzt brauche ich jedoch mehr Flexibilität. Im Allgemeinen suche ich einen echten Lexer. Insbesondere muss ich (für eine eigene Sprachdefinition) eigene Zahlenstile definieren (und hervorheben!). listingserlaubt nicht das Hervorheben von Zahlen im Code. Ich muss jedoch so etwas produzieren:

Erforderliches Ergebnis

listingskann auch nicht mit beliebigen Trennzeichen für Zeichenfolgen umgehen. Betrachten Sie den folgenden gültigen Ruby-Code:

s = %q!this is a string.!

Hier !kann durch fast jedes Trennzeichen ersetzt werden.

(Das listingsmit Unicode nicht umgehen kann ist auch ziemlich ärgerlich, aber das ist ein anderes Problem.)

Idealerweise suche ich nach einer Erweiterung listings, mit der ich komplexere Lexing-Regeln bereitstellen kann. Abgesehen davon suche ich auch nach tragfähigen Alternativen.

Andere Threads haben die Verwendung von Pylements vorgeschlagen, die eine LaTeX-Ausgabe erzeugen können. Es gibt sogar ein Paket - texments- um den Übergang zu erleichtern.

Diesem fehlen jedoch schmerzliche Merkmale. Insbesondere interessieren mich listingsZeilennummern im Stil, Quellcode-Zeilenreferenzen und die Möglichkeit, LaTeX in den Quellcode einzubetten (Optionen texclund mathescapein listings).

Als Beispiel hier ein Quellcode-Satz, listingsder einige der Dinge zeigt, die ein Ersatz auch bieten sollte:

Beispiel für LaTeX-Listings: Seitwärts hinzufügen ["Seitwärtszugabe" geändert von Bit Twiddling Hacks]

Konrad Rudolph
quelle
Wenn Sie nicht zögern, externe Tools wie Pygements einzubringen, schreiben Sie doch einfach ein Makefile für Ihr Dokument.
Mica
6
Sollte dies nicht auf tex.stackexchange.com migriert werden ? ^^
Matthias
1
@ Matthias Nicht sicher. Als ich es gepostet habe, gab es keine tex.se, aber jetzt scheint es hier ziemlich nützlich zu sein - die Frage hat ein enormes Echo gehabt, während auf TeX.SE bisher niemand eine ähnliche Frage gepostet hat. Darüber hinaus bezieht es sich tatsächlich speziell auf Programmier- und Programmierwerkzeuge, sodass ich denke, dass Programmierer die Menschen sind, die davon profitieren.
Konrad Rudolph
1
Für diejenigen, die LaTeX für das Dokument vergessen haben, das sie gerade schreiben: Beachten Sie, dass Sie mit Office Word oder LibreOffice Writer einfach Ihren Code von z. B. Eclipse dorthin kopieren / einfügen und Ihre Farben erhalten lassen !!
MohamedEzz
3
@MemoryLeaks Ich bin mir nicht sicher, wer dieser Rat fürchterlich nützlich ist: Office-Software ist kein gültiger Ersatz für LaTeX ( keine Office-Software, sondern ein Desktop-Publishing-System, was auf den Punkt gebracht bedeutet, dass es eine viel bessere Typografie bietet , abgesehen von all seinen anderen Vorteilen gegenüber Office-Software).
Konrad Rudolph

Antworten:

352

Ich habe mir Normans Rat zu Herzen genommen und eine Lösung gehackt, die ( gepatchte ) Pylements zum Hervorheben verwendet und so viele Funktionen wie möglich hinzugefügt hat, ohne zu platzen ;-)

Ich habe auch ein LateX-Paket erstellt, nachdem mein Pylements-Patch in Version 1.2 veröffentlicht wurde .

Präsentiert geprägt

Geprägt ist ein Paketdas Verwendung Pygments erstklassige Syntax in LaTeX Hervorhebung bereitzustellen. Beispielsweise ermöglicht es die folgende Ausgabe.

ausgefallenes LaTeX-Beispiel

Hier ist eine minimale Datei, um den obigen Code zu reproduzieren (beachten Sie, dass für das Einfügen von Unicode-Zeichen möglicherweise XeTeX erforderlich ist)!

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{minted}

\setsansfont{Calibri}
\setmonofont{Consolas}

\begin{document}
\renewcommand{\theFancyVerbLine}{
  \sffamily\textcolor[rgb]{0.5,0.5,0.5}{\scriptsize\arabic{FancyVerbLine}}}

\begin{minted}[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]{csharp}
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

Dies kann mit dem folgenden Befehl gesetzt werden:

xelatex -shell-escape test.tex

(Aber geprägt prägt funktioniert auch mit latexund pdflatex…)

minted.styfunktioniert ähnlich, texments.styerlaubt aber zusätzliche Funktionen.

Wie man es bekommt

Nochmals vielen Dank an Norman, der mich motiviert hat, dieses Paket zu produzieren.

Konrad Rudolph
quelle
19
Nach stundenlangem Suchen nach der Verwendung von Pygementen mit LaTeX und mehr stundenlangem Versuch, meine eigene Lösung zusammen zu hacken, ist dies das Beste, was ich gefunden habe. Besser noch, es funktioniert tatsächlich. Danke dafür.
Sykora
2
hier nur um die Arbeit zu würdigen, die du auf eine werdende Weise geleistet hast;)!
Filip Dupanović
4
@ Paul: Es ist wahr, dass das Ganze unter Windows ziemlich chaotisch ist. :-( Hoffentlich wird die nächste Version von Pylements dies etwas lindern, aber für Leute, die nicht oft mit Python arbeiten (und daher easy_install), wird der Prozess nie sehr reibungslos verlaufen.
Konrad Rudolph
1
Auf der TeX SE-Website gibt es jetzt einige Fragen zu Ihrem Paket , und ich habe nur eine mit einer Art Funktionsanforderung (in den Kommentaren versteckt) beantwortet . Vielleicht möchten Sie einen Blick darauf werfen.
Paŭlo Ebermann
1
@ Paŭlo Danke. Ich versuche, alle Erwähnungen des Pakets zu lesen (ich habe eine Google-Benachrichtigung), aber es gelingt mir nicht immer. Die Frage, die Sie erwähnt haben, habe ich tatsächlich gelesen (anscheinend: Ich habe sie positiv bewertet, kann mich aber nicht erinnern), aber sie ist überhaupt nicht einfach. "Ab" mit TikZ dafür scheint ein schlechter Hack zu sein ...
Konrad Rudolph
6

TeX ist (bekanntlich) Turing-vollständig, aber ich bin mir ziemlich sicher, dass Sie diese Erweiterung selbst schreiben müssen. Die Dokumentation macht deutlich, dass der ursprüngliche Autor von listingsOrphaned es im Jahr 2004 verwaist hat und dass es seit 2006 nicht mehr aktualisiert wurde. Das Paket wurde nicht entwickelt, um die Formatierung von numerischen Literalen zu überschreiben, aber Sie können es möglicherweise ändern, indem Sie das ändern Definition von \lst@ProcessDigit. Wenn dies nicht funktioniert, müssen Sie im Detail verstehen, wie die Optionen "Bezeichnerstil" funktionieren, und Sie müssen diese Maschinerie für Ihre numerischen Literale duplizieren.

Ich verstehe nicht ganz, warum Sie es so ablehnen, ein externes Tool in Ihre Toolchain aufzunehmen, aber weil Sie es sind, müssen Sie zusätzliche Arbeit leisten. Nach einem Blick auf den Quellcode erwarte ich, dass Änderungen listingsmöglich sein sollten, aber ich persönlich würde mich dafür entscheiden, stattdessen mein LaTeX vorzuverarbeiten.

Norman Ramsey
quelle
Ich zögere überhaupt nicht, externe Tools einzuführen - tatsächlich denke ich, dass die Verwendung von Pylements wahrscheinlich die beste Lösung ist. Die Frage ist, wie man das auf intelligente Weise macht, damit ich immer noch zu LaTeX und \labels im Code entkommen kann.
Konrad Rudolph
Was das Ändern angeht listings, habe ich mir bereits die Quelle angesehen - und leider verstehe ich es überhaupt nicht. Meine TeX-Fähigkeiten sind bei weitem nicht so hoch. Bisher habe ich sowieso nur die LaTeX-Teilmenge von TeX verwendet.
Konrad Rudolph
1
Ich würde sagen, dass das größte Problem bei der Einführung eines externen Tools darin besteht, dass Sie veröffentlichen. Viele Zeitschriftenverlage (Husten-Husten SPRINGER und andere) benötigen die Einreichung in rohem LaTex, das dann auf ihren Servern kompiliert wird. Unnötig zu erwähnen, dass Sie SOL sind, wenn sich Ihr Drittanbieter-Tool nicht auf dem Server befindet, es sei denn, Sie verarbeiten es vorab (was den größten Teil des Nutzens von Tex-Laufwerken zunichte macht).
Namey
Wenn die Dokumentation korrekt ist, wird das Listings-Paket weiterhin verwaltet - der Betreuer hat sich jedoch geändert und Bugfixes erhalten: ctan.org/pkg/listings?lang=de
DetlevCM
1
@Namey, nur ein Datenpunkt: Ich habe es gerade geschafft, ein Papier mithilfe minteddes LNCS-Veröffentlichungsprozesses von Springer erfolgreich zu schleichen .
Volker Stolz
3

Dies ist ein Paket, das Quellcode mit Syntaxhervorhebung in TeX und LaTeX konvertiert. Es ist einfach, benutzerdefinierte Programmiersprachendefinitionen hinzuzufügen.

Highlight unterstützt 100 Programmiersprachen und enthält 50 Farbthemen. Es bietet Code-Neuformatierung und Einrückung.

Ich habe es nicht benutzt, um zu wissen, wie gut es funktioniert, aber jemand anderes, den ich kenne, sagte, dass es ziemlich gut funktioniert hat. Wenn ich die Gelegenheit dazu bekomme, werde ich es selbst ausprobieren und sehen.

homerj
quelle
1
highlightteilt jedoch alle Probleme von Pylements. Insbesondere handelt es sich trotz der Beschreibung nicht um ein LaTeX-Paket . Es ist einfach ein eigenständiges Programm. Das Problem ist, genau wie bei Pylements, wie man es in LaTeX sinnvoll einsetzt und all die schönen Dinge bereitstellt, die es listingsgibt.
Konrad Rudolph