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의 매크로를 사용하는 솔루션입니다 \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}

여기에 이미지 설명을 입력하세요

관련 정보