
我正在谈论的程序是 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
在文学部分中一样进行排版。我确信还有很多我忘记了的。