2010-04-15 13 views
14

Ci sono array in LaTeX? Non intendo il modo di comporre matrici. Intendo array come struttura dati in LaTeX/TeX come "linguaggio di programmazione". Ho bisogno di memorizzare un numero di vbox-es o hbox-es in un array. Potrebbe essere qualcosa come "una serie di macro".LaTeX ha una struttura dati array?

Ulteriori dettagli: Ho un ambiente che dovrebbe comporre canzoni. Ho bisogno di memorizzare i paragrafi di alcuni brani dati come argomenti per la mia macro \ songparagraph (quindi non li comporrò, memorizzerò quei paragrafi). Dato che non so quanti paragrafi possono essere in una canzone particolare, ho bisogno di un array per questo. Quando l'ambiente è chiuso, tutti i paragrafi saranno composti - ma verranno prima misurati e verrà calcolato il miglior posizionamento per ogni paragrafo (ad esempio, alcuni paragrafi possono essere messi l'uno in disparte l'altro in due colonne per far sembrare il brano più compatto e risparmiare un po 'di spazio).

Tutte le idee sarebbero benvenute. Per favore, se si conoscono gli array in LaTeX, inserire un collegamento ad alcuni documenti di base, tutorial o semplicemente indicare i comandi di base.

risposta

2

Partenza Arrayjob che implementa array per LaTeX. Certo, l'ho solo sbirciato, quindi non so quanto sarà efficace. Ma se non è necessario scrivere da soli ...

9

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: crea due comandi (con nuovo comando): ary1 e ary2. Il \expandafter è necessario perché newcommand non deve definire \csname ma il comando creato da \csname ... \endcsname. \expandafter salta sul token successivo, in questo caso la sequenza di controllo \newcommand ed esegue il comando successivo prima che TeX veda lo \newcommand. Ciò significa che la prima cosa nelle linee di comando che TeX vede è il costrutto ... \endcsname, TeX lo esegue e quindi esegue \newcommand con il risultato del costrutto \csname ... \endcsname. \csname foo\endcsname è lo stesso di \foo, ma è possibile utilizzare qualsiasi carattere o spazi nel comando creato da \csname ... \endcsname.

Questo non è banale. Vedi il grande libro "TeX per argomento" di Victor Eijkhout: http://eijkhout.net/texbytopic/texbytopic.html

3

Per espandere la risposta di Patrick, la risposta breve è "No". Tuttavia, poiché ha un'espansione macro, può essere programmato per disporre di array.

Ecco un altro esempio, questo utilizzando push e pop per "array". Quando viene chiamato \[email protected], salva il colore corrente sullo stack. \[email protected] prende la definizione del colore superiore, e la utilizza:

\newcount\[email protected] 
\def\[email protected]{% 
    \xglobal\colorlet{foo\the\[email protected]}{.}% 
\global\advance\[email protected] by1\relax} 
\def\[email protected]{% 
    \global\advance\[email protected] by-1\relax% 
\color{foo\the\[email protected]}} 

(I atto questo codice sorgente per il pacchetto videoproiettore)

3

Si potrebbe anche guardare qualcosa come il pacchetto datatool o il sistema di programmazione expl3 e il tipo di dati "elenco proprietà".

3

pgfkeys e pgffor potrebbero funzionare anche per te. Fanno parte del pacchetto pgf (formato grafico portatile) ma possono essere utilizzati indipendentemente da tutte le risorse grafiche.

4

Luatex ha le tabelle di Lua, che generalizzano le matrici. Se avere lattice standard non è importante per te, considera 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 ha i macro \startluacode ... \stopluacode per gestire le definizioni del codice Lua e \ctxlua per le chiamate al codice Lua e non vedo alcun motivo per cui qualcosa del genere non possa essere definito per Latex.

Problemi correlati