Destaque do código fonte no LaTeX

196

Eu preciso destacar o código fonte no LaTeX. O pacote listingsparece ser a melhor opção para a maioria dos casos de uso e, para mim, até agora.

No entanto, agora eu preciso de mais flexibilidade. Geralmente, o que estou procurando é um verdadeiro lexer. Em particular, preciso (para uma definição de linguagem própria) definir (e destacar!) Estilos de número próprios. listingsnão permite destacar números no código. No entanto, preciso produzir algo como isto:

Resultado requerido

listingstambém não pode lidar com delimitadores arbitrários para seqüências de caracteres. Considere o seguinte código Ruby válido:

s = %q!this is a string.!

Aqui, !pode ser substituído por quase qualquer delimitador.

(Isso listingsnão pode lidar com Unicode também é bastante irritante, mas isso é outro problema.)

Idealmente, estou procurando uma extensão listingsque permita fornecer regras de lexing mais complexas. Mas, exceto por isso, também estou procurando alternativas viáveis.

Outros tópicos sugeriram o uso de pigmentos que podem produzir saída LaTeX. Existe até um pacote - texments- para facilitar a transição.

No entanto, isso carece de recursos. Em particular, eu estou interessado em listingsnumeração de estilo linha, as referências de linha de código fonte, bem como a possibilidade de incorporar LaTeX no código fonte (opções texcle mathescapeem listings).

Como exemplo, aqui está um código-fonte digitado com o listingsqual mostra algumas das coisas que uma substituição também deve fornecer:

Exemplo de listagem do LaTeX: adição lateral ["Adição lateral" modificada a partir de Bit Twiddling Hacks]

Konrad Rudolph
fonte
se você não está relutante em trazer ferramentas externas, como pigmentos, por que não escrever um makefile para o seu documento?
Mica
6
Isso não deveria ser migrados para tex.stackexchange.com ^^?
Matthias
1
@ Matthias Não tenho certeza. Quando o publiquei, não havia tex.se, mas agora parece bastante útil aqui - a pergunta teve um eco tremendo, enquanto no TeX.SE ninguém até agora postou uma pergunta semelhante. Além disso, na verdade, ele se refere especificamente a ferramentas de programação e programação, então acho que os programadores são as pessoas que se beneficiam com isso.
Konrad Rudolph
1
Para aqueles que esquecerem o LaTeX do documento que estão escrevendo no momento: Observe que, com o Office Word ou o LibreOffice Writer, basta copiar / colar seu código, por exemplo, Eclipse para lá e manter suas cores preservadas!
precisa saber é o seguinte
3
@MemoryLeaks Não tenho certeza de quem é esse conselho extremamente útil: o software do Office não é um substituto válido para o LaTeX (que não é um software de escritório, é um sistema de editoração eletrônica, que, em poucas palavras, significa que ele fornece tipografia muito superior , além de todas as outras vantagens sobre o software de escritório).
Konrad Rudolph

Respostas:

352

Levando em consideração o conselho de Norman, criei uma solução que usava pigmentos (com patches ) para destacar e introduzi o maior número possível de recursos sem estourar ;-)

Também criei um pacote LateX, uma vez que meu patch de pigmentos foi lançado na versão 1.2

Apresentando cunhado

minted é um pacote que usa pigmentos para fornecer destaque de sintaxe de alto nível no LaTeX. Por exemplo, ele permite a seguinte saída.

exemplo chique de LaTeX

Aqui está um arquivo mínimo para reproduzir o código acima (observe que a inclusão de caracteres Unicode pode exigir o XeTeX)!

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{minted}

\setsansfont{Calibri}
\setmonofont{Consolas}

\begin{document}
\renewcommand{\theFancyVerbLine}{
  \sffamily\textcolor[rgb]{0.5,0.5,0.5}{\scriptsize\arabic{FancyVerbLine}}}

\begin{minted}[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]{csharp}
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

Isso pode ser digitado usando o seguinte comando:

xelatex -shell-escape test.tex

(Mas o cunhado também funciona com latexe pdflatex…)

minted.styfunciona de maneira semelhante, texments.stymas permite recursos adicionais.

Como conseguir isso

Mais uma vez, obrigado a Norman por me motivar a produzir este pacote.

Konrad Rudolph
fonte
19
Depois de horas pesquisando sobre como usar pigmentos com o LaTeX, e mais horas tentando montar minha própria solução, esse é o melhor que encontrei. Melhor ainda, ele realmente funciona. Obrigado por isso.
sykora
2
aqui apenas para apreciar o trabalho que você fez de uma maneira cada vez mais;)!
Filip Dupanović
4
@ Paul: É verdade que a coisa toda é bastante bagunçada no Windows. :-( Espero que a próxima versão do Pygments vai aliviar esta um pouco, mas para as pessoas que não costumam trabalhar com Python (e, portanto easy_install) o processo nunca será muito bom.
Konrad Rudolph
1
No site do TeX SE, agora existem algumas perguntas sobre o seu pacote , e eu apenas acertei uma com uma espécie de solicitação de recurso (oculta nos comentários) . Você pode querer dar uma olhada.
Paŭlo Ebermann 5/11
1
@ Paŭlo Obrigado. Eu tento ler todas as menções do pacote (eu tenho um alerta do Google), mas nem sempre tenho sucesso. A pergunta que você mencionou que eu realmente li (aparentemente: votei de forma positiva, mas não consigo me lembrar), mas não é nada simples. “Ab” usando TikZ para este parece ser um mau corte ...
Konrad Rudolph
6

O TeX é (famosamente) completo em Turing, mas tenho certeza que você precisará escrever essa extensão. A documentação deixa claro que o autor original o listingstornou órfão em 2004 e que não foi atualizado desde 2006. O pacote não foi projetado para substituir a formatação de literais numéricos, mas você pode modificá-lo alterando o definição de \lst@ProcessDigit. Se isso não funcionar, você precisará entender em detalhes como as opções "estilo de identificador" funcionam e duplicar esse mecanismo para seus literais numéricos.

Não entendo muito bem por que você é tão relutante em introduzir uma ferramenta externa em sua cadeia de ferramentas, mas, como você é, terá que fazer um trabalho extra. Após uma olhada no código fonte, espero que a modificação listingsseja possível, mas eu pessoalmente escolheria pré-processar meu LaTeX.

Norman Ramsey
fonte
Não estou nem um pouco relutante em introduzir ferramentas externas - na verdade, acho que o uso de pigmentos é provavelmente a melhor solução. A questão é como fazer isso de maneira inteligente, para que eu ainda possa ter escapadas para o LaTeX e \labels dentro do código.
21928 Konrad Rudolph
Quanto à mudança listings, eu já dei uma olhada em sua fonte - e, infelizmente, não a compreendo. Minhas habilidades em TeX não estão nem perto desse nível. Até agora, só usei o subconjunto LaTeX do TeX.
Konrad Rudolph
1
Eu diria que o maior problema com a introdução de uma ferramenta externa é se você estiver publicando. Muitos editores de periódicos (tosse-tosse SPRINGER e outros) exigem envio no LaTex bruto, que é compilado em seus servidores. Escusado será dizer que, se a sua ferramenta de terceiros não estiver no servidor deles, você é SOL, a menos que faça um pré-processo (o que derrota a maior parte do utilitário de deixar o Tex dirigir).
fácil
Se a documentação estiver correta, o pacote de listagem ainda será mantido - no entanto, o mantenedor foi alterado e recebeu correções de erros: ctan.org/pkg/listings?lang=en
DetlevCM
1
@Nome, apenas um ponto de dados: eu consegui roubar um artigo com sucesso usando mintedo processo de publicação LNCS da Springer.
Volker Stolz 08/09
3

Este é um pacote que converte o código fonte em TeX e LaTeX com destaque de sintaxe. É possível adicionar definições personalizadas da linguagem de programação facilmente.

O Highlight suporta 100 linguagens de programação e inclui 50 temas de cores. Possui reformatação e recuo de código.

Eu não o usei para saber como funciona, mas alguém que eu conheço disse que funcionou muito bem. Se eu tiver uma chance, vou experimentar e ver.

homerj
fonte
1
highlightcompartilha todos os problemas dos pigmentos. Em particular, não é um pacote LaTeX , apesar do que diz sua descrição. É simplesmente um programa independente. O problema, assim como com os pigmentos, é como usá-lo de maneira significativa a partir do LaTeX e fornecer todas as coisas boas que ele listingstem.
Konrad Rudolph