Ответ 1
Отметьте Arrayjob, который реализует массивы для LaTeX. По общему признанию, я только посмотрел на него, поэтому я не знаю, насколько он эффективен. Но, если вам не нужно писать это самостоятельно...
Существуют ли массивы в LaTeX? Я не имею в виду способ набора массивов. Я имею в виду массивы как структуру данных в LaTeX/TeX как "язык программирования". Мне нужно сохранить несколько vbox-es или hbox-es в массиве. Это может быть нечто вроде "массива макросов".
Подробнее: У меня есть среда, которая должна набирать песни. Мне нужно сохранить абзацы некоторых песен, приведенные в качестве аргументов для моего макроса \songparagraph (поэтому я их не набираю, просто сохраните эти абзацы). Поскольку я не знаю, сколько абзацев может быть в одной конкретной песне, мне нужен массив для этого. Когда среда закрыта, все абзацы будут набираться - но они будут сначала измерены, и будет выбрано наилучшее размещение для каждого абзаца (например, некоторые абзацы можно отложить в сторону другого в двух столбцах, чтобы заставить песню выглядеть более компактный и сохранить некоторое пространство).
Любые идеи приветствуются. Если вы знаете о массивах в LaTeX, разместите ссылку на базовую документацию, учебник или просто укажите основные команды.
Отметьте Arrayjob, который реализует массивы для LaTeX. По общему признанию, я только посмотрел на него, поэтому я не знаю, насколько он эффективен. Но, если вам не нужно писать это самостоятельно...
Это массив, который может быть реализован в 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
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.
Чтобы расширить ответ на ответ Патрика, короткий ответ - "Нет". Однако, поскольку он имеет макрорасширение, его можно запрограммировать на наличие массивов.
Вот еще один пример, который использует 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]}}
(я адаптировал этот код из источника для пакета луча)
Вы также можете посмотреть что-то вроде пакета datatool или системы программирования expl3 и типа данных "Список свойств".
pgfkeys и pgffor могут также работать на вас. Они являются частью пакета pgf (портативный графический формат), но они могут использоваться независимо от всех графических материалов.