为什么这个正则表达式替换序列项不起作用?

为什么这个正则表达式替换序列项不起作用?

给定一段文本,我想用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}

在此处输入图片描述

相关内容