
ドキュメントのセクションを公開日に応じて非表示にしたいと思います。
私のセクションの定義は次のとおりです。
\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
}
私の目標は、4 番目のパラメータの文字列の最新の年を取得するために、コマンドdueyear
の値を置き換えることです。primarySection
上記の例では ですJan. 1930 - June 2023
。常にこの形式になるわけではありませんが、少なくとも 1 つの 4 桁の年 (場合によっては 2 年) が含まれます。
これを実行するには、次の手順が必要だと考えました。
- この正規表現を使用して 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
,
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
(どちらの場合もまったく同じトークンになります)、どの分岐が実行されるかを示すコードに置き換えました。