Formato alternativo dentro del mismo entorno de listado

Formato alternativo dentro del mismo entorno de listado

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 moredelimopció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}

ingrese la descripción de la imagen aquí

Una posible desventaja es que hay que hacerlo "a mano". Para la Prelude>parte puedes usar la morekeywordsopció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

ingrese la descripción de la imagen aquí

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 adjustboxpaquete nice. Además, se rompe si hay una >salida en algún lugar, pero eso es algo con lo que puedo vivir.

información relacionada