印刷用の賢いpythonソース行の折り返し
-
10-07-2019 - |
質問
私は大量のpythonソースコードをタイプセットする必要があるラテックスドキュメントに取り組んでいます。 pygments (オンラインデモではなくpythonモジュール)を使用して、このpythonをラテックスにカプセル化します。長い個々の行の場合を除きます-単にページから継続します。これらの行を手動でラップすることはできますが、これは私にはそれほどエレガントなソリューションではないように思えますが、反復的なタスクよりもクレイジーな自動化されたソリューションについて困惑する時間を費やすことを好みます。
機能を維持しながら、Pythonソースコードを処理して特定の最大文字長まで行をラップする方法があります。私はいくつかのPythonで遊びましたが、最も近いのは \\\ n
を最後の空白に最大行長の前に挿入することです-もちろん、これが文字列で終わる場合そしてコメント、物事はうまくいかない。率直に言って、私はこの問題にどのようにアプローチするかわからない。
それで、ソースコードを処理して特定の長さを超える行がないようにするモジュールまたはツールを知っている人、または少なくともそのようなものをコーディングし始める良い方法はありますか?
解決
現在のアプローチを少し拡張したいかもしれませんが、トークン化を使用します標準ライブラリのモジュールを使用して、改行を配置する場所を決定します。これにより、空白で区切られた単語だけでなく、ソースコードの実際のトークン(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 ''
他のヒント
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
}
パッケージには、ファイル全体を含むインラインコード用のフックがあり、図として表示されます...
NetBeansなどのエディターで再フォーマットツールを確認します。
javaを再フォーマットすると、コメントの内側と外側の両方の行の長さが適切に修正されます。同じアルゴリズムがPythonに適用された場合、機能します。
Javaの場合、ラッピング幅とその他のパラメーターを設定できます。それがネイティブでもプラグインとしても存在しなかったら、私はかなり驚いたでしょう。
説明だけではわかりませんが、試してみる価値はあります: