我正在制作一个乳胶文件,需要排版大量的python源代码。我正在使用pygments(python模块,而不是在线演示)将这个python封装在latex中,除了长的单独行 - 它只是继续离开页面之外,它运行良好。我可以手动包装这些行,除了这对我来说似乎不是一个优雅的解决方案,我更喜欢花时间解决疯狂的自动化解决方案而不是重复性任务。
我想要的是处理python源代码以将行包装到特定最大字符长度的某种方式,同时保留功能。我已经玩了一些python,最接近的是在最大行长之前的最后一个空格中插入\\\n
- 当然,如果这最终出现在字符串和注释中,那么就会出错。坦率地说,我不确定如何处理这个问题。
那么,是否有人知道可以处理源代码的模块或工具,以便没有行超过一定长度 - 或者至少是开始编写类似代码的好方法?
答案 0 :(得分:3)
您可能希望稍微扩展当前的方法,但使用标准库中的tokenize模块来确定换行符的位置。这样您就可以看到源代码的实际标记(COMMENT,STRING等),而不仅仅是以空格分隔的单词。
以下是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 ''
答案 1 :(得分:2)
我使用LaTeX中的listings
包来插入源代码;它有语法高亮,换行等等。
在序言中加入以下内容:
\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
}
该软件包具有内联代码的钩子,包括整个文件,将其显示为数字,......
答案 2 :(得分:1)
我会在像NetBeans这样的编辑器中检查重新格式化工具。
重新格式化java时,它会正确地修复注释内部和外部的行长度,如果将相同的算法应用于Python,它将起作用。
对于Java,它允许您设置任何包装宽度和一堆其他参数。如果不存在原生或插件,我会感到非常惊讶。
无法从描述中确定无疑,但值得一试: