Question

Je travaille sur un document latex qui nécessitera la composition de quantités importantes 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 hors de la page. Je pourrais envelopper manuellement ces lignes, sauf que cela ne me semble pas une solution aussi élégante et je préfère passer mon temps à chercher des solutions automatisées insensées aux tâches répétitives.

Ce que j'aimerais, c'est un moyen de traiter le code source Python pour envelopper les lignes avec une certaine longueur de caractère maximale, tout en préservant les fonctionnalités. J'ai joué avec du python et le plus proche que je suis arrivé consiste à insérer \\\ n dans le dernier espace blanc avant la longueur de ligne maximale - mais bien sûr, si cela se termine en chaîne. et les commentaires, les choses vont mal. Franchement, je ne sais pas trop comment aborder ce problème.

Alors, est-ce que quelqu'un connaît un module ou un outil capable de traiter le code source de sorte qu'aucune ligne ne dépasse une certaine longueur - ou du moins un bon moyen de commencer à coder quelque chose comme ça?

Était-ce utile?

La solution

Vous voudrez peut-être élargir un peu votre approche actuelle, mais en utilisant le tokenize module de la bibliothèque standard pour déterminer où placer 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 seulement les mots séparés par des espaces.

Voici un court exemple de ce que tokenize peut faire:

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

Autres conseils

J'utilise le package listings de LaTeX pour insérer le code source; il met en évidence la syntaxe, les sauts de ligne et autres.

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 contient un crochet pour le code en ligne, y compris des fichiers entiers, en le montrant sous forme de chiffres, ...

Je vérifierais un outil de reformatage dans un éditeur tel que NetBeans.

Lorsque vous reformatez java, il fixe correctement la longueur des 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’emballage et bien d’autres paramètres. Je serais assez surpris que cela n’existe ni en version native ni en plugin.

Je ne peux pas le dire avec certitude à partir de la description, mais cela vaut la peine d'essayer:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top