我想计算一周的开始和结束日期(第一天是星期一,最后一天是星期日)。对于单个日期,这很好用。现在我想在循环中连续计算多个星期的开始和结束日期,给定开始日期(始终是星期一)和要计算的周数。这仅适用于第一次计算,这意味着下一个星期日的日期是正确的,但此后每次循环后日期都会重置。
我计算下一个日期的算法如下:
# 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
或它的姊妹宏之一。另一个选择是在循环结束时对计数寄存器执行全局赋值;但是,一般应避免将局部赋值和全局赋值混合到同一个宏或寄存器(参见 TeXbook 第 27 章关于“保存堆栈构建”的内容)。以下是使用 的宏的\datecount
解决方案: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}