2

Je travaille sur un document de latex qui nécessitera la composition de quantités significatives de code source python. J'utilise pygments (le module python, pas la démo en ligne) pour encapsuler ce python en latex, qui fonctionne bien sauf dans le cas de longues lignes individuelles - qui continuent simplement sur la page. Je pourrais envelopper manuellement ces lignes, sauf que cela ne me semble pas une solution élégante, et je préfère passer du temps à m'interroger sur des solutions automatisées fous que sur des tâches répétitives. Ce que je voudrais, c'est un moyen de traiter le code source python pour envelopper les lignes à une certaine longueur maximum de caractères, tout en préservant la fonctionnalité. J'ai joué avec un peu de python et le plus proche est d'insérer \\\n dans le dernier espace avant la longueur de ligne maximale - mais bien sûr, si cela se termine par des chaînes et des commentaires, les choses vont mal. Franchement, je ne sais pas comment aborder ce problème. Donc, est-ce que quelqu'un est au courant d'un module ou d'un outil qui peut traiter le code source de sorte qu'aucune ligne ne dépasse une certaine longueur - ou au moins une bonne façon de commencer à coder quelque chose comme ça?Enveloppe de ligne de source python sensée pour l'impression

Répondre

3

Vous pouvez prolonger votre approche actuelle un peu, mais en utilisant le module tokenize de la bibliothèque standard pour déterminer où mettre vos sauts de ligne. De cette façon, vous pouvez voir les jetons réels (COMMENT, STRING, etc.) de votre code source plutôt que les mots séparés par des espaces.

Voici un court exemple de ce que peut faire tokenize:

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

Maintenant que cela semble prometteur, je vais regarder dans le module tokenize. Merci! – Markus

+0

J'imagine que c'est le chemin à parcourir. Le code postal sera une autre réponse lorsque j'aurai l'occasion d'y revenir. – Markus

1

Je vérifierais un outil de reformatage dans un éditeur comme NetBeans. Lorsque vous reformatez java, il corrige correctement les longueurs de lignes à l'intérieur et à l'extérieur des commentaires, si le même algorithme était appliqué à Python, cela fonctionnerait.

Pour Java, il vous permet de définir n'importe quelle largeur d'enrobage et un tas d'autres paramètres. Je serais assez surpris si cela n'existait pas natif ou en tant que plugin.

Ne peut pas dire à coup sûr pas de la description, mais il vaut la peine d'essayer:

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

+0

reformatage java est susceptible d'être un peu plus facile que la même chose en Python. Quelqu'un peut-il confirmer si Netbeans (ou tout autre éditeur) est capable de le faire correctement? – SingleNegationElimination

+0

Une solution moins intelligente mais similaire dans Vim consisterait à sélectionner visuellement les données à «re-columniser» et à appuyer sur 'gw' pour permettre aux colonnes d'avoir une largeur maximale de tout ce que« textwidth »est actuellement défini. Mais cette astuce Vim fonctionne mieux sur le texte en clair que le code source. –

2

J'utilise le paquet listings dans LaTeX pour insérer le code source; il fait ressortir la syntaxe, linebreaks et al.

Mettez ce qui suit dans votre préambule:

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

Le paquet a crochet pour le code en ligne, y compris les fichiers entiers, montrant comme chiffres, ...

+0

Bon conseil, je vais certainement essayer. – Markus

Questions connexes