2010-04-15 12 views
14

Gibt es Arrays in LaTeX? Ich meine nicht den Weg zum Setzen von Arrays. Ich meine Arrays als die Datenstruktur in LaTeX/TeX als "Programmiersprache". Ich muss eine Anzahl von vbox-es oder hbox-es in einem Array speichern. Es kann etwas wie "eine Reihe von Makros" sein.Hat LaTeX eine Array-Datenstruktur?

Weitere Details: Ich habe eine Umgebung, die Lieder setzen sollte. Ich muss die Absätze einiger Lieder speichern, die als Argumente für meinen Makro \ Songparagraph angegeben sind (also werde ich sie nicht einstellen, sondern nur diese Absätze speichern). Da ich nicht weiß, wie viele Absätze in einem bestimmten Song enthalten sein können, brauche ich dafür ein Array. Wenn die Umgebung geschlossen ist, werden alle Absätze gesetzt - aber sie werden zuerst gemessen und die beste Platzierung für jeden Absatz wird berechnet (zum Beispiel können einige Absätze in zwei Spalten nebeneinander platziert werden, um den Song aussehen zu lassen kompakter und sparen Sie Platz.

Alle Ideen wären willkommen. Bitte, wenn Sie über Arrays in LaTeX wissen, einen Link zu einigen grundlegenden Dokumentation, Tutorial oder einfach nur grundlegende Befehle angeben.

Antwort

2

Siehe Arrayjob die Arrays für LaTeX implementiert. Zugegeben, ich habe es nur angeschaut, also weiß ich nicht, wie effektiv es sein wird. Aber wenn Sie es nicht selbst schreiben müssen ...

9

Dies ist ein Array, wie es in LaTeX umgesetzt werden könnten:

\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} 

Führen Sie dieses durch Latex (Latex mydoc.tex oder pdflatex mydoc.tex) und Sie die Ausgabe zu sehen.

Eine kurze Erklärung: das schafft zwei Befehle (mit newcommand): ary1 und ary2. Die \expandafter wird benötigt, weil newcommand\csname nicht definieren sollte, aber der Befehl erstellt von \csname ... \endcsname. \expandafter springt über das nächste Token, in diesem Fall die Steuersequenz \newcommand und führt den nächsten Befehl aus, bevor TeX die \newcommand sieht. Das heißt, das erste, was TeX in den neuen Befehlszeilen sieht, ist das \csname ... \endcsname Konstrukt, TeX führt es aus und führt dann \newcommand mit dem Ergebnis des \csname ... \endcsname Konstrukts aus. \csname foo\endcsname ist das gleiche wie \foo, aber Sie können ein beliebiges Zeichen oder sogar Leerzeichen in dem Befehl verwenden, der von \csname ... \endcsname erstellt wurde.

Dies ist nicht trivial. Sehen Sie das große Buch "TeX nach Thema" von Victor Eijkhout: http://eijkhout.net/texbytopic/texbytopic.html

3

Um Patrick Antwort zu erweitern, ist die kurze Antwort "Nein". Da es jedoch eine Makroerweiterung aufweist, kann es so programmiert werden, dass es Arrays aufweist.

Hier ist ein weiteres Beispiel, dieses mit Push-und Pop für "Arrays". Wenn aufgerufen wird, speichert es die aktuelle Farbe auf dem Stapel. \[email protected] nimmt die obere Farbdefinition, und verwendet sie:

\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 diesen Code von der Quelle für das Paket geeignet Beamer)

3

Sie könnten auch etwas wie das Datatool-Paket oder das expl3-Programmiersystem und den Datentyp "Eigenschaftsliste" betrachten.

3

pgfkeys und pgffor könnte auch für Sie arbeiten. Sie sind Teil des pgf (Portable Graphics Format) Pakets, aber sie können unabhängig von allen Grafiken verwendet werden.

4

Luatex hat Lua's Tabellen, die Arrays generalisieren. Wenn Ihnen Standard-Latex nicht wichtig ist, sollten Sie Luatex mit Latex verwenden. Sie können dann solche Dinge tun, wie:

\def\lookup#1{\directlua { 
    local array={1,2,4,8}; tex.print(array[#1])}} 
\[ 2 \mapsto \lookup{2} \] 

LuaTeX ist ein bisschen flockig mit Latex, wegen der Notwendigkeit, alle Arten von Lua Zeichen im Latex-Code zu entkommen. Kontext hat \startluacode ... \stopluacode Makros, um Lua-Code-Definitionen und \ctxlua für Lua-Code-Aufrufe zu behandeln, und ich kann keinen Grund sehen, warum etwas wie diese für Latex nicht definiert werden konnte.