
週の開始日と終了日を計算したい (最初の日は月曜日、最後の日は日曜日)。これは単一の日付では正常に機能します。次に、開始日 (常に月曜日) と計算する週数を指定して、ループで連続して複数の週の開始日と終了日を計算したいです。これは最初の計算でのみ機能し、次の日曜日の日付は正しいことを意味しますが、その後は各ループの後に日付が常にリセットされます。
次の日付を計算するアルゴリズムは次のようになります。
# 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}