
Я хочу вычислить начальную и конечную дату недели (первый день — понедельник, последний — воскресенье). Это работает нормально для одной даты. Теперь я хочу вычислить начало и конец нескольких недель подряд в цикле, учитывая начальную дату (всегда понедельник) и количество недель для вычисления. Это работает только для первого расчета, то есть дата следующего воскресенья верна, но после этого дата всегда сбрасывается после каждого цикла.
Мой алгоритм расчета следующей даты выглядит так:
# 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}