LaTeX有阵列数据结构吗?

Ras*_*sto 17 arrays latex tex hbox

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

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

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

top*_*kip 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}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Cha*_*art 5

Luatex有Lua的表,这些表可以概括数组。如果拥有标准乳胶对您并不重要,请考虑将Luatex与乳胶一起使用。然后,您可以执行以下操作:

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

由于需要在Latex代码中转义各种Lua字符,因此Luatex与Latex有点不同。Context具有\startluacode ... \stopluacode宏来处理Lua代码定义和\ctxluaLua代码调用,并且我看不出无法为Latex定义类似这些的任何原因。


rco*_*yer 2

查看为 LaTeX 实现数组的Arrayjob 。诚然,我只是看了一眼,所以我不知道它的效果如何。但是,如果您不必自己编写......