LaTeX mit Arrays - wie in 'normalen' Programmiersprachen

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: LaTeX mit Arrays - wie in 'normalen' Programmiersprachen

\edef

von Riesen-Eumel » Do 26. Dez 2013, 22:32

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

von Gast » Do 26. Dez 2013, 20:41

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.

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

von rais » Do 26. Dez 2013, 20:31

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

LaTeX mit Arrays - wie in 'normalen' Programmiersprachen

von Riesen-Eumel » Do 26. Dez 2013, 19:45

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.

Nach oben