20

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

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

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

4

7 回答 7

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的结果执行。 与 相同,但您可以在...创建的命令中使用任何字符甚至空格。\csname\endcsname\csname foo\endcsname\foo\csname\endcsname

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

于 2010-04-15T19:46:30.667 回答
5

Luatex has Lua's tables, which generalise arrays. If having standard Latex is not important to you, consider using Luatex with Latex. You can then do such things as:

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

Luatex is a bit flaky with Latex, because of the need to escape all kinds of Lua characters in the Latex code. Context has \startluacode ... \stopluacode macros to handle Lua code definitions, and \ctxlua for Lua code calls, and I can't see any reason why something like these couldn't be defined for Latex.

于 2010-04-19T12:23:35.623 回答
4

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

于 2010-04-16T12:41:33.367 回答
3

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

这是另一个示例,这个示例使用“数组”的推送和弹出。调用时\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 包的源代码改编了这段代码)

于 2010-04-15T20:04:22.430 回答
3

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

于 2010-04-15T21:08:00.213 回答
2

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

于 2010-04-15T20:51:03.290 回答
1

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

\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}
于 2018-07-26T09:36:51.843 回答