Estoy escribiendo un documento que contiene partes de una sesión de intérprete compilador (GHCi en este caso, pero esto no es relevante). Tengo un estilo cuidadosamente configurado para el código Haskell que me gustaría usar allí. Pero el mensaje y especialmente el resultado no es código Haskell y debería imprimirse de manera diferente.
Aquí hay un ejemplo:
\begin{lstlisting}
Prelude> let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! 10
55
\end{lstlisting}
¿Cuál es la forma más elegante de aplicar un estilo diferente a lo que sigue al Prelude >
y al resto?
Respuesta1
Un enfoque sería utilizar la moredelim
opción para aplicar un formato diferente (y eliminar el resaltado de sintaxis) en ciertas partes:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{listings}
\newcommand{\notCode}{\color[rgb]{0.0,0.35,0.6}}
\lstset{
language=Haskell,
basicstyle=\ttfamily,
showstringspaces=false,
breaklines=true,
keywordstyle={\textit},
moredelim=[is][\notCode]{@}{@},
}
\begin{document}
\begin{lstlisting}
@Prelude>@ let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! 10
@55@
\end{lstlisting}
\end{document}
Una posible desventaja es que hay que hacerlo "a mano". Para la Prelude>
parte puedes usar la morekeywords
opción de aplicar automáticamente su estilo, pero para las líneas que no comienzan con Prelude>
esto será más difícil.
Respuesta2
Aquí hay una respuesta parcial que es suficiente para mi caso de uso, por ejemplo, formatear solo los comandos y dejar el resto palabra por palabra:
\documentclass{article}
\usepackage{listings}
\usepackage{framed}
\lstset{language=Haskell,basicstyle=\small\sffamily,stringstyle=\itshape}
\begingroup
\catcode`\>=\active%
\catcode`\^^M=\active%
\gdef\foo{%
\catcode`\>=\active%
\catcode`^^M=\active%
\def > ##1^^M{\char`\>{} \lstinline!##1!\par}%
\def ^^M{\par}%
}%
\endgroup
\newenvironment{ghci}{%
\begin{framed}%
\begingroup%
\small\ttfamily%
\foo%
}{%
\endgroup%
\end{framed}%
}
\begin{document}
\pagestyle{empty}
\begin{ghci}
*Count> let s = "hello stackexchange"
*Count> let x = count 0 [0..100000000]
*Count> x
Just *** Exception: stack overflow
\end{ghci}
\end{document}
Esto produce el siguiente resultado
Todavía no es del todo satisfactorio, ya que no puedo usar las opciones de marco de lstlistings, las cuales tuve que imitar usando el adjustbox
paquete nice. Además, se rompe si hay una >
salida en algún lugar, pero eso es algo con lo que puedo vivir.