Pregunta

Estoy trabajando en un documento de látex que requerirá la composición tipográfica de cantidades significativas de código fuente de Python. Estoy usando pygments (el módulo de python, no la demostración en línea) para encapsular esta python en látex, que funciona bien excepto en el caso de largas líneas individuales, que simplemente continúan fuera de la página. Podría ajustar manualmente estas líneas, excepto que esto no me parece una solución tan elegante, y prefiero pasar el tiempo pensando en soluciones automatizadas locas que en tareas repetitivas.

Lo que me gustaría es alguna forma de procesar el código fuente de Python para ajustar las líneas a una cierta longitud máxima de caracteres, mientras se preserva la funcionalidad. He jugado con Python y lo más cerca que he estado es insertar \\\ n en el último espacio en blanco antes de la longitud máxima de la línea, pero, por supuesto, si esto termina en cadenas y comentarios, las cosas van mal. Francamente, no estoy seguro de cómo abordar este problema.

Entonces, ¿alguien conoce un módulo o herramienta que pueda procesar el código fuente para que ninguna línea exceda una cierta longitud, o al menos una buena manera de comenzar a codificar algo así?

¿Fue útil?

Solución

Es posible que desee ampliar un poco su enfoque actual, pero usando tokenize módulo de la biblioteca estándar para determinar dónde colocar los saltos de línea. De esa manera, puede ver los tokens reales (COMENTARIO, CADENA, etc.) de su código fuente en lugar de solo las palabras separadas por espacios en blanco.

Aquí hay un breve ejemplo de lo que puede hacer 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   ''

Otros consejos

Uso el paquete listados en LaTeX para insertar el código fuente; resalta la sintaxis, linebreaks et al.

Ponga lo siguiente en su preámbulo:

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

El paquete tiene gancho para código en línea, incluidos archivos completos, que se muestran como figuras, ...

Comprobaría una herramienta de reformateo en un editor como NetBeans.

Cuando reformatea Java, corrige correctamente las longitudes de las líneas tanto dentro como fuera de los comentarios, si el mismo algoritmo se aplicara a Python, funcionaría.

Para Java, le permite establecer cualquier ancho de envoltura y muchos otros parámetros. Me sorprendería bastante si eso no existiera, ya sea nativo o como complemento.

No puedo asegurarlo solo por la descripción, pero vale la pena intentarlo:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top