\ForEachX aus forarray funktioniert nicht in Kommandos

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: \ForEachX aus forarray funktioniert nicht in Kommandos

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

von KOMA » Mi 14. Dez 2022, 14:07

Die Frage hat übrigens mit KOMA-Script nichts zu tun. Bitte in diesem Bereich des Forums nur Fragen zu KOMA-Script!

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

von u_fischer » So 11. Dez 2022, 15:37

KurtZwiebel hat geschrieben:
So 11. Dez 2022, 12:56
Danke für die Hilfe. Ich hatte eigentlich keine Lust eine eigene for-Schleife zu schreiben aber ist dann wohl so.
Du musst keine eigene Schleife schreiben. In expl3 und anderen Paketen gibt es tonnenweise geeignete Befehle. Du musst aber schon den passenden richtig verwenden und dazu gehört ein Grundverständnis über Expansion.

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

von KurtZwiebel » So 11. Dez 2022, 12:56

Danke für die Hilfe. Ich hatte eigentlich keine Lust eine eigene for-Schleife zu schreiben aber ist dann wohl so.

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

von u_fischer » So 11. Dez 2022, 12:43

KurtZwiebel hat geschrieben:
Sa 10. Dez 2022, 18:14
Gibt es eine Möglichkeit, das zum Funktionieren zu bringen?
Im Prinzip schon. Aber nur wenn man alles neu schreibt. Weder ifthen noch dieses forarray bieten expandierbare Befehle, die man in einem \write benutzen kann, \stepcounter geht da auch nicht. Dass du ein nutzloses \expanded reinstreust, hilft da nicht. Du musst also entweder deine Schleifen so schreiben, dass sie expandierbar sind, oder so dass sie vor dem Schreiben alles in einem einfachen Macro speichern, und dass nur das schreiben.

Verschaff dir aber erstmal etwas Grundlagenwissen, was passiert, wenn du in eine Datei schreibst und das generelle Konzept von Expandierbarkeit. Z.B:

https://tex.stackexchange.com/a/66168/2388

N:B: \immediate\closeout\filehandleone hinter \end{document} macht überhaupt keinen Sinn.

\ForEachX aus forarray funktioniert nicht in Kommandos

von KurtZwiebel » Sa 10. Dez 2022, 18:14

Ich habe folgendes Problem: Ich versuche derzeit, eine Dokumentenklasse zu schreiben. Das .tex soll beim Kompilieren zusätzlich weitere .tex-Dateien erzeugen, was mit dem \write -Befehl erreicht wird. Dabei funktioniert allerdings ein selbst definiertes Kommando mit einer \ForEachX-Loop aus dem forarray Paket, das erkennen soll, in welcher Liste ein Wort ist nicht mehr und gibt die Fehlermeldung:
! Use of \ForEachX@arg doesn't match its definition
und eine ganze Reihe anderer Fehler aus.
Für die Ausführbarkeit des Minimalbeispiels verwende ich die Dokumentenklasse article und definiere die fraglichen Befehle im Kopf. Allerdings ist meine .cls-Datei ISO-kodiert und die übliche Kodierung einer .tex-Datei ist utf8.
\documentclass{article}

\usepackage[ngerman]{babel}
\usepackage{ifthen}
\usepackage{forarray}

\def\eins#1{\gdef\Eins{#1}}
\def\zwei#1{\gdef\Zwei{#1}}

\newcounter{Listenabfrage}

\gdef\IteminListe#1{%
	\setcounter{Listenabfrage}{0}%
	\ForEachX{,}%
		{\ifthenelse{\equal{#1}{\thislevelitem}}%
		{Item in Liste 1.%
		\stepcounter{Listenabfrage}
		\ExitForEach}{}}
		{\Eins}
	\ifnum\value{Listenabfrage}=0
		\ForEachX{,}%
			{Item in Liste 2.
			\stepcounter{Listenabfrage}
			\ExitForEach}%
			{\Zwei}%
	\else
	\fi}

\gdef\meinBefehl#1{%
	Fülltext blablabla. \IteminListe{#1}
	\immediate\write\filehandleone{\expanded\IteminListe{#1}}
	}

\eins{Wort,nocheinWort,weiteresWort}
\zwei{bla,bli,blub}

\newwrite\filehandleone
\immediate\openout\filehandleone=\jobname-Extradatei.tex

\begin{document}
\meinBefehl{bla}
\end{document}

\immediate\closeout\filehandleone
In dem Moment, in dem die ganze Sache mit der Extradatei weggelassen wird, verschwinden auch die Fehler. Allerdings tauchen die gleichen Fehler wieder auf, wenn \meinBefehl in einem \ifthenelse-Statement verwendet wird und ein Abgleichen des Ergebnisses mit gewünschten Ergebnissen mit einem \if oder\ifx-Statement funktioniert nicht. Auch das temporäre Speichern des Ergebnisses von \meinBefehl mit \edef scheint nicht möglich zu sein.

Gibt es eine Möglichkeit, das zum Funktionieren zu bringen?

Nach oben