在 LaTeX 中重现 lhs2tex 的代码缩进

在 LaTeX 中重现 lhs2tex 的代码缩进

预处理器 lhs2tex 有一种非常简洁的代码对齐方式。请看以下代码片段:

let t1 = foo x
in  let g x =  if x > 10
               then  t1
               else  let t2 = bar x
                     in  let h y =  if y > 10
                                    then  g (t2 y)
                                    else  h (y+1)
                         in h 1 x
    in g 1 2

它根据两个以上的空格检测所需的缩进,并使用(我相信)嵌套的制表符环境来生成以下内容:

格式良好的代码

请注意,虽然使用了比例字体,但垂直对齐效果很好。

有没有办法在 LaTeX 中方便地重现这种情况?也许甚至使用列表(我已经为其正确配置了语法突出显示)?

答案1

我直接使用 lhs2texpolytable包对其进行了近似计算,现在得到了所需的输出:

\begin{acode}
\> !let t1 = foo x \\
\> !in \> !let g x = \> !if x > 10 \\
\>     \>            \> !then \> t1 \\
\>     \>            \> !else \> !let t2 = bar x \\
\>     \>            \>       \> !in  \> !let h y = \> !if y > 10 \\
\>     \>            \>       \>      \>            \> !then \> g (t2 y) \\
\>     \>            \>       \>      \>            \> !else \> h (y+1) \\
\>     \>            \>       \>      \> !in h 1 x \\
\>     \> !in g 1 2. \\
\end{acode}

通过使用这些定义:

\begingroup
\catcode`!=\active
\gdef\activateexclamationmark{%    note the global \gdef
  \catcode`!=\active%
  \def!##1 {\hkw{##1} }%
}
\endgroup

\def\acode{%
\begingroup%
\activateexclamationmark%
\sffamily%
\ptboxed%
\defaultcolumn{@{}l@{ }}%
\ignorespaces%
}
\def\endacode{%
\endptboxed%
\endgroup%
}

\newcommand{\hkw}[1]{\textbf{#1}}

内容catcode是介绍!——一个低噪音近似真正的语法高亮,但我想不出一种方法来让语法高亮能够插入我的标签标记。

我仍然想知道是否有可能定义一个环境,逐字读取其内容并用 替换每两个或多个空格的一段\={n},其中n是最后一个空格的列。

相关内容