在 for 迴圈/foreach 迴圈中為 datetime2 中的特定日期新增天數

在 for 迴圈/foreach 迴圈中為 datetime2 中的特定日期新增天數

我想計算一週的開始和結束日期(第一天是星期一,最後一天是星期日)。這對於單一約會來說效果很好。現在,我想在給定開始日期(總是星期一)和要計算的周數的情況下,循環連續計算多週的開始和結束。這僅適用於第一次計算,這意味著下週日的日期是正確的,但此後日期總是在每次循環後重置。

結果文件

我計算下一個日期的演算法如下所示:

# 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}

在此輸入影像描述

相關內容