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}