문자열에서 가장 높은 연도 찾기

문자열에서 가장 높은 연도 찾기

게시 날짜에 따라 내 문서의 일부를 숨기고 싶습니다.

이것이 내 섹션을 정의하는 방법입니다.

\primarySection
  {Data 1} 
  {Data 2}
  {Data 3}
  {Jan. 1930 - June 2023} % Dates
  {Data 4}

이 명령은 다음과 같이 정의됩니다.

\newcommand*{\primarySection}[6][primary]{

  \def\dueyear{2018} % Value to be replaced.

  \ifnum\the\numexpr\year-5>\dueyear
    \secondarySection[primary]{#2}{#3}{#4}{#5}{#6}
  \else 
    \secondarySection[#1]{#2}{#3}{#4}{#5}{#6}
  \fi
}

내 목표는 네 번째 매개변수에 있는 문자열의 가장 최근 연도를 얻기 위해 명령 dueyear값을 바꾸는 것입니다 .primarySection

위의 예에서는 Jan. 1930 - June 2023. 항상 이 형식을 갖는 것은 아니지만 항상 4자리 숫자로 구성된 최소 1년, 때로는 2년을 포함합니다.

이를 위해 필요한 단계는 다음과 같습니다.

  1. 이 정규식으로 4자리 숫자를 모두 추출하여 [0-9]{4}배열에 삽입합니다.
  2. 가장 큰 값만 유지하도록 목록을 필터링합니다(버블 정렬 또는 누산기 사용).
  3. 이 값을 변수로 정의하십시오 dueyear. 우리의 예에서는 입니다 2023.

expl3 패키지로 작업을 시작했는데 LaTeX를 잘 몰라서 원하는 결과를 얻기가 어렵네요...

지금은 연도에 해당하는 값만 추출할 수 있지만 이를 사용하여 배열을 만드는 방법은 물론 정렬하고 가장 큰 값을 추출하는 방법도 모릅니다.

연도를 감지하고 추출하는 기능은 다음과 같습니다.

\ExplSyntaxOn
  \NewDocumentCommand{\extractMostRecentDate}{m}{
    \tl_set:Nn \l_tmpa_tl {#1}
    \regex_extract_once:nnN {([0-9]{4})} {#1} \l_uiy_result_seq
    \seq_map_inline:Nn \l_uiy_result_seq {#1 - ##1}
  }
\ExplSyntaxOff

앞서 언급한 매개변수에서 가장 큰 연도를 반환하도록 이 함수를 어떻게 수정합니까?

내 함수에서 호출하여 다음과 같이 primarySection설정할 수 있습니다 dueyear.

\def\dueyear{\extractMostRecentDate{#4}}

도움을 주셔서 감사합니다.

답변1

연도는 정규식으로 추출됩니다 [0-9]{4}. 모든 일치 항목 은 \regex_extract_all:nnN순서대로 저장됩니다 \l__Skay_dates_seq. 이 순서는 항목 사이에 \seq_use:Nn및 a와 함께 사용됩니다 . ,그런 다음 max내에서 계산됩니다 \fp_eval:n.

\dueyear결과는 를 사용하여 매크로에 할당됩니다 \edef.

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

\documentclass[border=6pt]{standalone}
\newcommand{\dueyear}{}
\ExplSyntaxOn
\seq_new:N \l__Skay_dates_seq
\NewDocumentCommand { \extractMostRecentDate } { m }
  {
    \regex_extract_all:nnN { [0-9]{4} } {#1} \l__Skay_dates_seq
    \edef \dueyear { \fp_eval:n { max ( \seq_use:Nn \l__Skay_dates_seq { , } ) } }
  }
\ExplSyntaxOff
\begin{document}
\extractMostRecentDate{Jan. 1930 - June 2023}\dueyear;
\extractMostRecentDate{01/02/1934 - 05/06/1978}\dueyear
\end{document}

답변2

나는 expl3모두 함께 갈 것입니다.

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\primarySection}{O{primary}mmmmm}
 {
  \__sky_year_extract:n { #5 }
  \int_compare:nTF { \c_sys_year_int - 5 > \l__sky_year_recent_int }
   % replace the two following branches
   { not~recent~year~(\int_use:N \l__sky_year_recent_int) }
   { recent~year~(\int_use:N \l__sky_year_recent_int) }
 }

\int_new:N \l__sky_year_recent_int
\seq_new:N \l__sky_year_all_seq

\cs_new_protected:Nn \__sky_year_extract:n
 {
  \regex_extract_all:nnN { [0-9]{4} } { #1 } \l__sky_year_all_seq
  \seq_sort:Nn \l__sky_year_all_seq
   {
    \int_compare:nNnTF { ##1 } > { ##2 } { \sort_return_same: } { \sort_return_swapped: }
   }
  \int_set:Nn \l__sky_year_recent_int { \seq_item:Nn \l__sky_year_all_seq { 1 } }
 }

\ExplSyntaxOff

\begin{document}

\primarySection
  {Data 1} 
  {Data 2}
  {Data 3}
  {Jan. 1930 - June 2023} % Dates
  {Data 4}

\primarySection
  {Data 1} 
  {Data 2}
  {Data 3}
  {Jan. 1930 - June 2001} % Dates
  {Data 4}

\end{document}

매크로를 이해할 수 없기 때문에 \secondarySection(두 경우 모두 정확히 동일한 토큰으로 끝남) 어떤 분기가 사용되는지 보여주는 코드로 대체했습니다.

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

관련 정보