213 votes

Mise en évidence du code source en LaTeX

Je dois mettre en évidence le code source en LaTeX. Le package listings semble être le meilleur choix pour la plupart des cas d'utilisation et pour moi aussi, jusqu'à maintenant.

Cependant, maintenant j'ai besoin de plus de flexibilité. En général, ce que je cherche est un véritable lexer. En particulier, j'ai besoin (pour une définition de langage personnalisée) de définir (et mettre en évidence !) des styles de numérotation personnalisés. listings ne permet pas de mettre en évidence les nombres dans le code. Cependant, j'ai besoin de produire quelque chose comme ceci :

Résultat requis

listings ne peut pas non plus gérer des 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 n'importe quel délimiteur.

(Le fait que listings ne puisse pas gérer l'Unicode est également assez frustrant, mais c'est un autre problème.)

Idéalement, je cherche une extension de listings qui me permet de fournir des règles de lexing plus complexes. Mais en l'absence de cela, je recherche également des alternatives viables.

D'autres fils ont suggéré d'utiliser Pygments qui peut produire une sortie LaTeX. Il y a même un package - texments - pour faciliter la transition.

Cependant, cela manque cruellement de fonctionnalités. En particulier, je m'intéresse à la numérotation des lignes de style listings, aux références de lignes de code source et à la possibilité d'intégrer du LaTeX dans le code source (options texcl et mathescape dans listings).

Par exemple, voici un code source mis en forme avec listings qui montre certaines des choses qu'un remplacement devrait également fournir :

Exemple de listings LaTeX : Addition de côté[“Addition de côté” modifiée à partir de Bit Twiddling Hacks]

0 votes

Si vous n'avez pas d'objection à utiliser des outils externes tels que pygments, pourquoi ne pas simplement écrire un makefile pour votre document ?

8 votes

Ne serait-il pas judicieux de migrer vers tex.stackexchange.com ?

2 votes

@Matthias Pas sûr. Quand je l'ai posté, il n'y avait pas de tex.se mais maintenant cela semble assez utile ici - la question a eu un immense écho, alors que sur TeX.SE personne n'a encore posé une question similaire. De plus, elle se rapporte en fait spécifiquement à la programmation et aux outils de programmation donc je suppose que les programmeurs sont les personnes qui en bénéficient.

388voto

Konrad Rudolph Points 231505

En prenant à cœur les conseils de Norman, j'ai bricolé une solution qui utilisait (un patched) Pygments pour la mise en évidence et ai intégré autant de fonctionnalités que possible sans exploser ;-)

J'ai également créé un package LateX, une fois que mon correctif Pygments a été publié dans version 1.2 ...

Présentation de minted

minted est un package qui utilise Pygments pour fournir une coloration syntaxique de qualité supérieure dans LaTeX. Par exemple, cela permet de produire la sortie suivante.

bel exemple de LaTeX

Voici un fichier minimal pour reproduire le code ci-dessus (remarquez 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 = "C'est un Unicode π dans le ciel"
  /*
  Défini comme $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ où $P$ est le périmètre
  d'un polygone régulier à n côtés circonscrivant un
  cercle de diamètre $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

Cela peut être mis en forme à l'aide de la commande suivante:

xelatex -shell-escape test.tex

(Mais minted fonctionne également avec latex et pdflatex...)

minted.sty fonctionne de manière 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.

23 votes

Après des heures de recherche sur la manière d'utiliser Pygments avec LaTeX, et encore plus d'heures à essayer de bricoler ma propre solution, voici la meilleure que j'ai trouvée. Mieux encore, elle fonctionne réellement. Merci pour cela.

2 votes

Ici juste pour apprécier le travail que vous avez fait de manière élégante ;)!

0 votes

Il m'a fallu des siècles pour tout mettre en place, mais ça en valait la peine au final. L'installation via MiKTeX n'a pas fonctionné (sans problème) pour moi; j'ai dû installer plusieurs packages séparément. De plus, easy_install de Python n'a pas réussi à récupérer un EGG Pygments fonctionnel, donc je l'ai téléchargé séparément et installé via easy_install.exe pygments*.egg. Enfin, n'oubliez pas d'exécuter latex ou pdflatex avec l'option --shell-escape ... et croisez les doigts!

8voto

Norman Ramsey Points 115730

TeX est (à juste titre) Turing-complet, mais je suis assez sûr que vous devrez écrire cette extension vous-même. La documentation montre clairement que l'auteur original de listings l'a abandonnée en 2004 et qu'elle n'a pas été mise à jour depuis 2006. Le package n'a pas été conçu pour remplacer le formatage des littéraux numériques, mais vous pourriez être en mesure de le modifier en changeant la 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 machinerie pour vos littéraux numériques.

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

0 votes

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 comment le faire de manière intelligente afin que je puisse toujours échapper à LaTeX et aux \labels à l'intérieur du code.

0 votes

En ce qui concerne le changement des listings, j'ai déjà examiné son code source - malheureusement, je ne le comprends pas du tout. Mes compétences en TeX ne sont nulle part près de ce niveau. Jusqu'à maintenant, je n'ai utilisé que le sous-ensemble LaTeX de TeX de toute façon.

1 votes

Je dirais que le plus grand problème lors de l'introduction d'un outil externe est que si vous publiez. Beaucoup d'éditeurs de journaux (tousse-tousse 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 dans l'embarras à moins de prétraiter (ce qui annule la plupart de l'utilité de laisser Tex piloter).

3voto

homerj Points 11

Le CTAN/highlight est un package qui convertit le code source en TeX et LaTeX avec une coloration syntaxique. 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 offre une reformatage et un indentation du code.

Je ne l'ai pas utilisé pour savoir à quel point il fonctionne bien, mais quelqu'un d'autre que je connais a dit que cela fonctionnait assez bien. Si j'ai l'occasion, je le testerai moi-même pour voir.

2 votes

highlight partage tous les problèmes de Pygments, cependant. En particulier, ce n'est pas un package LaTeX, malgré ce que dit sa description. C'est simplement un programme autonome. Le problème, tout comme avec Pygments, est comment l'utiliser de manière significative depuis LaTeX et fournir toutes les fonctionnalités agréables que listings possède.

-9voto

Noufal Ibrahim Points 32200

Do you have to use LaTeX? I migrated from it to Emacs org-mode a while ago and find the inline code editing capability much more convenient than listings (although I wasn't really a power user of the latter). Also, I'm not sure if the line numbers and other facilities you mentioned are readily available but actual highlighting is as flexible as a general mode in Emacs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X