用于打印输出的合理python源代码换行

用于打印输出的合理python源代码换行,python,latex,syntax-highlighting,code-formatting,pygments,Python,Latex,Syntax Highlighting,Code Formatting,Pygments,我正在编写一个latex文档,该文档需要排版大量python源代码。我正在使用(python模块,而不是在线演示)将此python封装在latex中,除了长的单独行之外,它工作得很好,只是在页面外继续。我可以手动包装这些行,但这对我来说似乎不是一个优雅的解决方案,而且我更喜欢花时间思考疯狂的自动化解决方案,而不是重复性的任务 我想要的是某种处理python源代码的方法,将行包装到某个最大字符长度,同时保留功能。我曾经尝试过一些python,最近的一次尝试是在最大行长度之前的最后一个空格中插入\\

我正在编写一个latex文档,该文档需要排版大量python源代码。我正在使用(python模块,而不是在线演示)将此python封装在latex中,除了长的单独行之外,它工作得很好,只是在页面外继续。我可以手动包装这些行,但这对我来说似乎不是一个优雅的解决方案,而且我更喜欢花时间思考疯狂的自动化解决方案,而不是重复性的任务

我想要的是某种处理python源代码的方法,将行包装到某个最大字符长度,同时保留功能。我曾经尝试过一些python,最近的一次尝试是在最大行长度之前的最后一个空格中插入
\\\n
,但当然,如果这以字符串和注释结束,事情就会出错。坦率地说,我不知道如何处理这个问题


那么,是否有人知道有一个模块或工具可以处理源代码,使任何行都不会超过某个长度?或者至少是开始编写类似代码的一个好方法?

我会在NetBeans这样的编辑器中检查一个重新格式化工具

当您重新格式化java时,它会正确地固定注释内部和外部的行长度,如果将相同的算法应用于Python,它就会工作

对于Java,它允许您设置任何包装宽度和一组其他参数。我会非常惊讶,如果它不是本地的或者作为插件存在的话

仅从描述无法确定,但值得一试:


您可能想稍微扩展一下当前的方法,但是使用标准库中的模块来确定换行符的放置位置。这样,您就可以看到源代码的实际标记(注释、字符串等),而不仅仅是空格分隔的单词

下面是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   ''

我使用LaTeX中的
清单
包插入源代码;它会突出显示语法、换行符等

在序言中加入以下内容:

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

包中有用于内联代码(包括整个文件)的钩子,将其显示为图,

重新格式化java可能比Python中的要容易一些。有人能确认Netbeans(或任何其他编辑器)是否能够正确执行此操作吗?Vim中的一个不太智能但类似的解决方案是直观地选择要“重新列化”的数据,然后按
gw
,以允许列的最大宽度为
textwidth
当前设置的任何值。但是这个Vim技巧在纯文本上比源代码更有效。现在看起来很有希望,我将研究tokenize模块。谢谢我想这是一条路要走。当我有机会回复时,我会把代码作为另一个答案。好提示,我一定会尝试一下。