
한 주의 시작일과 종료일을 계산하고 싶습니다(첫 번째 날은 월요일, 마지막 날은 일요일). 이것은 단일 날짜에 잘 작동합니다. 이제 시작 날짜(항상 월요일)와 계산할 주 수를 고려하여 여러 주의 시작과 끝을 루프에서 연속적으로 계산하고 싶습니다. 이는 첫 번째 계산에서만 작동합니다. 즉, 다음 일요일의 날짜는 정확하지만 그 이후에는 각 루프 후에 날짜가 항상 재설정됩니다.
다음 날짜를 계산하는 알고리즘은 다음과 같습니다.
# 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
의 매크로를 사용하는 솔루션입니다 \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}