![TeX 的数据结构](https://linux22.com/image/231989/TeX%20%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.png)
我经常发现自己想要使用 TeX 中的标准数据结构。例如,列表或映射。每次有这种需求时,我都会重新发明轮子。出于某种原因,我发现自己经常使用堆栈。
是否有一个标准软件包(纯 TeX 或 LaTeX)可以提供方便的数据结构接口?如果可以将结构组合起来,例如,您可以获得地图列表,那么它们将非常有用。
答案1
其中一个想法是expl3
是提供一系列标准编程工具,数据结构也包含在内。目前,可用的结构化数据类型有序列、堆栈和属性列表。序列和堆栈具有相同的底层结构:它们是看待同一事物的不同方式。因此我们可能会
\seq_new:N \l_my_seq
\seq_put_right:Nn \l_my_seq { Some-tokens } % Sequence-like access
\seq_push:Nn \l_my_seq { More-tokens } % Stack-like access, puts to left
属性列表是一种键值类型数据类型
\prop_new:N \l_my_prop
\prop_put:Nnn \l_my_prop { key-name } { value }
属性列表是“无序的”,而序列/堆栈是有序的。在这两种情况下,都有可用的函数来映射到存储数据中的每个项目,例如\seq_map_function:NN
。
可以根据需要添加新数据类型expl3
:这取决于 LaTeX3 项目的要求,也取决于其他项目的要求。(当然请注意,我是 LaTeX3 项目的成员!)
另一组软件包提供了一些与expl3
包含许多数据相关结构类似的想法,它们是etoolbox
和etextools
.这两个包提供了映射到列表等的函数。
你也可以看看datatool
包,可用于在 LaTeX 中构建表格并以类似数据库的方式访问数据。
另外需要注意的是,LuaTeX 提供了对原生 Lua 数据存储方法的访问,如果你正在做一个只使用 LuaTeX 的项目,这当然是你应该首先考虑的地方。
答案2
我最近发现了一个包arrayjobx
(nee arrayjob),它改变了我对 TeX 的使用。链接列表和索引引用非常简单。数组与 TeX 的结合fp
使我能够管理 TeX 中的数字数据以供显示。阅读代码arrayjobx
也非常有启发性。
\documentclass{minimal}
\usepackage{arrayjobx}
\makeatletter
\usepackage{trimspaces}
\def\trimspace#1{\trim@spaces@in{#1}}
\makeatother
\begin{document}
\newarray\MyData
\readarray{MyData}{%
Years & 1996 & 1997 & 1998 & 1999 & 2000 &%
Revenues & 1034 & 1226 & 1445 & 1503 & 1992 &%
Costs & 668 & 706 & 813 & 946 & 1010 }
\dataheight=6
\def\returnHeading(#1){\checkMyData(#1,1)\trimspace\cachedata \cachedata}
\def\returnYear(#1){\checkMyData(1,#1)\trimspace\cachedata \cachedata}
\def\returnData(#1){\expandafter\checkMyData(#1)\trimspace\cachedata \cachedata}
\def\mycolumn{3}
\def\myrow{2}
Our expected \returnHeading(\myrow) in \returnYear(\mycolumn) were
\$\returnData(\myrow,\mycolumn).
\end{document}
另一方面,我不熟悉其他答案中提到的软件包。也许它们会使 arrayjob 过时。
答案3
没人在 Luatex 中提到过通往 Lua 的桥梁吗?好吧,Patrick 间接提到了。
- Luatex 本身为 Lua 实现的一半提供了许多低级原语,最重要的是命令
\directlua
。使用这个级别有点麻烦。 - Context 4 毫不奇怪地对 Lua 提供了很好的支持。例如,
\startluacode ... \endluacode
允许 Lua 自然地嵌入到 Context 文档中。这很重要,因为 Context 使用 Lua 来管理整个编译过程。 - 出现了用于 Latex 的高级 Lua 基础架构,代号为 Lualatex,带有必需的
\LuaLaTeX
宏,以及同样不错的嵌入代码环境。Texlive 2009 中没有太多内容,我还没有升级到 2010,但关于在 Latex 中支持 Luatex 挂钩的文档,帕特里克指出对我来说,看起来很开胃。 - Luatex 对 Plain Tex 有一些支持,代号为 Luatextras。
Lua 具有一种良好、高效、简约的数据结构方法,基于其表的概念,融合了列表和关联数组,并与其新颖的轻量级闭包方法一起使用,作为基于原型的对象系统的基础。
不错的,看看吧。