Mise en évidence du code source dans LaTeX

196

J'ai besoin de mettre en évidence le code source dans LaTeX. Le paquetlistings semble être le meilleur choix pour la plupart des cas d'utilisation et pour moi, il l'était jusqu'à présent.

Cependant, maintenant j'ai besoin de plus de flexibilité. Généralement, ce que je recherche, c'est un vrai lexer. En particulier, j'ai besoin (pour une définition de langage propre) de définir (et de mettre en évidence!) Ses propres styles de nombres. listingsne permet pas de surligner les nombres dans le code. Cependant, je dois produire quelque chose comme ceci:

Résultat requis

listingsne peut pas non plus gérer les délimiteurs arbitraires pour les chaînes. Considérez le code Ruby valide suivant:

s = %q!this is a string.!

Ici, !peut être remplacé par presque tout délimiteur.

(Cela listingsne peut pas gérer Unicode est également assez vexant, mais c'est un autre problème.)

Idéalement, je recherche une extension listingsqui me permette de fournir des règles de lexing plus complexes. Mais sauf cela, je recherche également des alternatives viables.

D'autres discussions ont suggéré d'utiliser des Pygments qui peuvent produire une sortie LaTeX. Il existe même un package - texments- pour faciliter la transition.

Cependant, cela manque cruellement de fonctionnalités. En particulier, je m'intéresse à la listingsnumérotation des lignes -style, aux références de ligne de code source et à la possibilité d'incorporer LaTeX dans le code source (options texclet mathescapedans listings).

À titre d'exemple, voici une composition de code source listingsqui montre certaines des choses qu'un remplacement devrait également fournir:

Exemple d'annonces LaTeX: ajout latéral [«Ajout latéral» modifié à partir de piratages Bit Twiddling]

Konrad Rudolph
la source
si vous n'êtes pas réticent à apporter des outils externes tels que des pygments, alors pourquoi ne pas simplement écrire un makefile pour votre document?
Mica
6
Cela ne devrait-il pas être migré vers tex.stackexchange.com ? ^^
Matthias
1
@Matthias Pas sûr. Quand je l'ai posté, il n'y avait pas de tex.se mais maintenant cela semble très utile ici - la question a eu un écho énorme, alors que sur TeX.SE personne jusqu'à présent n'a posté une question similaire. De plus, cela concerne spécifiquement la programmation et les outils de programmation, donc je suppose que les programmeurs sont les personnes qui en bénéficient.
Konrad Rudolph
1
Pour ceux qui ont oublié LaTeX pour le document qu'ils sont en train d'écrire: Notez qu'avec Office Word ou LibreOffice Writer, il vous suffit de copier / coller votre code depuis par exemple Eclipse et d'obtenir vos couleurs préservées !!
MohamedEzz
3
@MemoryLeaks Je ne sais pas à qui ce conseil est terriblement utile: le logiciel Office n'est pas un substitut valide pour LaTeX (qui n'est pas un logiciel de bureau, c'est un système de publication assistée par ordinateur, ce qui, en résumé, signifie qu'il fournit une typographie bien supérieure , à part tous ses autres avantages par rapport aux logiciels bureautiques).
Konrad Rudolph

Réponses:

352

Prenant à cœur les conseils de Norman, j'ai piraté une solution qui utilisait (un correctif ) Pygments pour mettre en évidence et insérer autant de fonctionnalités que possible sans éclatement ;-)

J'ai également créé un package LateX, une fois mon patch Pygments sorti en version 1.2

Présentation frappée

minted est un package qui utilise Pygments pour fournir une coloration syntaxique de premier ordre dans LaTeX. Par exemple, il autorise la sortie suivante.

exemple de LaTeX fantaisie

Voici un fichier minimal pour reproduire le code ci-dessus (notez que l'inclusion de caractères Unicode peut nécessiter 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}

Cela peut être composé à l'aide de la commande suivante:

xelatex -shell-escape test.tex

(Mais minted fonctionne aussi avec latexet pdflatex…)

minted.sty fonctionne similaire à texments.sty mais permet des fonctionnalités supplémentaires.

Comment l'obtenir

Encore une fois, merci à Norman de m'avoir motivé à produire ce package.

Konrad Rudolph
la source
19
Après des heures de recherche sur la façon d'utiliser les pygments avec LaTeX, et plus d'heures à essayer de pirater ma propre solution, c'est la meilleure que j'ai trouvée. Mieux encore, cela fonctionne réellement. Merci pour cela.
sykora
2
ici juste pour apprécier le travail que vous avez fait de manière à devenir;)!
Filip Dupanović
4
@Paul: C'est vrai que tout est assez compliqué sous Windows. :-( Espérons que la prochaine version de Pygments atténuera quelque peu cela, mais pour les personnes qui ne travaillent pas souvent avec Python (et donc easy_install) le processus ne sera jamais très fluide.
Konrad Rudolph
1
Sur le site TeX SE, il y a maintenant pas mal de questions sur votre package , et je viens d'en poser une avec une sorte de demande de fonctionnalité (cachée dans les commentaires) . Vous voudrez peut-être jeter un œil.
Paŭlo Ebermann
1
@ Paŭlo Merci. J'essaie de lire toutes les mentions du package (j'ai une alerte Google) mais je ne réussis pas toujours. La question que vous avez mentionnée a été lue (apparemment: je l'ai votée mais je ne m'en souviens pas) mais ce n'est pas du tout simple. «Ab» en utilisant TikZ pour cela semble être un mauvais hack…
Konrad Rudolph
6

TeX est (célèbre) Turing-complet, mais je suis sûr que vous devrez écrire cette extension vous-même. La documentation indique clairement que l'auteur d'origine de l' listingsorphelin en 2004 et qu'il n'a pas été mis à jour depuis 2006. Le package n'a pas été conçu pour remplacer la mise en forme des littéraux numériques, mais vous pouvez peut-être le modifier en changeant le Définition de\lst@ProcessDigit . Si cela ne fonctionne pas, vous devrez comprendre en détail le fonctionnement des options de "style d'identifiant" et vous devrez dupliquer cette machine pour vos littéraux numériques.

Je ne comprends pas très bien pourquoi vous êtes si réticent à introduire un outil externe dans votre chaîne d'outils, mais parce que vous l'êtes, vous devrez faire un travail supplémentaire. Après avoir regardé le code source, je m'attends à ce que la modification listingssoit possible, mais je choisirais personnellement de prétraiter mon LaTeX à la place.

Norman Ramsey
la source
Je ne suis pas du tout réticent à introduire des outils externes - en fait, je pense que l'utilisation de Pygments est probablement la meilleure solution. La question est de savoir comment le faire de manière intelligente afin que je puisse toujours avoir des échappements vers LaTeX et \labels dans le code.
Konrad Rudolph
Quant au changement listings, j'ai déjà jeté un œil à sa source - et malheureusement, je ne le comprends pas du tout. Mes compétences TeX sont loin de ce niveau. Jusqu'à présent, je n'ai de toute façon jamais utilisé le sous-ensemble LaTeX de TeX.
Konrad Rudolph
1
Je dirais que le plus gros problème avec l'introduction d'un outil externe est que si vous publiez. De nombreux éditeurs de revues (cough-cough SPRINGER et autres) exigent une soumission en LaTex brut, qui est ensuite compilé sur leurs serveurs. Inutile de dire que si votre outil tiers n'est pas sur leur serveur, vous êtes SOL sauf si vous pré-traitez (ce qui annule la plupart de l'utilité de laisser Tex conduire).
Namey
Si la documentation est correcte, le package de listes est toujours maintenu - cependant le responsable a changé et il a reçu des corrections de bogues: ctan.org/pkg/listings?lang=en
DetlevCM
1
@Namey, juste un point de données: je viens de réussir à faufiler un document en utilisant mintedle processus de publication LNCS de Springer.
Volker Stolz
3

Ce s'agit d'un package qui convertit le code source en TeX et LaTeX avec mise en évidence de la syntaxe. Il est possible d'ajouter facilement des définitions de langage de programmation personnalisées.

Highlight prend en charge 100 langages de programmation et comprend 50 thèmes de couleurs. Il comporte un reformatage et une mise en retrait du code.

Je ne l'ai pas utilisé pour savoir comment ça fonctionne BIEN, mais quelqu'un d'autre que je connais a dit que cela fonctionnait assez bien. Si j'en ai l'occasion, je vais l'essayer moi-même et voir.

homerj
la source
1
highlightpartage cependant tous les problèmes des Pygments. En particulier, ce n'est pas un package LaTeX , malgré ce que dit sa description. Il s'agit simplement d'un programme autonome. Le problème, tout comme avec Pygments, est de savoir comment l'utiliser de manière significative à partir de LaTeX et fournir toutes les bonnes choses qui listingsont.
Konrad Rudolph