Есть ли в ЛАТЕКСЕ массивы? Я не имею в виду способ набрать массивы. Я имею в виду массивы как структуру данных в ЛАТЕКСЕ/TEX как "язык программирования". Я должен сохранить много vbox-es или hbox-es в массиве. Это может быть что-то как "массив макросов".
Подробнее: У меня есть среда, которая должна набрать песни. Я должен сохранить абзацы некоторых песен, данные как аргументы моему макросу \songparagraph (таким образом, я не наберу их, просто сохраню те абзацы). Поскольку я не знаю, сколькими абзацы могут быть в одной конкретной песне, мне нужен массив для этого. Когда среда будет закрыта, все абзацы будут набраны - но они будут сначала измеряться, и лучшее размещение для каждого абзаца будет вычислено (например, некоторые абзацы могут быть отложены один другой в двух столбцах, чтобы заставить песню выглядеть более компактной и оставить некоторое свободное место).
Любые идеи приветствовались бы. Если Вы знаете о массивах в ЛАТЕКСЕ, отправляете ссылку на некоторую основную документацию, учебное руководство или просто заявляете основные команды.
Посмотрите Arrayjob , который реализует массивы для LaTeX. По общему признанию, я только взглянул на это, поэтому не знаю, насколько это будет эффективно. Но, если вам не нужно писать это самостоятельно ...
Вы также можете посмотреть что-нибудь вроде пакета datatool или системы программирования Exp3 и типа данных «список свойств».
Чтобы расширить ответ Патрика, краткий ответ - «Нет». Однако, поскольку он имеет расширение макросов, его можно запрограммировать на массивы.
Вот еще один пример, использующий 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)
pgfkeys и pgffor также могут работать для вас. Они являются частью пакета pgf (переносимый графический формат), но их можно использовать независимо от всего графического материала.
В Luatex есть таблицы Lua, которые обобщают массивы. Если для вас не важен стандартный латекс, подумайте об использовании Luatex с латексом. Затем вы можете делать такие вещи, как:
\def\lookup#1{\directlua {
local array={1,2,4,8}; tex.print(array[#1])}}
\[ 2 \mapsto \lookup{2} \]
Luatex немного нестабилен с Latex из-за необходимости экранировать все виды символов Lua в коде Latex. В контексте есть макросы \ startluacode ... \ stopluacode
для обработки определений кода Lua и \ ctxlua
для вызовов кода Lua, и я не вижу причин, по которым что-то подобное не могло ' t должен быть определен для латекса.
Это массив, как это может быть реализовано в 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
необходим, потому что новая команда
не должна определять \ 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