LaTeX有阵列数据结构吗?

时间:2010-04-15 17:41:08

标签: arrays latex tex hbox

LaTeX中是否有数组?我不是指排版数组的方法。我的意思是将数组作为LaTeX / TeX中的数据结构作为“编程语言”。我需要在一个数组中存储一些vbox-es或hbox-es。它可能类似于“一系列宏”。

更多细节:我有一个应该排版歌曲的环境。我需要将一些歌曲的段落作为参数存储到我的macro \ songparagraph中(因此我不会对它们进行排版,只需存储这些段落)。由于我不知道在一首特定歌曲中可以有多少段落,我需要一个阵列。当环境关闭时,所有段落都将被排版 - 但是它们将首先被测量并且将计算每个段落的最佳位置(例如,一些段落可以放在另一列的两列中以使歌曲看起来更紧凑,节省一些空间。)

任何想法都会受到欢迎。 如果您了解LaTeX中的数组,请发布一些基本文档,教程或仅说明基本命令的链接。

7 个答案:

答案 0 :(得分:10)

这是一个如何在LaTeX中实现它的数组:

\documentclass{article}
\begin{document}

\newcounter{mycounter}
\setcounter{mycounter}{1}

% ary is any prefix you want, it should not exist as a command.

\expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{myfirstelement}
\stepcounter{mycounter}
\expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{mysecondelement}

\csname ary1 \endcsname

or

\newcounter{index}
\setcounter{index}{2}

\csname ary\the\value{index} \endcsname

\end{document}

通过LaTeX(latex mydoc.tex或pdflatex mydoc.tex)运行它,你会看到输出。

一个简短的解释:这会创建两个命令(使用newcommand):ary1和ary2。需要\expandafter,因为newcommand不应定义\csname,而是由\csname ... \endcsname创建的命令。 \expandafter跳过下一个标记,在本例中为控制序列\newcommand,并在TeX看到\newcommand之前执行下一个命令。这意味着,TeX看到的新命令行中的第一件事是\csname ... \endcsname构造,TeX执行它,然后执行\newcommand,结果为{{1} } ... \csname构造。 \endcsname\csname foo\endcsname相同,但您可以在\foo ... \csname创建的命令中使用任何字符甚至空格。

这不是微不足道的。请参阅Victor Eijkhout出版的伟大着作“TeX by topic”:http://eijkhout.net/texbytopic/texbytopic.html

答案 1 :(得分:5)

Luatex有Lua的表,它推广了数组。如果标准乳胶对您不重要,请考虑使用Luatex和Latex。然后你可以做以下事情:

\def\lookup#1{\directlua {
    local array={1,2,4,8}; tex.print(array[#1])}}
\[ 2 \mapsto \lookup{2} \]

Luatex对Latex来说有点不稳定,因为需要在Latex代码中转义各种Lua字符。 Context有\startluacode ... \stopluacode个宏来处理Lua代码定义,\ctxlua用于Lua代码调用,我看不出有什么理由不能为Latex定义这样的东西。

答案 2 :(得分:4)

pgfkeys和pgffor也可能适合你。它们是pgf(便携式图形格式)包的一部分,但它们可以独立于所有图形内容使用。

答案 3 :(得分:3)

为了扩展帕特里克的答案,简短的回答是“不”。但是,由于它具有宏扩展,因此可以将其编程为具有数组。

这是另一个例子,这个使用push和pop来表示“数组”。调用\type@pushcolour时,会将当前颜色保存到堆栈中。 \type@popcolour采用顶部颜色定义,并使用它:

\newcount\type@count
\def\type@pushcolour{%
  \xglobal\colorlet{foo\the\type@count}{.}%
\global\advance\type@count by1\relax}
\def\type@popcolour{%
  \global\advance\type@count by-1\relax%
\color{foo\the\type@count}}

(我从beamer包的源代码改编了这段代码)

答案 4 :(得分:3)

您还可以查看datatool包或explo3编程系统以及“属性列表”数据类型。

答案 5 :(得分:2)

查看实现LaTeX数组的Arrayjob。不可否认,我只是偷看它,所以我不知道它会有多么有效。但是,如果你不必自己写呢......

答案 6 :(得分:0)

readarray软件包允许将格式化的数据输入到元素中 2D或3D阵列(或1D文件记录阵列)。

\documentclass{standalone}
\usepackage{readarray}

\def\data{% the data
1 15 14 4
10 11 8 5
7 6 9 12
16 2 3 13
}
\readarray\data\dataA[4,4] %read the data to \dataA

\begin{document}
value at (2,1) = \dataA[2,1] %access a specific field
\end{document}