
我想計算一週的開始和結束日期(第一天是星期一,最後一天是星期日)。這對於單一約會來說效果很好。現在,我想在給定開始日期(總是星期一)和要計算的周數的情況下,循環連續計算多週的開始和結束。這僅適用於第一次計算,這意味著下週日的日期是正確的,但此後日期總是在每次循環後重置。
我計算下一個日期的演算法如下所示:
# 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
在循環結束時對計數暫存器執行全域賦值;然而,一般應避免將本機和全域分配混合到相同巨集或暫存器(請參閱 TeXbook 關於「保存堆疊建置」的第 27 章)。這是使用expl3
's\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}