2

Я работаю над латексным документом, который потребует набора значительных количеств исходного кода на основе python. Я использую pygments (модуль python, а не онлайн-демонстрацию), чтобы инкапсулировать этот питон в латекс, который хорошо работает, за исключением длинных отдельных строк, которые просто продолжаются со страницы. Я мог бы вручную обернуть эти строки, за исключением того, что это просто не кажется таким изящным решением для меня, и я предпочитаю тратить время на размышления о сумасшедших автоматизированных решениях, чем о повторяющихся задачах.Осведомленная строка исходного кода python для печати

Что бы я хотел, это какой-то способ обработки исходного кода на python, чтобы обернуть линии до определенной максимальной длины символов, сохраняя при этом функциональность. У меня была игра с некоторым python, и ближайший я пришел, вставляя \\\n в последние пробелы перед максимальной длиной строки, но, конечно, если это заканчивается строками и комментариями, все идет не так. Честно говоря, я не уверен, как подойти к этой проблеме.

Итак, кому-нибудь известно о модуле или инструменте, который может обрабатывать исходный код, чтобы линии не превышали определенной длины - или, по крайней мере, хороший способ начать кодирование чего-то подобного?

ответ

3

Вы можете продлить ваш текущий подход немного, но с использованием tokenize модуля из стандартной библиотеки чтобы определить, где поставить свои разрывы. Таким образом вы можете видеть фактические токены (COMMENT, STRING и т. Д.) Вашего исходного кода, а не просто слова, разделенные пробелами.

Вот краткий пример того, что может сделать токенизировать:

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

Теперь, когда выглядит многообещающим, я рассмотрю модуль tokenize. Благодаря! – Markus

+0

Я думаю, что это путь. Будет ли отправлять код в качестве другого ответа, когда я получу шанс вернуться к нему. – Markus

1

Я бы проверил инструмент форматирования в редакторе, таком как NetBeans.

Когда вы переформатируете java, он правильно фиксирует длины строк как внутри, так и снаружи комментариев, если тот же алгоритм применяется к Python, он будет работать.

Для Java это позволяет вам установить любую ширину упаковки и кучу других параметров. Я был бы очень удивлен, если бы этого не было ни родного, ни как плагина.

Не могу точно сказать, только из описания, но это стоит попробовать:

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

+0

переформатирования Java, вероятно, будет немного легче чем в Python. Может ли кто-нибудь подтвердить, может ли Netbeans (или любой другой редактор) сделать это правильно? – SingleNegationElimination

+0

Менее разумным, но аналогичным решением в Vim было бы визуально выбрать данные для «повторной колонки» и нажать «gw», чтобы позволить столбцам иметь максимальную ширину любой «текстовой ширины» в настоящее время. Но этот трюк Vim действительно работает лучше, чем исходный код. –

2

Я использую listings пакет в LaTeX для вставки исходного кода; он выделяет синтаксис, linebreaks et al.

Поместите следующее в вашем преамбуле:

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

Пакет имеет крюк для встроенного кода, включая целые файлы, показывая его как фигуры, ...

+0

Хороший совет, я обязательно отдам это. – Markus