LaTeX mit Arrays - wie in 'normalen' Programmiersprachen

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


Benutzeravatar
Riesen-Eumel
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mi 3. Okt 2012, 13:20

LaTeX mit Arrays - wie in 'normalen' Programmiersprachen

Beitrag von Riesen-Eumel »

Hallo allerseits,

eigentlich muss es doch möglich sein, LaTeX-Programme während der Kompilierung auch mit Arrays arbeiten zu lassen - ich meine nicht die mathematische Darstellung, sondern den Gebrauch ganz gewöhnlicher Feldvariablen, die in den meisten anderen Programmiersprache als Array bezeichnet werden.
Für ein Projekt denke ich an ein zwei- oder notfalls auch ein-dimensionales Feld aus Countern.
Eigene Versuche mit den Paketen arrayjob, memory oder die Erstellung miitels csname-Umgebung brachten (nicht ganz) den gewünschten Erfolg.
Für mein Projekt (Labyrinth) benötige ich ein VariablenFeld, welches mit Zahlenwerte einliest und diese dann, abhängig von eben diesen eingelesenen Werten, nochmals wiederholt berechnet. Auch ein Zufallsgenerator (evtl. aus lcg-package) wird hier einbezogen.
Jedoch zeigen einige Tests (sowohl mit arrayjob, memory als auch nach Erstellung von Feldern mit Hilfe csname-Umgebung) im Vorfeld unerwartete Probleme, die grundsätzlich ein und demselben Schema gleichen: Mit einer Schleife sollen Zahlenwerte (erst mal ganz simpel der Schleifenzählwert oder dieser z.B. mit 2 multipliziert [calc-package]) in die Array-/Feld-Variablen eingelesen werden.
In einer zweiten Schleife sollen diese Werte wieder ausgegeben werden und dann gibts entweder Fehlermeldungen oder, noch interessanter, der zuletzt eingelesene Wert befindet sich plötzlich in jeder Feldvariable.
Noch interessanter ist, dass nach stupidem schrittweisen Einlesen, also Befehl für Befehl, diese Sache funktioniert - doch das genügt mir nicht.
Ich vermute, dass es mir nicht gelungen ist, mit all diesen Methoden tatsächlich ein Feld von Countern aufzubauen und ich LaTeX vermutlich mit diesem Vorhaben überfordere ... oder festgefahren nach dem Schema der 'herkömmlichen' Programmiersprachen denke.

\documentclass{article}

\parindent0sp

\begin{document}
	\sffamily
	
	% EingabeFunktion:
	\newcommand{\FeldEin}[3]{%
	% #1 für FeldVariablenName, #2 für FeldIndex, Parameter #3 für Wert
	\expandafter\newcommand\csname #1#2\endcsname{#3}}
	
	% AusgabeFunktion:
	\newcommand{\FeldAus}[2]{% #1 für FeldVariablenName, #2 für FeldIndex
	\expandafter\csname #1#2\endcsname}

	% Kein 'echtes Feld' sondern eine 'Form von newcommand', wie Beispiel zeigt:
	\FeldEin{xy}{abc}{\bfseries}
	\FeldAus{xy}{abc}\ \\
	
	% 'stupides Einlesen':
	\FeldEin{Mem}{0}{0123}
	\FeldEin{Mem}{1}{1234}
	\FeldEin{Mem}{2}{2345}
	\FeldEin{Mem}{3}{3456}
	\FeldEin{Mem}{4}{4567}
	\FeldEin{Mem}{5}{5678}
	\FeldEin{Mem}{6}{6789}
	\FeldEin{Mem}{7}{7890}
	\FeldEin{Mem}{8}{8901}
	\FeldEin{Mem}{9}{9012}	

	\newcounter{Z}% Zähler für \loop .. \repeat
	\setcounter{Z}{0}% Startwert

	\loop
		\ifnum\value{Z}<10
			%\FeldAus{Mem}{\value{Z}}\\% Error, weil MemZ kein Counter
			%
			%\FeldAus{Mem}{the\value{Z}}\\% 'Funktioniert' wie folgende Zeile
			\FeldAus{Mem}{\theZ}\\
			\stepcounter{Z}% Z++
	\repeat

\end{document}
Soweit so gut, logisch wäre ja das Einlesen über eine Schleife:
\documentclass{article}

\parindent0sp

\begin{document}
	\sffamily
	
	% EingabeFunktion:
	\newcommand{\FeldEin}[3]{%
	% #1 für FeldVariablenName, #2 für FeldIndex, Parameter #3 für Wert
	\expandafter\newcommand\csname #1#2\endcsname{#3}}

	% AusgabeFunktion:
	\newcommand{\FeldAus}[2]{% #1 für FeldVariablenName, #2 für FeldIndex
	\expandafter\csname #1#2\endcsname}	


	\newcounter{Z}% Zähler für \loop .. \repeat
	\setcounter{Z}{0}% Startwert
	\newcounter{MxL}% MaxLoops
	\setcounter{MxL}{20}
	
	% Eingabe:
	\loop
		\ifnum\value{Z}<\value{MxL}
			\FeldEin{Mem}{\the\value{Z}}{\theZ}
			\stepcounter{Z}
	\repeat
	
	\newcounter{Out}

	% Ausgabe:
	\setcounter{Z}{0}
	\loop
		\ifnum\value{Z}<\value{MxL}
			\setcounter{Out}{\FeldAus{Mem}{\the\value{Z}}}
			\ifnum\value{Out}<10
				0%
			\fi
			\theOut\\% Ergebnis sieht sehr gut aus, Zuversicht!
			\stepcounter{Z}
	\repeat
	\ \\
	
	% Abschließend die große Überreaschung:
	\FeldAus{Mem}{13}% Der letzte Zählerstand von Z wird ausgegeben ...
	% ... und der ist bei Abbruch 20
	% Egal, mit welchem Index \FeldAus{Mem} aufgerufen wird, das ...
	% ... Ergebnis ist immer 20 ... W A R U M  ?

\end{document}
Im Prinzip läuft es unter Verwendung der packages memory oder arrayjob ähnlich - ein Einlesen mit einer Schleife (habe fast elles ausprobiert, so viel kann ich hier gar nicht listen) und das Ausgeben mit einer anderen funktioniert nicht ... bei mir zumindest nicht.

Ra(s)tlos frage ich in die Runde: Was mache ich falsch???

( Ist doch aber ein interessantes ProgrammierProblemchen, gelle? )

Für etwaige Antworten sage ich jetzt schon meinen Dank.

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Re: LaTeX mit Arrays - wie in 'normalen' Programmiersprachen

Beitrag von rais »

Riesen-Eumel hat geschrieben: Im Prinzip läuft es unter Verwendung der packages memory oder arrayjob ähnlich - ein Einlesen mit einer Schleife (habe fast elles ausprobiert, so viel kann ich hier gar nicht listen) und das Ausgeben mit einer anderen funktioniert nicht ... bei mir zumindest nicht.

Ra(s)tlos frage ich in die Runde: Was mache ich falsch???
AFAICS schreibst Du in jede Deiner Mem-Felder `\theZ'. Wenn Du das expandiert haben willst, versuch es so
   \newcommand{\FeldEin}[3]{%
   % #1 für FeldVariablenName, #2 für FeldIndex, Parameter #3 für Wert
   \expandafter\edef\csname #1#2\endcsname{#3}}
MfG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

Gast

Beitrag von Gast »

Hallo. Ich möchte darauf hinweisen, dass man mit dem Paket
pythontex Pythoncode direkt aus dem Dokument heraus verarbeiten lassen kann. Vielleicht stellt sich dir damit eine Alternative zur Verfügung.

Benutzeravatar
Riesen-Eumel
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mi 3. Okt 2012, 13:20

\edef

Beitrag von Riesen-Eumel »

newcommand durch edef zu ersetzen ist DIE Lösung des Problems.
Über zwei Tage tüftle ich nun an dieser Sache und ohne fremde Hilfe hätte ich das nie gelöst.

Ich bin so froh, dass es funktioniert ... und bin sehr dankbar für diesen Tipp.
(Beim ersten Compilierungsversuch hing PDFLaTeX und dann versuchte ich es erfolgreich mit LaTeX - darüber nachsinnend, durch was ich tikz am besten ersetzen würde [pstricks] - doch das spielt wohl keine Rolle mehr, weil der zweite Anlauf mit PDFLaTeX dann funktionierte.)

Der Tipp, Python einzubinden ist ebenfalls sehr gut.
Lua, C#, Python, Ruby und REXX möchte ich ja noch erlernen (Lua bereits im vollen Gange) - insofern eine gute Kombination.

Als 'drittklassige' Alternative wäre dann noch die Idee, mit einer 'normalen' Programmiersprache ( Bei dieser Gelegenheit: Wer kennt z.B. XProfan?) einen LaTeX-Code zu erzeugen.

Mein vorrangiges Ziel ist es, ein Labyrinth grafisch zu erzeugen und da ich den grafischen Teil mit tikz bereits abgeschlossen habe, möchte ich nun auch den logischen Teil mit LaTeX bewältigen.

Ich bin sicher, LaTeX schafft das, eine wichtige Hürde ist genommen.
(Falls sich noch weitere, unerwartete Schwierigkeiten mit dem Array-Problem zeigen sollten, werde ich an dieser Stelle noch einmal um Hilfe betteln, aber ich denke, die Sache läuft jetzt.)

Ich glaubte, edef halbwegs verstanden zu haben, doch ich sehe, da gibt es noch Nachholbedarf.
Jedenfalls nochmals vielen Dank für diese sehr gute Hilfe! :D

Antworten