私はコンパイラー インタープリター セッション (この場合は GHCi ですが、これは関係ありません) の一部を含むドキュメントを書いています。そこで使用したい Haskell コードのスタイルを慎重に設定しています。ただし、プロンプト、特に出力は Haskell コードではないため、別の方法で印刷する必要があります。
次に例を示します。
\begin{lstlisting}
Prelude> let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! 10
55
\end{lstlisting}
以降の部分に異なるスタイルを適用する最もエレガントな方法は何ですかPrelude >
?
答え1
moredelim
1 つの方法としては、特定の部分に異なる書式設定を適用する (および構文の強調表示を削除する) オプションを使用する方法があります。
\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}
考えられる欠点は、これを「手作業」で行う必要があることです。パーツについては、スタイルを自動的に適用するオプションPrelude>
を使用できますmorekeywords
が、これで始まらない行については、Prelude>
より困難になります。
答え2
これは私のユースケースに十分な部分的な回答です。たとえば、コマンドのみをフォーマットし、残りはそのまま残します。
\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}
これにより、次の出力が生成されます。
lstlistings のフレーム オプションが使用できないため、まだ完全に満足できるわけではありません。これは、優れたadjustbox
パッケージを使用して模倣する必要がありました。また、出力のどこかに があると壊れます>
が、これは我慢できるものです。