Имеет ли LaTeX структуру данных массива?

Существуют ли массивы в LaTeX? Я не имею в виду способ набора массивов. Я имею в виду массивы как структуру данных в LaTeX/TeX как "язык программирования". Мне нужно сохранить несколько vbox-es или hbox-es в массиве. Это может быть нечто вроде "массива макросов".

Подробнее: У меня есть среда, которая должна набирать песни. Мне нужно сохранить абзацы некоторых песен, приведенные в качестве аргументов для моего макроса \songparagraph (поэтому я их не набираю, просто сохраните эти абзацы). Поскольку я не знаю, сколько абзацев может быть в одной конкретной песне, мне нужен массив для этого. Когда среда закрыта, все абзацы будут набираться - но они будут сначала измерены, и будет выбрано наилучшее размещение для каждого абзаца (например, некоторые абзацы можно отложить в сторону другого в двух столбцах, чтобы заставить песню выглядеть более компактный и сохранить некоторое пространство).

Любые идеи приветствуются. Если вы знаете о массивах в LaTeX, разместите ссылку на базовую документацию, учебник или просто укажите основные команды.

Ответы

Ответ 1

Отметьте Arrayjob, который реализует массивы для LaTeX. По общему признанию, я только посмотрел на него, поэтому я не знаю, насколько он эффективен. Но, если вам не нужно писать это самостоятельно...

Ответ 2

Это массив, который может быть реализован в 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), и вы увидите результат.

Краткое объяснение: это создает две команды (с новой командой): ary1 и ary2. \expandafter необходим, потому что newcommand не должен определять \csname, а команду, созданную \csname... \endcsname. \expandafter перескакивает через следующий токен, в этом случае управляющая последовательность \newcommand и выполняет следующую команду перед тем, как TeX видит \newcommand. Это означает, что первое, что видит в новых командных линиях TeX, это конструкция \csname... \endcsname, TeX выполняет ее, а затем выполняет \newcommand с результатом конструкции \csname... \endcsname, \csname foo\endcsname совпадает с \foo, но вы можете использовать любой символ или даже пробелы в команде, созданной \csname... \endcsname.

Это не тривиально. Посмотрите великую книгу "TeX по темам" от Виктора Эйджута: http://eijkhout.net/texbytopic/texbytopic.html

Ответ 3

Luatex имеет таблицы Lua, которые обобщают массивы. Если стандартный латекс не важен для вас, подумайте об использовании Luatex с латексным покрытием. Затем вы можете делать такие вещи, как:

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

Luatex немного лаконичен с Latex, из-за необходимости избегать всех видов символов Lua в латексном коде. Контекст имеет \startluacode ... \stopluacode макросы для обработки определений кода Lua и \ctxlua для кодовых вызовов Lua, и я не вижу никакой причины, почему что-то подобное не может быть определено для Latex.

Ответ 4

Чтобы расширить ответ на ответ Патрика, короткий ответ - "Нет". Однако, поскольку он имеет макрорасширение, его можно запрограммировать на наличие массивов.

Вот еще один пример, который использует push и pop для "массивов". Когда вызывается \[email protected], он сохраняет текущий цвет в стек. \[email protected] принимает верхнее определение цвета и использует его:

\newcount\[email protected]
\def\[email protected]{%
  \xglobal\colorlet{foo\the\[email protected]}{.}%
\global\advance\[email protected] by1\relax}
\def\[email protected]{%
  \global\advance\[email protected] by-1\relax%
\color{foo\the\[email protected]}}

(я адаптировал этот код из источника для пакета луча)

Ответ 5

Вы также можете посмотреть что-то вроде пакета datatool или системы программирования expl3 и типа данных "Список свойств".

Ответ 6

pgfkeys и pgffor могут также работать на вас. Они являются частью пакета pgf (портативный графический формат), но они могут использоваться независимо от всех графических материалов.