尋找字串中最高的年份

尋找字串中最高的年份

我想根據文件的發布日期隱藏文件的各個部分。

這就是我定義我的部分的方式:

\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. 使用此正規表示式提取所有 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巨集(在兩種情況下您最終都會得到完全相同的標記),因此我將其替換為顯示採用哪個分支的程式碼。

在此輸入影像描述

相關內容