Pergunta

Eu estou trabalhando em um documento latex que vai exigir typesetting quantidades significativas de código-fonte python. Estou usando pygments (o módulo python, não a demonstração on-line) para encapsular este python em látex, que funciona bem exceto no caso de linhas individuais longos - que simplesmente continuar fora da página. Eu poderia envolver manualmente essas linhas, exceto que este simplesmente não parece que a solução de um elegante para mim, e eu prefiro gastar tempo intrigante sobre as soluções automatizadas loucos do que em tarefas repetitivas.

O que eu gostaria é alguma maneira de processar o código-fonte python para embrulhar as linhas para um determinado comprimento máximo de caracteres, preservando a funcionalidade. Eu tive um jogo ao redor com alguns python e o mais próximo que eu vim está inserindo \\\n no último espaço em branco antes de o comprimento da linha máxima - mas é claro que, se isso acaba em strings e comentários, as coisas dão errado. Francamente, eu não tenho certeza de como abordar este problema.

Assim, é do conhecimento de um módulo ou ferramenta que pode processar o código-fonte para que nenhuma linha exceder um determinado período - ou, pelo menos, uma boa maneira de começar a percorrer cerca de codificação algo parecido

Foi útil?

Solução

Você pode querer estender sua atual abordagem um pouco, mas usando o tokenize módulo da biblioteca padrão para determinar onde colocar as suas quebras de linha. Dessa forma, você pode ver os sinais reais (COMENTÁRIO, corda, etc.) de seu código-fonte, em vez de apenas as palavras separadas por espaços em branco.

Aqui está um pequeno exemplo do que tokenize pode fazer:

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

Outras dicas

Eu uso o pacote listings em LaTeX ao código-fonte de inserção; ele faz destaque de sintaxe, linebreaks et al.

Coloque o seguinte no seu 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
}

O pacote tem gancho para código embutido, incluindo arquivos inteiros, mostrando-o como figuras, ...

Eu iria verificar uma ferramenta reformatação em um editor como o NetBeans.

Quando você reformatar java ele corrige adequadamente os comprimentos das linhas dentro e fora dos comentários, se o mesmo algoritmo foram aplicados em Python, ele iria trabalhar.

Para Java que permite definir qualquer largura de embrulho e um monte de outros parâmetros. Eu ficaria muito surpreso se isso não existisse, quer nativa ou como um plugin.

Não é possível dizer com certeza apenas a partir da descrição, mas vale a pena tentar:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top