
Quero calcular a data de início e término de uma semana (o primeiro dia é segunda-feira, o último é domingo). Isso está funcionando bem para uma única data. Agora quero calcular o início e o fim de várias semanas consecutivas em um loop, dada a data de início (sempre uma segunda-feira) e o número de semanas a serem calculadas. Isto funciona apenas para o primeiro cálculo, o que significa que a data do próximo domingo está correta, mas depois disso a data é sempre zerada após cada loop.
Meu algoritmo para calcular a próxima data é assim:
# 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
Exemplo mínimo de trabalho:
\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}
Responder1
Receio que você tenha caído na armadilha típica da macro pgffor
de \foreach
: ela avalia o corpo do loopdentro de um grupo TeX, portanto, as atribuições locais realizadas nele são perdidas no final de cada iteração. Minha sugestão seria usar a macro expl3
do \int_step_inline:nnn
ou uma de suas irmãs. Outra opção seria realizar uma atribuição global ao \datecount
registrador de contagem no final do loop; entretanto, misturar atribuições locais e globais à mesma macro ou registro deve ser evitado em geral (cf. capítulo 27 do TeXbook sobre “save stack build”). Aqui está uma solução usando a macro expl3
de \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}