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マクロまたはその姉妹マクロの 1 つを使用することです。別のオプションは、ループの終了時にカウント レジスタへのグローバル割り当てを実行することです\datecount。ただし、同じマクロまたはレジスタへのローカル割り当てとグローバル割り当てを混在させることは、一般に避けるべきです (「スタックの蓄積を節約する」に関する TeXbook の第 27 章を参照)。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}

ここに画像の説明を入力してください

関連情報