Non LaTeX hanno un array?
Domanda
Ci sono le matrici in LaTeX? Non intendo il modo di comporre gli array. Ho array media come la struttura dei dati in LaTeX / TeX come un "linguaggio di programmazione". Ho bisogno di memorizzare un numero di VBOX-ES o HBOX-es in un array. Potrebbe essere qualcosa di simile a "una serie di macro".
Più informazioni: Ho un ambiente che dovrebbe comporre canzoni. Ho bisogno di memorizzare i paragrafi alcune canzoni passati come argomenti alla mia macro \ songparagraph (in modo da non li comporre, basta memorizzare tali punti). Come io non so quanti punti può essere in una canzone particolare, ho bisogno di un array per questo. Quando l'ambiente è chiuso, tutti i paragrafi venga scritto - ma saranno prima misurato e il miglior piazzamento per ogni paragrafo saranno computerizzata (ad esempio, alcuni paragrafi possono essere messi uno a parte l'altro in due colonne per rendere il look canzone più compatta e risparmiare un po 'di spazio).
Tutte le idee sarebbe il benvenuto. Per favore, se sai di array in LaTeX, postare un link ad alcuni di documentazione, tutorial o semplicemente statali comandi di base di base.
Soluzione
; arrayjob che implementa le matrici per LaTeX. Certo, ho sbirciato solo in esso, in modo da non so quanto sia efficace sarà. Ma, se non c'è bisogno di scrivere voi stessi ...
Altri suggerimenti
Questo è un array come potrebbe essere implementato in 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}
Esegui questo attraverso LaTeX (mydoc.tex lattice o pdflatex mydoc.tex) e si vede l'uscita.
Una breve spiegazione: questo crea due comandi (con newcommand): ary1 e ary2. Il \expandafter
è necessario perché newcommand
non dovrebbe definire \csname
ma il comando creato da \csname
... \endcsname
. \expandafter
jumps oltre il token successivo, in questo caso il controllo di sequenza \newcommand
ed esegue il comando successivo prima TeX vede il \newcommand
. Ciò significa che, la prima cosa che nelle newcommand linee TeX vede è il costrutto \csname
... \endcsname
, TeX lo esegue e poi esegue \newcommand
con il risultato del costrutto \csname
... \endcsname
. \csname foo\endcsname
è lo stesso di \foo
, ma è possibile utilizzare tutti gli spazi di carattere o anche nel comando creato da \csname
... \endcsname
.
Questa non è banale. Vedere il grande libro "TeX per argomento" da Victor Eijkhout: http://eijkhout.net/texbytopic/texbytopic. html
LuaTEX ha tavoli di Lua, che generalizzano gli array. Se avere lattice standard non è importante per voi, considerare l'utilizzo di LuaTEX con lattice. È quindi possibile fare cose come:
\def\lookup#1{\directlua {
local array={1,2,4,8}; tex.print(array[#1])}}
\[ 2 \mapsto \lookup{2} \]
LuaTEX è un po 'traballante con Latex, a causa della necessità di fuggire tutti i tipi di caratteri Lua nel codice Latex. Contesto deve macro \startluacode ... \stopluacode
per gestire le definizioni di codice Lua, e \ctxlua
per le chiamate di codice Lua, e non riesco a vedere alcuna ragione per cui non può essere definito qualcosa come questi per lattice.
pgfkeys e pgffor potrebbe anche funzionare per voi. Si parte Non Sei del pacchetto PGF (formato grafico portatile), ma possono essere utilizzati in modo indipendente di tutti la grafica roba.
Per espandere sulla risposta di Patrick, la risposta breve è "No". Tuttavia, come ha macro espansione, può essere programmato per avere matrici.
Ecco un altro esempio, questa volta utilizzando push e pop per "array". Quando \type@pushcolour
si chiama, si salva il colore corrente al catasta. \type@popcolour
prende la definizione superiore di colore, e l'utilizza:
\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}}
(Ho adattato questo codice sorgente per il pacchetto beamer)
Si potrebbe anche guardare a qualcosa come il pacchetto Datatool o il sistema di programmazione expl3, e la "lista proprietà" tipo di dati.
Il href="https://ctan.org/tex-archive/macros/latex/contrib/readarray" rel="nofollow noreferrer"> readarray pacchetto
\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}