Добавить дни к определенной дате в datetime2 в цикле for / foreach

Добавить дни к определенной дате в datetime2 в цикле for / foreach

Я хочу вычислить начальную и конечную дату недели (первый день — понедельник, последний — воскресенье). Это работает нормально для одной даты. Теперь я хочу вычислить начало и конец нескольких недель подряд в цикле, учитывая начальную дату (всегда понедельник) и количество недель для вычисления. Это работает только для первого расчета, то есть дата следующего воскресенья верна, но после этого дата всегда сбрасывается после каждого цикла.

Итоговый документ

Мой алгоритм расчета следующей даты выглядит так:

# 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

Минимальный рабочий пример:

\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}

решение1

Боюсь, вы попали в типичную ловушку макроса pgffor: \foreachон вычисляет тело циклавнутри группы TeX, поэтому локальные назначения, выполненные в нем, теряются в конце каждой итерации. Я бы предложил использовать expl3макрос \int_step_inline:nnnили один из его сестер. Другим вариантом было бы выполнение глобального назначения регистру счетчика \datecountв конце цикла; однако, в общем случае следует избегать смешивания локальных и глобальных назначений одному и тому же макросу или регистру (см. главу 27 TeXbook относительно «сохранения стека наращивания»). Вот решение с использованием expl3макроса \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}

введите описание изображения здесь

Связанный контент