Evidenziazione del codice sorgente in LaTeX


196

Devo evidenziare il codice sorgente in LaTeX. Il pacchetto listingssembra essere la scelta migliore per la maggior parte dei casi d'uso e per me lo è stato, fino ad ora.

Tuttavia, ora ho bisogno di maggiore flessibilità. In generale, quello che sto cercando è un vero lexer. In particolare, ho bisogno (per una definizione della propria lingua) di definire (ed evidenziare!) I propri stili numerici. listingsnon consente l'evidenziazione dei numeri nel codice. Tuttavia, devo produrre qualcosa del genere:

Risultato richiesto

listingsinoltre non può far fronte a delimitatori arbitrari per le stringhe. Considera il seguente codice Ruby valido:

s = %q!this is a string.!

Qui, !può essere sostituito da quasi tutti i delimitatori.

(Che listingsnon può gestire Unicode è anche abbastanza fastidioso, ma questo è un altro problema.)

Idealmente, sto cercando un'estensione listingsche mi permetta di fornire regole di lexing più complesse. Ma a parte questo, sto anche cercando alternative praticabili.

Altri thread hanno suggerito di usare Pygments che possono produrre output LaTeX. C'è anche un pacchetto - texments- per facilitare la transizione.

Tuttavia, questo manca di funzionalità. In particolare, sono interessato alla listingsnumerazione delle righe in stile, ai riferimenti alle righe del codice sorgente e alla possibilità di incorporare LaTeX nel codice sorgente (opzioni texcle mathescapein listings).

Ad esempio, ecco un set di codice sorgente con il listingsquale mostra alcune delle cose che una sostituzione dovrebbe anche fornire:

Esempio di elenchi LaTeX: aggiunta laterale ["Aggiunta laterale" modificata da Bit Twiddling Hacks]


se non sei riluttante a introdurre strumenti esterni come i pigmenti, perché non scrivere semplicemente un makefile per il tuo documento?
Mica,

6
Non dovrebbe essere migrato su tex.stackexchange.com ? ^^
Matthias,

1
@Matthias Non sono sicuro. Quando l'ho pubblicato non c'era tex.se ma ora sembra abbastanza utile qui - la domanda ha avuto un'eco tremenda, mentre su TeX.SE nessuno finora ha pubblicato una domanda simile. Inoltre, in realtà si riferisce specificamente alla programmazione e agli strumenti di programmazione, quindi immagino che i programmatori siano le persone che ne traggono beneficio.
Konrad Rudolph,

1
Per coloro che hanno dimenticato LaTeX per il documento che stanno attualmente scrivendo: nota che con Office Word o LibreOffice Writer, devi semplicemente copiare / incollare il tuo codice da ad esempio Eclipse e conservare i tuoi colori !!
MohamedEzz,

3
@MemoryLeaks Non sono sicuro di chi sia questo consiglio estremamente utile: il software Office non è un valido sostituto di LaTeX (che non è un software per ufficio, è un sistema di desktop publishing che, in poche parole, significa che offre una tipografia molto superiore , a parte tutti gli altri vantaggi rispetto al software per ufficio).
Konrad Rudolph,

Risposte:


355

Prendendo a cuore il consiglio di Norman, ho messo insieme una soluzione che utilizzava (un patch ) Pygments per evidenziare e inserire il maggior numero possibile di funzionalità senza scoppiare ;-)

Ho anche creato un pacchetto LateX, una volta che la mia patch di Pygments è stata rilasciata nella versione 1.2 ...

Presentazione coniata

coniato è un pacchetto che utilizza Pygments per fornire l'evidenziazione della sintassi di prim'ordine in LaTeX. Ad esempio, consente il seguente output.

esempio di fantasia LaTeX

Ecco un file minimo per riprodurre il codice sopra (nota che l'inclusione di caratteri Unicode potrebbe richiedere 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}

Questo può essere composto usando il seguente comando:

xelatex -shell-escape test.tex

(Ma coniato funziona anche con latexe pdflatex...)

minted.styfunziona in modo simile texments.styma consente funzionalità aggiuntive.

Come ottenerlo

Ancora una volta, grazie a Norman per avermi motivato a produrre questo pacchetto.


19
Dopo ore di ricerche su come utilizzare i pigmenti con LaTeX e più ore di tentativi di hackerare la mia soluzione, questo è il migliore che ho trovato. Meglio ancora, funziona davvero. Grazie per questo.
Sykora,

2
qui solo per apprezzare il lavoro che hai fatto in modo divenuto;)!
Filip Dupanović,

4
@Paul: è vero che il tutto è piuttosto disordinato su Windows. :-( Speriamo che la prossima versione di Pygments lo allevierà in qualche modo, ma per le persone che non lavorano spesso con Python (e quindi easy_install) il processo non sarà mai molto fluido.
Konrad Rudolph,

1
Sul sito TeX SE ora ci sono alcune domande sul tuo pacchetto , e ne ho appena ricevuto uno con una specie di richiesta di funzionalità (nascosta nei commenti) . Potresti voler dare un'occhiata.
Paŭlo Ebermann,

1
@ Paŭlo Grazie. Provo a leggere tutte le menzioni del pacchetto (ho un avviso di Google) ma non sempre ci riesco. La domanda che hai menzionato in realtà l'ho letta (a quanto pare: l'ho votata ma non ricordo) ma non è affatto semplice. "Ab" usando TikZ per questo sembra un brutto trucco ...
Konrad Rudolph

6

TeX è (notoriamente) Turing completo, ma sono abbastanza sicuro che dovrai scrivere tu stesso questa estensione. La documentazione chiarisce che l'autore originale l'ha listingsreso orfano nel 2004 e che non è stato aggiornato dal 2006. Il pacchetto non è stato progettato per sovrascrivere la formattazione dei letterali numerici, ma potresti essere in grado di modificarlo cambiando il definizione di \lst@ProcessDigit. Se ciò non funziona, dovrai capire in dettaglio come funzionano le opzioni di "stile identificatore" e dovrai duplicare quel macchinario per i tuoi letterali numerici.

Non capisco bene perché sei così riluttante a introdurre uno strumento esterno nella tua toolchain, ma poiché lo sei, dovrai fare un lavoro extra. Dopo aver esaminato il codice sorgente, mi aspetto che la modifica listingssia possibile, ma personalmente sceglierei di preelaborare il mio LaTeX.


Non sono affatto riluttante a introdurre strumenti esterni - in effetti, penso che l'uso di Pygments sia probabilmente la soluzione migliore. La domanda è come farlo in modo intelligente in modo che io possa ancora avere scappatoie su LaTeX e \labelall'interno del codice.
Konrad Rudolph,

Per quanto riguarda il cambiamento listings, ho già dato un'occhiata alla sua fonte - e sfortunatamente non lo capisco affatto. Le mie abilità in TeX non si avvicinano affatto a quel livello. Fino ad ora, ho sempre usato solo il sottoinsieme LaTeX di TeX.
Konrad Rudolph,

1
Direi che il problema più grande con l'introduzione di uno strumento esterno è che se stai pubblicando. Molti editori di riviste (tosse SPRINGER e altri) richiedono l'invio in LaTex non elaborato, che viene quindi compilato sui loro server. Inutile dire che se il tuo strumento di terze parti non si trova sul loro server, sei SOL a meno che tu non pre-elabori (il che sconfigge la maggior parte dell'utilità di lasciare guidare Tex).
Namey

Se la documentazione è corretta, il pacchetto di elenchi viene comunque mantenuto, tuttavia il manutentore è cambiato e ha ricevuto correzioni di bug: ctan.org/pkg/listings?lang=en
DetlevCM

1
@Namey, solo un punto dati: sono appena riuscito a intrufolare con successo un documento usando mintedil processo di pubblicazione LNCS di Springer.
Volker Stolz,

3

Questo è un pacchetto che converte il codice sorgente in TeX e LaTeX con l'evidenziazione della sintassi. È possibile aggiungere facilmente definizioni personalizzate del linguaggio di programmazione.

L'evidenziazione supporta 100 linguaggi di programmazione e include 50 temi di colore. È dotato di riformattazione e rientro del codice.

Non l'ho usato per sapere come BENE funziona, ma qualcun altro che conosco ha detto che ha funzionato abbastanza bene. Se ne avrò la possibilità, lo proverò da solo e vedrò.


1
highlightcondivide tutti i problemi di Pygments, comunque. In particolare, non è un pacchetto LaTeX , nonostante ciò che dice la sua descrizione. È semplicemente un programma autonomo. Il problema, proprio come con Pygments, è come usarlo in modo significativo da LaTeX e fornire tutte le cose belle che listingsha.
Konrad Rudolph,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.