哪些约定或包适合于在 LaTeX 中格式化记录、代数数据类型?

哪些约定或包适合于在 LaTeX 中格式化记录、代数数据类型?

LaTeX 格式化实践已非常成熟,并且现有软件包对计算机科学中三种常见情况提供了良好的支持:

  • 源代码清单
  • 既定的传统数学符号
  • 标准算法伪代码

我发现我经常想用struct一种半正式的符号来描述诸如记录(C 语言中的 a)或代数数据类型之类的东西,这种符号的排版方式更接近数学模式(比例字体,有点偏离但与正文很好地结合在一起)而不是源代码(固定宽度的字体,与正文截然不同),但我发现如果不施加更多的结构和约定,一般数学模式就会很混乱。

例如,我可能想将某些数据的具体实例描述为一些记录:

foo {
    field : value
    field : value
}

bar {
    field : value
    field : value
    field : value
}

或者我可能想要绘制一个代数数据类型,例如:

type t = Foo(type, type)
       | Bar(type, type, type)

这里是否有一些软件包、标准特性amsmath,甚至只是人们喜欢的例子和需要遵循的约定?

我正在寻找一些可以与之配合使用的东西,例如,algorithmic用于格式化伪代码的环境和用于描述纯函数的简单数学模式。我设想的东西介于简化的 ML 类符号和完整的符号之间amsmath,后者旨在以高可读性的比例字体排版,而不是看起来像固定宽度的代码。

我发现我的手动尝试陷入了一个尴尬的中间点,我做出了很多选择来强制原始数学模式(或例如环境align)做一些合理的事,而像花括号这样用来分隔集合的东西可能是一个糟糕的选择。我希望不必完全从头开始推导我自己的符号和宏,但到目前为止还没有找到任何感觉合适的预先存在的东西。

答案1

这项任务似乎非常适合该tabstackengine包。虽然该包可以在很多方面模拟数学模式下的样式环境的行为align,但它默认是一个文本堆叠包。因此,您可以使用align样式语法(虽然是宏形式,而不是环境形式),但要在文本模式下进行。

注意:在文本模式下,列之间通常会指定非零间隙,因为与数学模式不同,在数学模式下,关系运算符会根据周围的操作数生成自己的间距,而文本列则按“原样”设置,并忽略前导和尾随空格。

\documentclass{article}
\usepackage{tabstackengine}
\begin{document}
\parindent 0in
\setstacktabbedgap{1ex}% default 0pt
\def\stackalignment{l}
\tabbedLongstack{
Foo &\{&\\
& field A:& value\\
& field AA:& value\\
\}
}\\
\\
\tabbedLongstack{
Longbar &\{&\\
& field B:& value\\
& field BBB:& value\\
& field BB:& value\\
\}
}\\
\\
\setstacktabulargap{1ex}% default \tabcolsep
\tabularLongstack{lcll}{
type t &=&Foo&(type, type)\\
& $|$ & Longbar&(type, type, type)
}
\end{document}

在此处输入图片描述

相关内容