Leute, versucht niemals unter Miktex pygmentize zum Laufen zu kriegen. Für alle, die nicht wissen was das ist:
Das wohl beste Syntax-Highlighting, das man für Latex kriegen kann. Unter anderem setzen das auch github und andere ein, nur halt dann nicht unter Latex. ;)
Das fängt schon mit der Installation an: Python habe ich hier so wie so drauf, so weit so gut. Dann wollen die erstmal irgendwelche eigenen Installationsroutinen (
easy_install, yo dawg!), um überhaupt pygmentize installieren zu können. WTF? Könnten die das bitte als ganz normales Python Paket anbieten, so wie jeder andere auch? Gut, wenn man das über sich ergehen lässt, kommt als nächstes die Installation von dem Latex Paket
minted. Auf Kompilieren gedrückt, gewartet bis Miktex sich aktualisiert hat und … Schrott.
Die Programmüberprüfung via
\ifAppExists im minted-Paket funktioniert nicht unter Windows. Also in der
minted.sty herumhacken, spezifisch einfach den ganzen Kram auskommentieren (ich habe eine gültige pigmentize-Installation, danke!):
Code: Alles auswählen
% \TestAppExists{pygmentize}
% \ifAppExists\else
% \PackageError{minted}
% {You must have `pygmentize' installed
% to use this package}
% {Refer to the installation instructions in the minted
% documentation for more information.}
% \fi
Das ist übrigens ein
bekannter Fehler. Aber warum irgendetwas ändern?
Und weiter gehts: Nochmal durchgejagt, und was kommt?
Usage: C:\Programme\Python\Scripts\pygmentize-script.py [-l <lexer> | -g] [-F <filter>[:<options>]] [-f <formatter>] … sieht nicht gut aus. Die Parameter sind Müll. Also wieder in die
minted.sty reingeschaut, und da steht:
Code: Alles auswählen
\immediate\write18{pygmentize -S #1 -f latex > \jobname.pyg}
Nur dumm, dass wegen dem
--shell-escape von Miktex alle Parameter in Anführungszeichen gesetzt werden (das ist nicht kritisch), und alle Sonderzeichen escaped werden, d.h. aus
> wird
^> gemacht. Unterdessen haben sich die Leute von pygmentize gedacht, hach, machen wir doch einfach mal kein Python-Skript mehr für Windows, sondern kompilieren das als Executable. Also kommt das Herumschreiben am Python-Skript nicht in Frage. Was also machen?
Da Krishty ja bereits die vorzüglichen Vorzüge des Batch-Skriptings hier kundgetan hat, und ich firm in der Standardaufrufsreihenfolge unter Windows bin (es ist die gleiche wie für DLLs, siehe
hier), muss man einfach eine
pygmentize.bat in den
miktex\bin Pfad von Miktex erstellen. Diese wird dann als erstes von Miktex aufgerufen, weil sie ja im lokalen Ordner liegt, und diese ruft wiederum die
pygmentize.exe auf. Ganz schnell folgendes hingerotzt:
Code: Alles auswählen
@echo off
if "%~5" == "^>" (
C:\Programme\Python\Scripts\pygmentize.exe %~1 %~2 %~3 %~4 > %~6
exit
)
set param1=%1
set param2=%2
set param3=%3
set param4=%4
set param5=%5
set param6=%6
set param7=%7
set param8=%8
set param9=%9
shift
set param10=%9
shift
set param11=%9
shift
set param12=%9
shift
set param13=%9
set "param8fixed=%param8%"
set "param10fixed=%param10%"
C:\Programme\Python\Scripts\pygmentize.exe %param1% %param2% %param3% %param4% %param5% %param6% %param7% %param8fixed% %param9% %param10fixed% %param11% %param12% %param13%
Und so wie ich das sehe, funktioniert nun alles. Und diese Beschreibung enthält nicht die schätzungsweise 15 fehlgeschlagenen Versuche, das irgendwie anders hinzubekommen, und zwar auch so, dass wenn sich Miktex ein neues Paket holt, man nicht wieder alles neu machen muss. Übrigens schweigt sich sowohl die Dokumentation von pygmentize wie auch von minted vollständig über diese Sache aus.
Nachtrag: Ich habe nunmehr auch die Font-Optionen von minted zum Laufen gekriegt (für die Wissenden: Es fixt die
\minted@define@extra und
\minted@define@extra@switch Optionen). Ich bin nicht stolz auf obiges Skript (eigentlich schäme ich mich dafür), aber es ist nun einmal ein typischer „Kleber“ zwischen einer Anwendung und einer anderen Anwendung, die nicht so recht zusammenpassen wollen. Dieser Nachtrag ist aber meiner Meinung nach notwendig, da obige Lösung bestimmt irgendwann via Google gefunden wird (bei dem Pagerank hier!), und ich niemanden eine halb-gare Lösung anbieten will.
Und auch mal nen Screenshot gemacht:
