У LATEX есть структура данных массива?
Вопрос
Есть ли массивы в латекс? Я не имею в виду путь к набрательным массивам. Я имею в виду массивы в качестве структуры данных в LaTex / Tex как «язык программирования». Мне нужно хранить ряд vbox-es или hbox-es в массиве. Это может быть что-то вроде «массив макросов».
Подробнее: у меня есть среда, которая должна набирать песни. Мне нужно хранить параграфы песни, приведенные в качестве аргументов моего Macro SongParraph (поэтому я не буду набирать их, просто хранить те пункты). Поскольку я не знаю, сколько абзацев можно в одной конкретной песне, мне нужен массив для этого. Когда окружающая среда закрыта, все абзацы будут напечатаны - но они будут впервые измерены, а лучшее размещение для каждого абзаца будет вычислена (например, некоторые абзацы могут быть указаны в стороне другой в двух столбцах, чтобы сделать песню более компактно и сохранить некоторое пространство).
Любые идеи были бы приветствуются. Пожалуйста, если вы знаете о массивах в LaTex, опубликуйте ссылку на некоторую базовую документацию, учебное пособие или просто основные команды.
Решение
Проверить Arrayjob. который реализует массивы для латекса. По общему признанию, я только заглянул только на него, поэтому я не знаю, насколько это будет эффективным. Но, если вам не нужно писать это сами ...
Другие советы
Это массив, как он может быть реализован в 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}
Запустите это через латекс (латекс mydoc.tex или pdflatex mydoc.tex), и вы видите вывод.
Краткое объяснение: это создает две команды (с NewCommand): ARY1 и ARY2. То \expandafter
нужен, потому что newcommand
не должен определять \csname
Но команда, созданная \csname
... \endcsname
. \expandafter
Перепрыгивает через следующий токен, в этом случае контрольная последовательность \newcommand
и выполняет следующую команду, прежде чем Tex видит \newcommand
. Отказ Это означает, что первое, что в NewCommand-Lines Tex видит, что \csname
...\endcsname
Конструкция, TEX выполняет его, а затем выполняет \newcommand
с результатом \csname
...\endcsname
построить. \csname foo\endcsname
такой же как \foo
, но вы можете использовать любой символ или даже пробелы в команде, созданной \csname
...\endcsname
.
Это не тривиально. Смотрите Великую книгу «Текс по теме» из Виктора Эйхоута: http://eijkhout.net/texbytopic/texbytopic.html.
Lua's имеет столы Луа, что обобщает массивы. Если для вас не важно стандартный латекс, рассмотрим использование Liupex с LaTex. Затем вы можете сделать такие вещи, как:
\def\lookup#1{\directlua {
local array={1,2,4,8}; tex.print(array[#1])}}
\[ 2 \mapsto \lookup{2} \]
Lipex немного Flaky с латексным, из-за необходимости избежать всех видов персонажей LUA в латексном коде. Контекст имеет \startluacode ... \stopluacode
Макросы для обработки определений кода LUA и \ctxlua
Для вызовов кода LUA, и я не вижу никаких причин, почему что-то вроде этого не может быть определено для латекса.
PGFKEYS и PGFFOR могут также работать для вас. Они часть PGF (Портативный графический формат) Пакет, но их можно использовать независимо от всех графических вещей.
Расширить ответ Патрика, краткий ответ - «нет». Однако, поскольку у него есть макросъемка, он может быть запрограммирован, чтобы иметь массивы.
Вот еще один пример, этот, использующий 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)
Вы также можете посмотреть на что-то вроде пакета DataTool или систему программирования RESULD3, а также тип данных «Список свойств».
То 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}