Código fonte destacando no látex
-
21-09-2019 - |
Pergunta
Preciso destacar o código -fonte no LaTex. O pacote listings
Parece ser a melhor escolha para a maioria dos casos de uso e para mim foi, até agora.
No entanto, agora preciso de mais flexibilidade. Geralmente, o que estou procurando é um real Lexer. Em particular, preciso (para uma definição de idioma próprio) definir (e destacar!) Estilos de números próprios. listings
não permite destacar números no código. No entanto, preciso produzir algo assim:
listings
Também não pode lidar com delimitadores arbitrários para cordas. Considere o seguinte código rubi válido:
s = %q!this is a string.!
Aqui, !
pode ser substituído por quase algum delimitador.
(Este listings
Não é possível lidar com o Unicode também é bastante irritante, mas isso é outra questão.)
Idealmente, estou procurando uma extensão de listings
Isso me permite fornecer regras de lexing mais complexas. Mas, exceto isso, também estou procurando alternativas viáveis.
Outros tópicos sugeriram o uso Pigmentos que pode produzir saída de látex. Existe até um pacote - texments
- para facilitar a transição.
No entanto, isso não tem recursos. Em particular, estou interessado em listings
-NOUS Numeração da linha, referências de linha de código -fonte e a possibilidade de incorporar o látex no código -fonte (opções texcl
e mathescape
dentro listings
).
Como exemplo, aqui está um código -fonte com tipo de compensação com listings
que mostra algumas das coisas que um substituto também deve fornecer:
“Adição lateral” modificado a partir de bits twidling hacks
Solução
Levando o conselho de Norman a sério, eu invadi uma solução que usou (um remendado) Pigmentos para destacar e empurrar o maior número possível de recursos sem estourar ;-)
Eu também criei um pacote de látex, uma vez que meu patch de pigmentos foi lançado em Versão 1.2 …
Apresentando cunhado
cunhado é um pacote que usa pigmentos para fornecer destaque de sintaxe de alto nível no látex. Por exemplo, ele permite a seguinte saída.
Aqui está um arquivo mínimo para reproduzir o código acima (observe que a inclusão de caracteres Unicode pode exigir 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 cunhado Também funciona com latex
e pdflatex
…)
minted.sty
funciona semelhante a texments.sty
mas permite recursos adicionais.
Como conseguir isso
cunhado é Listado no CTAN (informações do pacote)
documentação É claro que está incluído.
cunhado agora é mantido por Geoffrey Poore. A versão de desenvolvimento, incluindo o mais recente
.sty
Arquivo, está disponível em github.com/gpoore/minted, e pode ser clonado a partir daí.
Mais uma vez, obrigado a Norman por me motivar a produzir este pacote.
Outras dicas
Tex é (famoso) Turing-complete, mas tenho certeza de que você terá que escrever essa extensão você mesmo. A documentação deixa claro que o autor original de listings
Orfã 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 a definição de \lst@ProcessDigit
. Se isso não funcionar, você terá que entender em detalhes como as opções "estilo identificador" funcionam e terá que duplicar essa maquinaria para seus literais numéricos.
Não entendo por que você está tão relutante em introduzir uma ferramenta externa em sua cadeia de ferramentas, mas porque você está, terá que fazer um trabalho extra. Após uma olhada no código -fonte, espero que modifique listings
Deveria ser possível, mas eu pessoalmente escolheria pré -processar meu látex.
este é um pacote que converte código -fonte em tex e látex com destaque de sintaxe. É possível adicionar definições de linguagem de programação personalizadas facilmente.
O destaque suporta 100 linguagens de programação e inclui 50 temas de cores. Apresenta o código reformatante e recuo.
Não o usei para saber o quão bem funciona, mas outra pessoa que eu conheço disse que funcionou muito bem. Se eu tiver a chance, vou tentar sozinho e ver.