Seite 1 von 1

Whiledo

Verfasst: Fr 11. Aug 2023, 15:57
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.

Re: Whiledo

Verfasst: Fr 11. Aug 2023, 17:47
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

Re: Whiledo

Verfasst: Fr 11. Aug 2023, 20:24
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.)

Re: Whiledo

Verfasst: Fr 11. Aug 2023, 21:58
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?

Re: Whiledo

Verfasst: So 20. Aug 2023, 22:58
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.

Re: Whiledo

Verfasst: Mo 21. Aug 2023, 14:53
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}

Re: Whiledo

Verfasst: Di 22. Aug 2023, 19:09
von mattazie
Vielen Dank für diese Antwort. Ich war wiedereinmal nahe dran, aber das Entscheidende fehlte halt. Aber jetzt funktioniert es wunderbar.