Encontre o ano mais alto em uma string

Encontre o ano mais alto em uma string

Gostaria de ocultar seções do meu documento de acordo com a data de publicação.

É assim que defino minha seção:

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

Este comando é definido da seguinte forma:

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

Meu objetivo é substituir o dueyearvalor do primarySectioncomando para obter o ano mais recente da string no 4º parâmetro.

No meu exemplo acima é Jan. 1930 - June 2023. Nem sempre possui este formato, mas sempre contém pelo menos um ano de 4 dígitos, às vezes dois anos.

Para fazer isso, pensei que as etapas necessárias seriam:

  1. Extraia todos os números de 4 caracteres com esta expressão regular [0-9]{4}e insira-os em uma matriz.
  2. Filtre a lista para manter apenas o maior valor (usando uma classificação por bolha ou um acumulador).
  3. Defina este valor como a dueyearvariável. No nosso exemplo, seria 2023.

Comecei a trabalhar com o pacote expl3, mas como não conheço muito bem o LaTeX, estou tendo dificuldades para conseguir o resultado que desejo...

No momento só consigo extrair os valores correspondentes aos anos mas não sei como criar um array com eles e muito menos como ordená-los e extrair o maior valor...

Aqui está minha função para detectar e extrair anos:

\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

Como posso modificar esta função para que ela retorne o maior ano do parâmetro que mencionei anteriormente?

Para que eu possa chamá-lo na minha primarySectionfunção para definir dueyearassim:

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

Obrigado pela ajuda.

Responder1

O ano é extraído com a expressão regular [0-9]{4}. Com \regex_extract_all:nnNtodas as correspondências são armazenadas na sequência \l__Skay_dates_seq. Esta sequência é usada com \seq_use:Nne a ,entre os itens. Então maxé calculado dentro de \fp_eval:n.

O resultado é atribuído à macro \dueyearusando \edef.

insira a descrição da imagem aqui

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

Responder2

Eu concordaria expl3o tempo todo.

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

Como não consigo entender sua \secondarySectionmacro (você acaba com exatamente os mesmos tokens em ambos os casos), substituí-a por um código que mostra qual ramificação foi usada.

insira a descrição da imagem aqui

informação relacionada