
我想根據文件的發布日期隱藏文件的各個部分。
這就是我定義我的部分的方式:
\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
}
我的目標是替換命令dueyear
的值primarySection
,以便獲取第四個參數中字串的最新年份。
在我上面的例子中,它是Jan. 1930 - June 2023
.它並不總是採用這種形式,但它總是包含至少 4 位數字的年份,有時是兩年。
為此,我認為必要的步驟是:
- 使用此正規表示式提取所有 4 個字元數字
[0-9]{4}
並將它們插入到陣列中。 - 過濾清單以僅保留最大值(使用冒泡排序或累加器)。
- 將此值定義為
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
和 a 一起使用。,
然後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
巨集(在兩種情況下您最終都會得到完全相同的標記),因此我將其替換為顯示採用哪個分支的程式碼。