附录

附录

我正在谈论的程序是 Haskell(ish)。

在编程世界中Haskell 是主流语言中数学性最强的。然而,当涉及到实际的 Haskell 代码并排版作为数学结果是痛苦的(对我来说到目前为止!)

仅供参考

是的,我知道这不时髦。是的,我知道当前的流行做法是将程序排版为程序,即逐字/信使。

但几十年前,这种做法并不流行。例如,Bird & Wadler 的《函数式编程入门》第一版的排版是精美的数学,并附有小附录,说明如何将数学转码为 Miranda。 从第二版开始,数学 Miranda 变成了 Haskell 信使。一些“信徒”说,第一版有第二版所没有的东西流连忘返

我一直在探索如何在 2022 年复制 1987 年的黑白风格。
到目前为止进展不太顺利……停留在排版阶段本身

答案1

listings您所追求的大部分内容都可以在 LaTeX 的包中使用合适的文学配置来完成。Haskell 的维基百科有一个示例配置。

他们的配置:

\usepackage{listings}
\lstloadlanguages{Haskell}
\lstnewenvironment{code}
    {\lstset{}%
      \csname lst@SetFirstLabel\endcsname}
    {\csname lst@SaveFirstLabel\endcsname}
    \lstset{
      basicstyle=\small\ttfamily,
      flexiblecolumns=false,
      basewidth={0.5em,0.45em},
      literate={+}{{$+$}}1 {/}{{$/$}}1 {*}{{$*$}}1 {=}{{$=$}}1
               {>}{{$>$}}1 {<}{{$<$}}1 {\\}{{$\lambda$}}1
               {\\\\}{{\char`\\\char`\\}}1
               {->}{{$\rightarrow$}}2 {>=}{{$\geq$}}2 {<-}{{$\leftarrow$}}2
               {<=}{{$\leq$}}2 {=>}{{$\Rightarrow$}}2 
               {\ .}{{$\circ$}}2 {\ .\ }{{$\circ$}}2
               {>>}{{>>}}2 {>>=}{{>>=}}2
               {|}{{$\mid$}}1               
    }

例如,它将用 替换,\用替换$\lambda$,等等。=>$\Rightarrow$

附录

如果您想使用多种语言,如 Haskell 和一些“blub”语言(例如 Python),一种可能的配置是:

\usepackage{listings}
\lstloadlanguages{Haskell}

\lstnewenvironment{haskell}
    {\lstset{language=Haskell,
      basicstyle=\small\ttfamily,
      flexiblecolumns=false,
      basewidth={0.5em,0.45em},
      literate={+}{{$+$}}1 {/}{{$/$}}1 {*}{{$*$}}1 {=}{{$=$}}1
               {>}{{$>$}}1 {<}{{$<$}}1 {\\}{{$\lambda$}}1
               {\\\\}{{\char`\\\char`\\}}1
               {->}{{$\rightarrow$}}2 {>=}{{$\geq$}}2 {<-}{{$\leftarrow$}}2
               {<=}{{$\leq$}}2 {=>}{{$\Rightarrow$}}2 
               {\ .}{{$\circ$}}2 {\ .\ }{{$\circ$}}2
               {>>}{{>>}}2 {>>=}{{>>=}}2
               {|}{{$\mid$}}1               
    }}{}

\lstnewenvironment{python}
    {\lstset{language=Python,
      basicstyle=\small\ttfamily,
      % further customizations can be inserted here
    }}{}

对于 Python 漂亮打印,有一些 其他每个线程都有自己的风格选择...对于现在的 Python 字体来说,我不太确定什么才是有吸引力的。

附录 2:特殊 Haskell 注意事项

您可以进行一些小的调整来使代码“更漂亮”。

1. 单子绑定。Haskell 使用特殊的符号来表示单子“绑定”操作。你可以使用以下方式排版(我忘了从哪里学来的):

\newcommand{\bind}{\mathbin{>\!\!\!>\mkern-6.7mu=}}

然后在“文学”部分,只需替换{>>=}{{>>=}}2{>>=}{{$\bind$}}3

2. 通配符。此外,“通配符”模式(例如,_出现在表达式中的)可以使用以下方式更好地排版:case

\newcommand\haskWildcard{\kern0.06em \vbox{\hrule width .5em}}

然后在 Haskell 代码的“literate”部分添加{\ _}{{\ \haskWildcard}}2

3.对于标准ML。如果您正在排版标准 ML,您可能需要将{\ o\ }{{\ $\circ$\ }}3和添加{*}{$\times$}1到文学部分,因为这些对于 SML 来说很古怪。(我对文学标准 ML 还有其他建议,但我认为没有多少人关心。)

4. 其他杂七杂八的东西。Haskell 中还有其他随机选择,例如<$>,可能可以像{<$>}{{$\langle\$\rangle$}}2在文学部分中一样进行排版。我确信还有很多我忘记了的。

相关内容