Fügen Sie in einer For-/Foreach-Schleife einem bestimmten Datum in datetime2 Tage hinzu

Fügen Sie in einer For-/Foreach-Schleife einem bestimmten Datum in datetime2 Tage hinzu

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.

Ergebnisdokument

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 pgfforMakros 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, expl3das \int_step_inline:nnnMakro von oder eines seiner Schwestern zu verwenden. Eine andere Möglichkeit wäre, \datecountam 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 expl3von :\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}

Bildbeschreibung hier eingeben

verwandte Informationen