给定一段文本,我想用yyyy-mm-dd
命令替换以日期字符串开头的行。为此,我的想法是首先用 拆分文本\par
,\regex_split
将结果保存在一个序列中,然后在每个序列项中执行正则表达式替换,最后将所有这些项放入一个标记列表中。但是,我收到TeX capacity exceeded, sorry [input stack size=5000]
错误。
下面是 MWE(它应该将日期标记为红色,将标题标记为蓝色):
\documentclass{article}
\usepackage{xcolor}
\ExplSyntaxOn
\NewDocumentCommand \JournalEntry { m m }
{
\textcolor { red } { #1 }
\textcolor { blue } { #2 }
}
\tl_new:N \g_myjournal_contents_tl
\NewDocumentEnvironment { myjournal } { +b }
{
\tl_gset:Nn \g_myjournal_contents_tl { #1 }
\myjournal_parse_contents:N \g_myjournal_contents_tl
\tl_use:N \g_myjournal_contents_tl
}
{}
\seq_new:N \l_myjournal_tmp_seq
\cs_generate_variant:Nn \regex_split:nnN { nVN }
\cs_new:Nn \myjournal_parse_contents:N
{
\regex_split:nVN { \c{par} } #1 \l_myjournal_tmp_seq
\tl_set:Nn \g_myjournal_contents_tl {}
\seq_map_inline:Nn \l_myjournal_tmp_seq
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_all:nnN
{ (\ *)? (\d{4}-\d{1,2}-\d{1,2}) (\ *)? (.*) }
{ \c{JournalEntry} {\2} {\4} }
\l_tmpa_tl
\tl_gput_right:NV \g_myjournal_contents_tl \l_tmpa_tl
\tl_gput_right:Nn \g_myjournal_contents_tl { \par }
}
}
\ExplSyntaxOff
\usepackage{blindtext}
\begin{document}
\begin{myjournal}
2022-02-01 Sunny - Some title
\blindtext
2022-02-01 Not sunny titles
\blindtext
\end{myjournal}
-- Text in case of empty --
\end{document}
答案1
有两个错误:第一,你设置了应该包含最终数据的tl并将其传递给下一阶段;第二,你需要##1
在的循环中\seq_map_inline:Nn
。
顺便说一句,你可以使用\seq_set_split:Nnn
而不是\regex_split:nnN
\documentclass{article}
\usepackage{xcolor}
\ExplSyntaxOn
\NewDocumentCommand \JournalEntry { m m }
{
\textcolor { red } { #1 }~
\textcolor { blue } { #2 }
}
\NewDocumentEnvironment { myjournal } { +b }
{
\myjournal_parse_contents:n { #1 }
\tl_use:N \g_myjournal_contents_tl
}
{}
\tl_new:N \g_myjournal_contents_tl
\seq_new:N \l_myjournal_tmp_seq
\cs_new_protected:Nn \myjournal_parse_contents:n
{
\tl_gclear:N \g_myjournal_contents_tl
\seq_set_split:Nnn \l_myjournal_tmp_seq { \par } { #1 }
\seq_map_inline:Nn \l_myjournal_tmp_seq
{
\tl_set:Nn \l_tmpa_tl { ##1 }
\regex_replace_all:nnN
{ \s* (\d{4}-\d{1,2}-\d{1,2}) \s* (.*) }
{ \c{JournalEntry} {\1} {\2} }
\l_tmpa_tl
\tl_gput_right:NV \g_myjournal_contents_tl \l_tmpa_tl
\tl_gput_right:Nn \g_myjournal_contents_tl { \par }
}
}
\ExplSyntaxOff
\usepackage{blindtext}
\begin{document}
\begin{myjournal}
2022-02-01 Sunny - Some title
\blindtext
2022-02-01 Not sunny titles
\blindtext
\end{myjournal}
-- Text in case of empty --
\end{document}