文字列内の最も高い年を見つける

文字列内の最も高い年を見つける

ドキュメントのセクションを公開日に応じて非表示にしたいと思います。

私のセクションの定義は次のとおりです。

\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
}

私の目標は、4 番目のパラメータの文字列の最新の年を取得するために、コマンドdueyearの値を置き換えることです。primarySection

上記の例では ですJan. 1930 - June 2023。常にこの形式になるわけではありませんが、少なくとも 1 つの 4 桁の年 (場合によっては 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,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(どちらの場合もまったく同じトークンになります)、どの分岐が実行されるかを示すコードに置き換えました。

ここに画像の説明を入力してください

関連情報