web-dev-qa-db-fra.com

Mise en évidence du code source dans LaTeX

Je dois mettre en évidence le code source dans LaTeX. Le paquetage listings semble être le meilleur choix pour la plupart des cas d'utilisation et pour moi il l'était jusqu'à présent.

Cependant, j'ai maintenant besoin de plus de flexibilité. Généralement, ce que je recherche, c’est un lexer real. En particulier, j'ai besoin (pour une définition de langage propre) de définir (et de mettre en évidence!) Les styles de numéro propres. listings n'autorise pas la mise en évidence de nombres dans le code. Cependant, je dois produire quelque chose comme ceci:

Required result

listings ne peut pas non plus gérer les délimiteurs arbitraires des chaînes. Considérez le code Ruby) valide suivant:

s = %q!this is a string.!

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

(listings ne peut pas gérer Unicode est aussi très frustrant, mais c’est un autre problème.)

Idéalement, je recherche une extension de listings qui me permette de fournir des règles de lexing plus complexes. Mais à part cela, je cherche aussi des alternatives viables.

Autres discussions ont suggéré d'utiliser Pygments qui peut produire une sortie LaTeX. Il y a même un paquet - 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 aux lignes du code source et à la possibilité d'incorporer LaTeX dans le code source (options texcl et mathescape dans listings).

À titre d’exemple, voici un code source composé avec listings qui montre certaines des choses qu’un remplacement devrait également fournir:

LaTeX listings example: Sideways addition[“Ajout latéral” modifié de Bit Twiddling Hacks]

184
Konrad Rudolph

Prenant à cœur les conseils de Norman, j’ai mis au point une solution qui utilisait (un corrigé ) Pygments pour mettre en évidence et intégrer autant de fonctionnalités que possible sans éclater ;-)

J’ai également créé un paquet LateX, une fois mon correctif Pygments publié dans version 1.2

Présentation frappée

minted est un paquet qui utilise Pygments pour fournir une mise en évidence de la syntaxe de qualité supérieure dans LaTeX. . Par exemple, il permet la sortie suivante.

fancy LaTeX example

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é en utilisant la commande suivante:

xelatex -Shell-escape test.tex

(Mais frappée 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ée à produire ce package.

336
Konrad Rudolph

TeX est (célèbre) Turing-complete, mais je suis sûr que vous allez devoir écrire cette extension vous-même. La documentation indique clairement que l'auteur original de listings l'a orphelin en 2004 et qu'il n'a pas été mis à jour depuis 2006. Le paquet n'a pas été conçu pour remplacer le formatage des littéraux numériques, mais vous pourriez peut-être pour le modifier en changeant la définition de \lst@ProcessDigit. Si cela ne fonctionne pas, vous devrez comprendre en détail comment fonctionnent les options de "style d'identificateur", 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 comme vous l'êtes, vous devrez faire un travail supplémentaire. Après avoir examiné le code source, je pense que la modification de listings devrait être possible, mais je choisirais personnellement de prétraiter mon LaTeX.

5
Norman Ramsey

This est un paquet qui convertit le code source en TeX et LaTeX avec la 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 inclut 50 thèmes de couleurs. Il comporte le reformatage et l'indentation de code.

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

3
homerj