
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 dueyear
valor do primarySection
comando 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:
- Extraia todos os números de 4 caracteres com esta expressão regular
[0-9]{4}
e insira-os em uma matriz. - Filtre a lista para manter apenas o maior valor (usando uma classificação por bolha ou um acumulador).
- Defina este valor como a
dueyear
variável. No nosso exemplo, seria2023
.
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 primarySection
função para definir dueyear
assim:
\def\dueyear{\extractMostRecentDate{#4}}
Obrigado pela ajuda.
Responder1
O ano é extraído com a expressão regular [0-9]{4}
. Com \regex_extract_all:nnN
todas as correspondências são armazenadas na sequência \l__Skay_dates_seq
. Esta sequência é usada com \seq_use:Nn
e a ,
entre os itens. Então max
é calculado dentro de \fp_eval:n
.
O resultado é atribuído à macro \dueyear
usando \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}
Responder2
Eu concordaria expl3
o 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 \secondarySection
macro (você acaba com exatamente os mesmos tokens em ambos os casos), substituí-a por um código que mostra qual ramificação foi usada.