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.

Foi útil?

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. \expandaftersalta 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}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top