ЛАТЕКС имеет структуру данных массива?

Есть ли в ЛАТЕКСЕ массивы? Я не имею в виду способ набрать массивы. Я имею в виду массивы как структуру данных в ЛАТЕКСЕ/TEX как "язык программирования". Я должен сохранить много vbox-es или hbox-es в массиве. Это может быть что-то как "массив макросов".

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

Любые идеи приветствовались бы. Если Вы знаете о массивах в ЛАТЕКСЕ, отправляете ссылку на некоторую основную документацию, учебное руководство или просто заявляете основные команды.

17
задан Svante 15 April 2010 в 18:27
поделиться

6 ответов

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

2
ответ дан 30 November 2019 в 12:50
поделиться

Вы также можете посмотреть что-нибудь вроде пакета datatool или системы программирования Exp3 и типа данных «список свойств».

3
ответ дан 30 November 2019 в 12:50
поделиться

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

Вот еще один пример, использующий 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)

3
ответ дан 30 November 2019 в 12:50
поделиться

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

4
ответ дан 30 November 2019 в 12:50
поделиться

В 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 должен быть определен для латекса.

5
ответ дан 30 November 2019 в 12:50
поделиться

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

10
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: