O LaTeX possui uma estrutura de dados array?
Pergunta
Existem matrizes no LaTeX?Não me refiro à maneira de compor matrizes.Quero dizer arrays como estrutura de dados em LaTeX/TeX como uma "linguagem de programação".Preciso armazenar vários vbox-es ou hbox-es em uma matriz.Pode ser algo como "uma série de macros".
Mais detalhes:Eu tenho um ambiente que deveria compor músicas.Preciso armazenar alguns parágrafos de músicas dados como argumentos para minha macro \songparagraph (portanto, não irei digitá-los, apenas armazenarei esses parágrafos).Como não sei quantos parágrafos podem haver em uma música específica, preciso de um array para isso.Quando o ambiente estiver fechado, todos os parágrafos serão digitados - mas eles serão medidos primeiro e o melhor posicionamento para cada parágrafo será computado (por exemplo, alguns parágrafos podem ser colocados um ao lado do outro em duas colunas para fazer a música parecer mais compacto e economizar algum espaço).
Alguma idéia seria bem-vinda.Por favor, se você conhece arrays em LaTeX, poste um link para alguma documentação básica, tutorial ou apenas indique comandos básicos.
Solução
Verificação de saída ArrayJob que implementa matrizes para o látex. É certo que eu só espiei, então não sei o quão eficaz será. Mas, se você não tiver que escrever você mesmo ...
Outras dicas
Esta é uma matriz como pode ser implementada no 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}
Execute isso através do LATEX (LATEX mydoc.tex ou pdflatex mydoc.tex) e você verá a saída.
Uma explicação curta: isso cria dois comandos (com NewCommand): ARY1 e ARY2. o \expandafter
é necessário porque newcommand
não deve definir \csname
Mas o comando criado por \csname
... \endcsname
. \expandafter
salta sobre o próximo token, neste caso a sequência de controle \newcommand
e executa o próximo comando antes de Tex ver o \newcommand
. Isso significa que a primeira coisa no NewCommand-lines tex vê é o \csname
...\endcsname
Construct, Tex executa e depois executa \newcommand
com o resultado do \csname
...\endcsname
construir. \csname foo\endcsname
é o mesmo que \foo
, mas você pode usar qualquer personagem ou até espaços no comando criado por \csname
...\endcsname
.
Isso não é trivial. Veja o grande livro "Tex by Topic" de Victor Eijkhout: http://eijkhout.net/texbytopic/texbytopic.html
O Luatex tem as mesas de Lua, que generalizam as matrizes. Se o látex padrão não for importante para você, considere usar o Luatex com o LATEX. Você pode então fazer coisas como:
\def\lookup#1{\directlua {
local array={1,2,4,8}; tex.print(array[#1])}}
\[ 2 \mapsto \lookup{2} \]
O Luatex é um pouco esquisito com látex, devido à necessidade de escapar de todos os tipos de caracteres da Lua no código de látex. Contexto tem \startluacode ... \stopluacode
macros para lidar com definições de código Lua e \ctxlua
Para chamadas de código da Lua, e não consigo ver nenhum motivo para que algo assim não possa ser definido para o látex.
pgfkeys e pgffor também podem funcionar para você.Eles fazem parte do pgf (formato gráfico portátil), mas eles podem ser usados independentemente de todo o material gráfico.
Para expandir a resposta de Patrick, a resposta curta é "não". No entanto, como possui expansão macro, pode ser programado para ter matrizes.
Aqui está outro exemplo, este usando push e pop para "matrizes". Quando \type@pushcolour
é chamado, ele salva a cor atual na pilha. \type@popcolour
pega a definição de cor superior e a usa:
\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}}
(Adaptei este código da fonte do pacote Beamer)
Você também pode olhar para algo como o pacote Datatool ou o sistema de programação Expl3 e o tipo de dados "Lista de propriedades".
o ReadArray O pacote permite inserir dados formatados em elementos de uma matriz 2D ou 3D (ou uma matriz de registro de arquivo 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}