Вопрос

Есть ли массивы в латекс? Я не имею в виду путь к набрательным массивам. Я имею в виду массивы в качестве структуры данных в 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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top