
Quiero calcular la fecha de inicio y finalización de una semana (el primer día es el lunes y el último es el domingo). Esto funciona bien para una sola cita. Ahora quiero calcular el inicio y el final de varias semanas consecutivas en un bucle, dada la fecha de inicio (siempre un lunes) y la cantidad de semanas a calcular. Esto funciona sólo para el primer cálculo, lo que significa que la fecha del próximo domingo es correcta, pero después de eso la fecha siempre se restablece después de cada ciclo.
Mi algoritmo para calcular la próxima fecha se ve así:
# 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
Ejemplo de trabajo mínimo:
\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}
Respuesta1
Me temo que has caído en la típica trampa de la macro pgffor
's \foreach
: evalúa el cuerpo del bucledentro de un grupo TeX, por lo tanto, las asignaciones locales realizadas allí se pierden al final de cada iteración. Mi sugerencia sería utilizar la macro expl3
de 's \int_step_inline:nnn
o una de sus hermanas. Otra opción sería realizar una asignación global al \datecount
registro de conteo al final del ciclo; sin embargo, en general se debe evitar mezclar asignaciones locales y globales a la misma macro o registro (ver el capítulo 27 del TeXbook sobre “guardar acumulación de pila”). Aquí hay una solución usando la 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}