동일한 목록 환경 내에서 대체 형식 지정

동일한 목록 환경 내에서 대체 형식 지정

나는 컴파일러 인터프리터 세션(이 경우 GHCi, 그러나 관련이 없음)의 일부를 포함하는 문서를 작성하고 있습니다. 거기에서 사용하고 싶은 Haskell 코드에 대해 신중하게 설정된 스타일이 있습니다. 그러나 프롬프트와 특히 출력은 Haskell 코드가 아니므로 다르게 인쇄되어야 합니다.

예는 다음과 같습니다.

\begin{lstlisting}
Prelude> let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! 10
55
\end{lstlisting}

Prelude >뒤따르는 것과 나머지 부분 에 서로 다른 스타일을 적용하는 가장 우아한 방법은 무엇입니까 ?

답변1

한 가지 접근 방식은 옵션을 사용하여 moredelim특정 부분에 다른 서식을 적용하고 구문 강조 표시를 없애는 것입니다.

\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}

그러면 다음과 같은 출력이 생성됩니다.

여기에 이미지 설명을 입력하세요

adjustboxnice 패키지를 사용하여 모방해야 했던 lstlistings의 프레임 옵션을 사용할 수 없기 때문에 여전히 완전히 만족스럽지 않습니다 . 또한 출력 어딘가에 이 있으면 문제가 발생 >하지만 그래도 괜찮습니다.

관련 정보