Suchen Sie das höchste Jahr in einer Zeichenfolge

Suchen Sie das höchste Jahr in einer Zeichenfolge

Ich möchte Abschnitte meines Dokuments entsprechend ihres Veröffentlichungsdatums ausblenden.

So definiere ich meinen Abschnitt:

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

Dieser Befehl ist wie folgt definiert:

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

dueyearMein Ziel ist es, den Wert des Befehls zu ersetzen primarySection, um das aktuellste Jahr der Zeichenfolge im 4. Parameter zu erhalten.

In meinem obigen Beispiel ist es Jan. 1930 - June 2023. Es hat nicht immer diese Form, enthält aber immer mindestens eine Jahresangabe mit vier Ziffern, manchmal auch zwei.

Hierzu dachte ich, dass folgende Schritte erforderlich wären:

  1. Extrahieren Sie mit diesem regulären Ausdruck alle 4-stelligen Zahlen [0-9]{4}und fügen Sie sie in ein Array ein.
  2. Filtern Sie die Liste, um nur den größten Wert beizubehalten (mithilfe einer Bubblesortierung oder eines Akkumulators).
  3. Definieren Sie diesen Wert als dueyearVariable. In unserem Beispiel wäre das 2023.

Ich habe angefangen, mit dem expl3-Paket zu arbeiten, aber da ich mich mit LaTeX nicht sehr gut auskenne, habe ich Probleme, das gewünschte Ergebnis zu erzielen ...

Im Moment kann ich nur die Werte extrahieren, die den Jahren entsprechen, aber ich weiß nicht, wie ich damit ein Array erstelle und noch weniger, wie ich sie sortieren und den größten Wert extrahieren kann …

Hier ist meine Funktion zum Erkennen und Extrahieren von Jahren:

\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

Wie kann ich diese Funktion so ändern, dass sie das längste Jahr aus dem zuvor genannten Parameter zurückgibt?

Damit kann ich es in meiner Funktion aufrufen und folgendermaßen primarySectionfestlegen :dueyear

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

Ich danke Ihnen für Ihre Hilfe.

Antwort1

Das Jahr wird mit dem regulären Ausdruck extrahiert [0-9]{4}. Mit \regex_extract_all:nnNwerden alle Übereinstimmungen in der Sequenz gespeichert \l__Skay_dates_seq. Diese Sequenz wird mit \seq_use:Nnund einem ,zwischen den Elementen verwendet. Anschließend maxwird innerhalb berechnet \fp_eval:n.

Das Ergebnis wird mit dem Makro \dueyearzugewiesen \edef.

Bildbeschreibung hier eingeben

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

Antwort2

Ich würde die ganze Zeit mitmachen 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}

Da ich mit Ihrem Makro keinen Sinn erkennen kann \secondarySection(Sie erhalten in beiden Fällen genau dieselben Token), habe ich es durch Code ersetzt, der zeigt, welcher Zweig genommen wird.

Bildbeschreibung hier eingeben

verwandte Informationen