Código fuente resaltado en LaTeX

196

Necesito resaltar el código fuente en LaTeX. El paquetelistings parece ser la mejor opción para la mayoría de los casos de uso y para mí lo era, hasta ahora.

Sin embargo, ahora necesito más flexibilidad. En general, lo que estoy buscando es un verdadero lexer. En particular, necesito (para una definición de idioma propia) definir (¡y resaltar!) Estilos de números propios. listingsno permite resaltar números en el código. Sin embargo, necesito producir algo como esto:

Resultado requerido

listingstampoco puede hacer frente a delimitadores arbitrarios para cadenas. Considere el siguiente código válido de Ruby:

s = %q!this is a string.!

Aquí, !puede ser reemplazado por casi cualquier delimitador.

(Eso listingsno puede manejar Unicode también es bastante molesto, pero ese es otro problema).

Idealmente, estoy buscando una extensión listingsque me permita proporcionar reglas de lexing más complejas. Pero salvo eso, también estoy buscando alternativas viables.

Otros hilos han sugerido usar Pygments que pueden producir resultados de LaTeX. Incluso hay un paquete texmentspara facilitar la transición.

Sin embargo, esto carece de características. En particular, estoy interesado en la listingsnumeración de líneas de estilo, referencias de línea de código fuente y la posibilidad de incrustar LaTeX en el código fuente (opciones texcly mathescapeen listings).

Como ejemplo, aquí hay un tipo de código fuente con el listingsque se muestran algunas de las cosas que un reemplazo también debe proporcionar:

Ejemplo de listados de LaTeX: adición lateral ["Adición lateral" modificada de Bit Twiddling Hacks]

Konrad Rudolph
fuente
Si no es reacio a incorporar herramientas externas como pigmentos, ¿por qué no simplemente escribe un archivo MAKE para su documento?
Mica
66
¿No debería migrarse a tex.stackexchange.com ? ^^
Matthias
1
@Matthias No estoy seguro. Cuando lo publiqué no había tex.se, pero ahora parece bastante útil aquí: la pregunta ha tenido un tremendo eco, mientras que en TeX.SE nadie ha publicado una pregunta similar. Además, en realidad se relaciona específicamente con la programación y las herramientas de programación, así que supongo que los programadores son las personas que se benefician de ello.
Konrad Rudolph
1
Para aquellos que pueden olvidar LaTeX por el documento que están escribiendo actualmente: ¡Tenga en cuenta que con Office Word o LibreOffice Writer, simplemente copie / pegue su código de, por ejemplo, Eclipse y conserve sus colores!
MohamedEzz
3
@MemoryLeaks No estoy seguro de quién es este consejo terriblemente útil: el software de Office no es un sustituto válido de LaTeX (que no es un software de oficina, es un sistema de publicación de escritorio, lo que, en pocas palabras, significa que proporciona una tipografía muy superior , aparte de todas sus otras ventajas sobre el software de oficina).
Konrad Rudolph

Respuestas:

352

Tomando en serio el consejo de Norman, he pirateado una solución que usó Pygments ( parcheados ) para resaltar e introduje la mayor cantidad de características posibles sin reventar ;-)

También he creado un paquete LateX, una vez que mi parche Pygments fue lanzado en la versión 1.2 ...

Presentación acuñada

Minted es un paquete que utiliza Pygments para proporcionar sintaxis de primera categoría destacando en LaTeX. Por ejemplo, permite la siguiente salida.

ejemplo elegante de LaTeX

¡Aquí hay un archivo mínimo para reproducir el código anterior (tenga en cuenta que incluir caracteres Unicode puede requerir 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}

Esto se puede componer usando el siguiente comando:

xelatex -shell-escape test.tex

(Pero acuñado también funciona con latexy pdflatex...)

minted.styfunciona de manera similar texments.stypero permite características adicionales.

Cómo conseguirlo

Una vez más, gracias a Norman por motivarme a producir este paquete.

Konrad Rudolph
fuente
19
Después de horas de búsqueda sobre cómo usar pigmentos con LaTeX, y más horas de intentar hackear mi propia solución, este es el mejor que he encontrado. Mejor aún, en realidad funciona. Gracias por esto.
sykora
2
¡Aquí solo para apreciar el trabajo que has hecho de una manera decente!
Filip Dupanović
44
@Paul: Es cierto que todo esto es bastante desordenado en Windows. :-( Con suerte, la próxima versión de Pygments aliviará esta un poco, pero para las personas que no suelen trabajar con Python (y por tanto easy_install) el proceso nunca será muy suave.
Konrad Rudolph
1
En el sitio de TeX SE ahora hay bastantes preguntas sobre su paquete , y acabo de responder una con una especie de solicitud de función (oculta en los comentarios) . Es posible que desee echar un vistazo.
Paŭlo Ebermann
1
@ Paŭlo Gracias. Intento leer todas las menciones del paquete (tengo una alerta de Google) pero no siempre tengo éxito. La pregunta que mencionaste realmente la he leído (aparentemente: lo voté pero no lo recuerdo) pero no es del todo sencillo. "Ab" usando TikZ para esto parece un mal truco ...
Konrad Rudolph el
6

TeX es (famoso) Turing completo, pero estoy bastante seguro de que tendrá que escribir esta extensión usted mismo. La documentación deja en claro que el autor original lo listingsdejó huérfano en 2004 y que no se actualizó desde 2006. El paquete no fue diseñado para anular el formato de los literales numéricos, pero es posible que pueda modificarlo cambiando el definicion de\lst@ProcessDigit . Si eso no funciona, deberá comprender en detalle cómo funcionan las opciones de "estilo de identificador", y deberá duplicar esa maquinaria para sus literales numéricos.

No entiendo por qué eres tan reacio a introducir una herramienta externa en tu cadena de herramientas, pero debido a que lo eres, tendrás que hacer un trabajo adicional. Después de echar un vistazo al código fuente, espero que la modificación listingssea ​​posible, pero personalmente elegiría procesar mi LaTeX en su lugar.

Norman Ramsey
fuente
No soy reacio a introducir herramientas externas; de hecho, creo que usar Pygments es probablemente la mejor solución. La pregunta es cómo hacer esto de una manera inteligente para que todavía pueda tener escapes a LaTeX y \labels dentro del código.
Konrad Rudolph
En cuanto al cambio listings, ya he echado un vistazo a su origen, y desafortunadamente, no lo entiendo en absoluto. Mis habilidades de TeX no están cerca de ese nivel. Hasta ahora, solo he usado el subconjunto LaTeX de TeX de todos modos.
Konrad Rudolph, el
1
Yo diría que el mayor problema con la introducción de una herramienta externa es que si estás publicando. Muchos editores de revistas (SPRINGER para la tos y otros) requieren el envío en formato LaTex sin procesar, que luego se compila en sus servidores. No es necesario decir que si su herramienta de terceros no está en su servidor, usted es SOL a menos que preprocese (lo que anula la mayor parte de la utilidad de dejar que Tex conduzca).
Nombre
Si la documentación es correcta, el paquete de listados aún se mantiene; sin embargo, el responsable de
DetlevCM
1
@ Namey, solo un punto de datos: me las arreglé para escabullir un documento con éxito mintedmediante el proceso de publicación LNCS de Springer.
Volker Stolz
3

Este es un paquete que convierte el código fuente a TeX y LaTeX con resaltado de sintaxis. Es posible agregar fácilmente definiciones de lenguaje de programación personalizadas.

Highlight admite 100 lenguajes de programación e incluye 50 temas de colores. Cuenta con reformateo y sangría de código.

No lo he usado para saber cómo funciona BIEN, pero alguien más que conozco dijo que funcionó bastante bien. Si tengo la oportunidad, lo probaré yo mismo y veré.

Homerj
fuente
1
highlightSin embargo, comparte todos los problemas de Pygments. En particular, no es un paquete LaTeX , a pesar de lo que dice su descripción. Es simplemente un programa independiente. El problema, al igual que con Pygments, es cómo usarlo significativamente desde LaTeX y proporcionar todas las cosas buenas que listingstiene.
Konrad Rudolph