2009-06-23 12 views
2

Ich arbeite an einem Latex-Dokument, das das Setzen beträchtlicher Mengen von Python-Quellcode erfordern wird. Ich benutze pygments (das Python-Modul, nicht die Online-Demo), um diesen Python in Latex einzukapseln, was gut funktioniert, außer bei langen einzelnen Zeilen - die einfach von der Seite fortfahren. Ich könnte diese Zeilen manuell umbrechen, mit der Ausnahme, dass dies für mich keine elegante Lösung ist, und ich bevorzuge es, Zeit mit verrückten automatisierten Lösungen zu verbringen, anstatt mit sich wiederholenden Aufgaben.Sensible Python-Quellcode-Umbruch für Ausdruck

Was ich möchte ist eine Möglichkeit, den Python-Quellcode zu verarbeiten, um die Zeilen auf eine bestimmte maximale Zeichenlänge zu wickeln, während die Funktionalität erhalten bleibt. Ich habe mit etwas Python herumgespielt und das nächste, was ich habe, ist \\\n in den letzten Leerzeichen vor der maximalen Zeilenlänge einzufügen - aber natürlich, wenn dies in Strings und Kommentaren endet, gehen die Dinge schief. Ehrlich gesagt bin ich nicht sicher, wie ich dieses Problem angehen soll.

Wer kennt also ein Modul oder ein Werkzeug, das Quellcode verarbeiten kann, so dass keine Zeilen eine bestimmte Länge überschreiten - oder zumindest ein guter Weg, um etwas zu programmieren?

Antwort

3

Sie möchten Ihren aktueller Ansatz ein wenig verlängern, aber das tokenize Modul aus der Standard-Bibliothek um zu bestimmen, wo Sie Ihre Zeilenumbrüche setzen sollen. Auf diese Weise können Sie die tatsächlichen Tokens (COMMENT, STRING usw.) Ihres Quellcodes und nicht nur die durch Leerzeichen getrennten Wörter sehen.

Hier ist ein kurzes Beispiel dafür, was tokenize tun kann:

>>> from cStringIO import StringIO 
>>> from tokenize import tokenize 
>>> 
>>> python_code = ''' 
... def foo(): # This is a comment 
...  print 'foo' 
... ''' 
>>> 
>>> fp = StringIO(python_code) 
>>> 
>>> tokenize(fp.readline) 
1,0-1,1: NL '\n' 
2,0-2,3: NAME 'def' 
2,4-2,7: NAME 'foo' 
2,7-2,8: OP '(' 
2,8-2,9: OP ')' 
2,9-2,10: OP ':' 
2,11-2,30: COMMENT '# This is a comment' 
2,30-2,31: NEWLINE '\n' 
3,0-3,4: INDENT ' ' 
3,4-3,9: NAME 'print' 
3,10-3,15: STRING "'foo'" 
3,15-3,16: NEWLINE '\n' 
4,0-4,0: DEDENT '' 
4,0-4,0: ENDMARKER '' 
+0

Nun sieht das vielversprechend aus, ich werde in das Tokenize-Modul schauen. Vielen Dank! – Markus

+0

Ich stelle mir vor, dass dies der richtige Weg ist. Wird Code als eine andere Antwort eingeben, wenn ich die Chance bekomme, darauf zurück zu kommen. – Markus

1

Ich würde ein Reformat-Tool in einem Editor wie NetBeans überprüfen.

Wenn Sie Java neu formatieren, behebt es die Länge von Zeilen innerhalb und außerhalb von Kommentaren richtig, wenn der gleiche Algorithmus auf Python angewendet würde, würde es funktionieren.

Für Java können Sie jede Verpackungsbreite und eine Reihe anderer Parameter einstellen. Ich wäre ziemlich überrascht, wenn das nicht nativ oder als Plugin wäre.

kann nicht sicher sagen, nur aus der Beschreibung, aber es ist ein Versuch wert:

http://www.netbeans.org/features/python/

+0

Neuformatierung java wahrscheinlich ist ein bisschen leichter sein, als das gleiche in Python. Kann jemand bestätigen, ob Netbeans (oder irgendein anderer Herausgeber) das richtig machen kann? – SingleNegationElimination

+0

Eine weniger intelligente, aber ähnliche Lösung in Vim wäre es, die Daten visuell zu "re-columnize" zu selektieren und 'gw' zu drücken, um Spalten eine maximale Breite zu lassen, was auch immer' textwidth' ist. Aber dieser Vim-Trick funktioniert im Klartext besser als der Quellcode. –

2

Ich benutze das listings Paket in LaTeX-Quellcode einfügen; es macht Syntax highlight, linebreaks et al.

Legen Sie die folgenden in Ihrer Präambel:

\usepackage{listings} 
%\lstloadlanguages{Python} # Load only these languages 
\newcommand{\MyHookSign}{\hbox{\ensuremath\hookleftarrow}} 

\lstset{ 
    % Language 
    language=Python, 
    % Basic setup 
    %basicstyle=\footnotesize, 
    basicstyle=\scriptsize, 
    keywordstyle=\bfseries, 
    commentstyle=, 
    % Looks 
    frame=single, 
    % Linebreaks 
    breaklines, 
    prebreak={\space\MyHookSign}, 
    % Line numbering 
    tabsize=4, 
    stepnumber=5, 
    numbers=left, 
    firstnumber=1, 
    %numberstyle=\scriptsize, 
    numberstyle=\tiny, 
    % Above and beyond ASCII! 
    extendedchars=true 
} 

Das Paket für Inline-Code hat Haken, ganze Dateien einschließlich, als Zahlen, die zeigen, ...

+0

Guter Tipp, ich werde es auf jeden Fall geben. – Markus

Verwandte Themen