Whiledo Thema ist als GELÖST markiert

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


mattazie
Forum-Anfänger
Forum-Anfänger
Beiträge: 21
Registriert: Fr 19. Mai 2023, 14:50

Whiledo

Beitrag von mattazie »

Für mein Spielkartenprojekt arbeite ich mit einer Datenbank. Die hat (vereinfacht) die Felder A und B mit den Werten A1, A2, A3, B1, B2, B3.
Ich möchte nun eine Whiledo-Schleife erstellen, welche Aktion 1 ausführt, bis alle Daten aus Feld A abgearbeitet sind. Danach soll Aktion 2 durchgeführt werden.

Ich verwende \usepackage{ifthen}.
Ich versuchte es mit dem Befehl
\whiledo{\not \isundefined{\A}}{Aktion 1}{Aktion 2}
Es müsste nun drei Durchgänge mit Aktion 1 geben, anschliessend Aktion 2.
Bei mir gibt es aber eine Endlosschleife. Was mache ich falsch?

Zur Erläuterung: Ich habe eine Frontkarte mit einem Bild darauf, dann kommen Karten, welche anhand der Daten befüllt werden, und anschliessend eine Schlusskarte, wieder mit einem Bild darauf.
Ohne \whiledo-Schleife kommt die Schlusskarte nach jeder Datenkarte. Ich kann die Datenkarten in einem separaten Dokument erstellen und als PDF in die Hauptdatei einfügen. Das macht es aber sehr unübersichtlich.

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2534
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Re: Whiledo

Beitrag von Stefan Kottwitz »

Poste doch vllt. ein kurzes ausführbares Codebeispiel, was es so durchführt (muss ja nicht das lange Original sein), dann sieht man vllt. woran es liegt. Bisher lässt es sich in Gedanken kaum nachvollziehen was am Code evtl. nicht so funktioniert wie erwartet, etwa wodurch \A undefined werden soll etc.

Stefan

mattazie
Forum-Anfänger
Forum-Anfänger
Beiträge: 21
Registriert: Fr 19. Mai 2023, 14:50

Re: Whiledo

Beitrag von mattazie »

Ich habe mir mal eine Beispieltabelle und ein reduziertes Dokument zusammengestellt, woran man sieht, was nicht geht. Wieso im Beispiel \ifthenelse nicht funktioniert, kann ich nicht nachvollziehen. Im Originaldokument funktioniert es. Aber wenn man die Fehlermeldungen mit wiederholtem Return abarbeitet, kommt man zum Resultat. Hier müsste halt die Schlusskarte nur wirklich am Schluss zu sehen sein, nicht nach jeder Karte des Hauptteils.
A,B
x,0
0,y
z,0
\documentclass{article}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage[paperwidth=48mm,paperheight=69mm,margin=7mm,nomarginpar,noheadfoot]{geometry}
\usepackage[HTML]{xcolor}
\usepackage[verbose]{datatool}
\usepackage[12pt]{moresize} %HUGE
\usepackage[T1]{fontenc}
\usepackage{tcolorbox}
\usepackage{helvet}
\usepackage{ifthen}
\usepackage{rotating}
\usepackage{pdfpages}

\pagestyle{empty}
\tcbuselibrary{skins}

\renewcommand\familydefault{\sfdefault}

% Definition der Datentabelle
\DTLloaddb[keys={A,B}]{Tabelle}{Tabelle-Frage.csv}

\begin{document}

%Deckkarte

\tcbset{colframe=black,boxrule=0.1mm,width=34mm,height=55mm,arc=3mm}
\begin{tcolorbox}[leftupper=1mm, valign=center]
    
Deckkarte

\end{tcolorbox}


%Hauptteil

% Import der externen Daten
\DTLenvforeach{Tabelle}{\A=A,\B=B}

%\whiledo{\NOT \isundefined{\A}}{

\begin{tcolorbox}[boxrule=0.1mm,width=34mm,height=55mm,arc=3mm,valign=center,halign=center]


{\ifthenelse{\A = 0}{\B}{\A}}

\end{tcolorbox}
%}

% Schlusskarte

\tcbset{colframe=black,boxrule=0.1mm,width=34mm,height=55mm,arc=3mm}
\begin{tcolorbox}[leftupper=1mm, valign=center]
    
Schlusskarte

\end{tcolorbox}

\end{document}
Ich habe jetzt zwei Fragen:
Wieso funktioniert \ifthenelse nicht?
Wie erreiche ich, dass die Schlusskarte nur am Schluss ausgegeben wird?
(\whiledo ist vorerst noch auskommentiert.)

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: Whiledo

Beitrag von Bartman »

Laut der Dokumentation von ifthen darf im betreffenden Argument des Befehls getestet werden, ob zwei Zahlen oder zwei Zeichenketten gleich sind. Welcher Test passt zum Inhalt der ersten Spalte?

mattazie
Forum-Anfänger
Forum-Anfänger
Beiträge: 21
Registriert: Fr 19. Mai 2023, 14:50

Re: Whiledo

Beitrag von mattazie »

Sorry, ich war im Urlaub, daher meine späte Rückmeldung. Die Bedingung in \ifthenelse ist in meinem Problem nicht relevant, da sie im Originaldokument problemlos funktioniert. Ich möchte nur wissen, wie ich verhindern kann, dass die Schlusskarte nach jedem Datensatz aus der Datenbank gezeigt wird und nicht nur erst nach Abarbeiten der Datenbank. Muss ich einen eigenen Befehl definieren? Oder ist es möglich, aus der LaTeX-Datei heraus pdfLaTeX aufzurufen, das Hauptdokument erstellen zu lassen und dann das Ergebnis mit \includepdf ins Rahmendokument einzufügen? Das würde schon einiges vereinfachen.

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

Re: Whiledo

Beitrag von u_fischer »

`DTLenvforeach` ist eine Umgebung, kein Befehl. Und wenn deine Daten auch Buchstaben enthalten, kannst du nicht `\A=0` als Test benutzen.
\begin{DTLenvforeach}{Tabelle}{\A=A,\B=B}
\begin{tcolorbox}[boxrule=0.1mm,width=34mm,height=55mm,arc=3mm,valign=center,halign=center]
\ifthenelse{\equal{\A}{0}}{\B}{\A}
\end{tcolorbox}
\end{DTLenvforeach}

mattazie
Forum-Anfänger
Forum-Anfänger
Beiträge: 21
Registriert: Fr 19. Mai 2023, 14:50

Re: Whiledo

Beitrag von mattazie »

Vielen Dank für diese Antwort. Ich war wiedereinmal nahe dran, aber das Entscheidende fehlte halt. Aber jetzt funktioniert es wunderbar.

Antworten