
게시 날짜에 따라 내 문서의 일부를 숨기고 싶습니다.
이것이 내 섹션을 정의하는 방법입니다.
\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자리 숫자로 구성된 최소 1년, 때로는 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
및 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
(두 경우 모두 정확히 동일한 토큰으로 끝남) 어떤 분기가 사용되는지 보여주는 코드로 대체했습니다.