
Ich möchte das Anfangs- und Enddatum einer Woche berechnen (erster Tag ist Montag, letzter Sonntag). Für ein einzelnes Datum funktioniert das problemlos. Nun möchte ich in einer Schleife den Anfang und das Ende mehrerer Wochen nacheinander berechnen, wobei das Anfangsdatum (immer ein Montag) und die Anzahl der zu berechnenden Wochen vorgegeben sind. Das funktioniert zwar nur bei der ersten Berechnung, d. h. das Datum des nächsten Sonntags ist korrekt, danach wird das Datum aber immer nach jeder Schleife zurückgesetzt.
Mein Algorithmus zur Berechnung des nächsten Datums sieht folgendermaßen aus:
# cursor is at a Monday
for n in 1 .. 10:
print(cursor) # Monday
add 6 days to cursor
print(cursor) # Sunday
add 1 day to cursor
end for
Minimales Arbeitsbeispiel:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[calc]{datetime2}
\usepackage{pgffor}
\setlength{\parindent}{0pt}
\begin{document}
\newcommand{\nweeks}{4}
\newcommand{\startdate}{2020-09-07}
\newcount\datecount
\newcommand{\dateoffset}[2]{%
\DTMsaveddateoffsettojulianday{#1}{#2}{\datecount}%
\DTMsavejulianday{#1}{\datecount}%
}
\DTMsavedate{currentdate}{\startdate}
Start-Week-1: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{6}
End-Week-1: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{1}
Start-Week-2: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{6}
End-Week-2: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{1}
\DTMsavedate{currentdate}{\startdate}
\foreach \n in {1,...,\nweeks}{
Start-Week-\n: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{6}
End-Week-\n: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{1}
}
\end{document}
Antwort1
Ich fürchte, Sie sind in die typische Falle des pgffor
Makros getappt \foreach
: Es wertet den Schleifenkörper ausinnerhalb einer TeX-Gruppe, daher gehen darin vorgenommene lokale Zuweisungen am Ende jeder Iteration verloren. Mein Vorschlag wäre, expl3
das \int_step_inline:nnn
Makro von oder eines seiner Schwestern zu verwenden. Eine andere Möglichkeit wäre, \datecount
am Ende der Schleife eine globale Zuweisung an das Zählregister vorzunehmen; das Mischen lokaler und globaler Zuweisungen an dasselbe Makro oder Register sollte jedoch generell vermieden werden (vgl. Kapitel 27 des TeXbooks zum Thema „Speichern des Stapelaufbaus“). Hier ist eine Lösung mit dem Makro expl3
von :\int_step_inline:nnn
\documentclass{article}
\usepackage{expl3}
\usepackage[calc]{datetime2}
\ExplSyntaxOn
% Borrow \int_step_inline:nnn from expl3
\cs_new_eq:NN \intstepinline \int_step_inline:nnn
\ExplSyntaxOff
\newcount\datecount
\newcommand*{\dateoffset}[2]{%
\DTMsaveddateoffsettojulianday{#1}{#2}{\datecount}%
\DTMsavejulianday{#1}{\datecount}%
}
\newcommand{\nweeks}{4}
\newcommand{\startdate}{2020-09-07}
\DTMsavedate{currentdate}{\startdate}
\setlength{\parindent}{0pt}
\begin{document}
\intstepinline{1}{\nweeks}{%
Start-Week-#1: \DTMusedate{currentdate}%
\dateoffset{currentdate}{6}\\
End-Week-#1: \DTMusedate{currentdate}%
\dateoffset{currentdate}{1}%
\par
}
\end{document}