
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
}
dueyear
Mein 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:
- Extrahieren Sie mit diesem regulären Ausdruck alle 4-stelligen Zahlen
[0-9]{4}
und fügen Sie sie in ein Array ein. - Filtern Sie die Liste, um nur den größten Wert beizubehalten (mithilfe einer Bubblesortierung oder eines Akkumulators).
- Definieren Sie diesen Wert als
dueyear
Variable. In unserem Beispiel wäre das2023
.
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 primarySection
festlegen :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:nnN
werden alle Übereinstimmungen in der Sequenz gespeichert \l__Skay_dates_seq
. Diese Sequenz wird mit \seq_use:Nn
und einem ,
zwischen den Elementen verwendet. Anschließend max
wird innerhalb berechnet \fp_eval:n
.
Das Ergebnis wird mit dem Makro \dueyear
zugewiesen \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}
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.