LaTeX中是否有数组?我不是指排版数组的方法。我的意思是将数组作为LaTeX / TeX中的数据结构作为“编程语言”。我需要在一个数组中存储一些vbox-es或hbox-es。它可能类似于“一系列宏”。
更多细节:我有一个应该排版歌曲的环境。我需要将一些歌曲的段落作为参数存储到我的macro \ songparagraph中(因此我不会对它们进行排版,只需存储这些段落)。由于我不知道在一首特定歌曲中可以有多少段落,我需要一个阵列。当环境关闭时,所有段落都将被排版 - 但是它们将首先被测量并且将计算每个段落的最佳位置(例如,一些段落可以放在另一列的两列中以使歌曲看起来更紧凑,节省一些空间。)
任何想法都会受到欢迎。 如果您了解LaTeX中的数组,请发布一些基本文档,教程或仅说明基本命令的链接。
答案 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}