Seite 1 von 1

\ForEachX aus forarray funktioniert nicht in Kommandos

Verfasst: Sa 10. Dez 2022, 18:14
von KurtZwiebel
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?

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

Verfasst: So 11. Dez 2022, 12:43
von u_fischer
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.

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

Verfasst: So 11. Dez 2022, 12:56
von KurtZwiebel
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

Verfasst: So 11. Dez 2022, 15:37
von u_fischer
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

Verfasst: Mi 14. Dez 2022, 14:07
von KOMA
Die Frage hat übrigens mit KOMA-Script nichts zu tun. Bitte in diesem Bereich des Forums nur Fragen zu KOMA-Script!