\ForEachX aus forarray funktioniert nicht in Kommandos

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


KurtZwiebel
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Sa 10. Dez 2022, 17:17

\ForEachX aus forarray funktioniert nicht in Kommandos

Beitrag 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?

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

Beitrag 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.

KurtZwiebel
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Sa 10. Dez 2022, 17:17

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

Beitrag von KurtZwiebel »

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

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

Beitrag 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.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Re: \ForEachX aus forarray funktioniert nicht in Kommandos

Beitrag von KOMA »

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

Antworten