将以 >> 开头的行转换为居中文本

将以 >> 开头的行转换为居中文本

这实际上是一个后续问题/真正的问题先前这个问题

我想将以 开头的文本转换为>>居中文本。

这个看似愚蠢的目的的动机是为我的包添加一种新的语法jwjournal,这样像这样的行>> (some remark)就会转换成居中的注释。

假设要解析的字符串已经存储在一个标记列表中\l_jwjournal_tmp_tl。目标是识别>>并使其后的文本居中。但是,如果>>发现多个,则应分别居中相应的文本。因此,例如,如果的内容\l_jwjournal_tmp_tlaaa>>bbb>>ccc,我希望bbbccc居中。

先前的这个问题已经解决了正确解析此标记列表的主要问题。现在对我来说的问题是\l_jwjournal_tmp_tl稍后将用于进一步解析,因此我希望解析的结果直接覆盖\l_jwjournal_tmp_tl(就像\regex_replace_all:nnN直接修改给定标记列表的值一样)。我应该如何实现这一点?

下面是 MWE。

\documentclass{article}
\begin{document}
\ExplSyntaxOn

\newenvironment{JWJournalCompactCenter} % https://tex.stackexchange.com/a/98893
  {\parskip=0pt\par\nopagebreak\centering}
  {\par\noindent\ignorespacesafterend}
\NewDocumentCommand \JWJournalCompactCenterText { m }
  {
    \begin{JWJournalCompactCenter}
      #1
    \end{JWJournalCompactCenter}
  }


\tl_new:N \l_jwjournal_tmp_tl
\tl_set:Nn \l_jwjournal_tmp_tl { aaa >>bbb >>ccc }

% \tl_new:N \l__mymodule_replace_head_tl
% \seq_new:N \l__mymodule_replace_tail_seq

% \cs_new_protected:Nn \mymodule_replace:n
%   {
%     \regex_split:nnN { >> } { #1 } \l__mymodule_replace_tail_seq
%     \seq_pop_left:NN \l__mymodule_replace_tail_seq \l__mymodule_replace_head_tl
%     \tl_use:N \l__mymodule_replace_head_tl
%     \seq_map_function:NN \l__mymodule_replace_tail_seq \JWJournalCompactCenterText
%   }

\tl_use:N \l_jwjournal_tmp_tl

\ExplSyntaxOff
\end{document}

答案1

您不需要直接打印\tl_use:N\tl_map_function:NN只需将这些步骤的结果放入您的令牌列表中即可:

\documentclass{article}
\begin{document}
\ExplSyntaxOn

\newenvironment{JWJournalCompactCenter} % https://tex.stackexchange.com/a/98893
  {\parskip=0pt\par\nopagebreak\centering}
  {\par\noindent\ignorespacesafterend}
\NewDocumentCommand \JWJournalCompactCenterText { m }
  {
    \begin{JWJournalCompactCenter}
      #1
    \end{JWJournalCompactCenter}
  }


\tl_new:N \l_jwjournal_tmp_tl
\tl_set:Nn \l_jwjournal_tmp_tl { aaa >>bbb >>ccc }

\seq_new:N \l__mymodule_replace_tail_seq

\cs_new_protected:Nn \mymodule_replace:n
  {
    \regex_split:nnN { >> } { #1 } \l__mymodule_replace_tail_seq
    \seq_pop_left:NN \l__mymodule_replace_tail_seq \l_jwjournal_tmp_tl
    \seq_map_inline:Nn \l__mymodule_replace_tail_seq
      {
        \tl_put_right:Nn \l_jwjournal_tmp_tl
          { \JWJournalCompactCenterText {##1} }
      }
  }

\tl_use:N \l_jwjournal_tmp_tl

\ExplSyntaxOff
\end{document}

答案2

我认为,如果您在(比如说)\tmpb宏中积累了文本,那么您可以在“居中”模式下打印它(无需更改它),或者您可以以其他方式使用它。您不需要更改它。

在 TeX 原始级别,示例如下所示:

\def\printcenter#1>>#2\end{#1\par \ifx\relax#2\relax\else \afterfi{\docenter#2\end}\fi}
\def\docenter#1>>#2{\centerline{#1}\ifx\end#2\else\afterfi{\docenter#2}\fi}
\def\afterfi#1#2\fi{\fi#1}


\def\tmpb{aaa>>bbb>>ccc}
\expandafter\printcenter \tmpb>>\end % prints aaa at the left, bbb, ccc at the center

\def\tmpb{xxx}
\expandafter\printcenter \tmpb>>\end % prints xxx at the left

答案3

这是一个组合解决方案(仅是一个概念证明,请根据您的喜好更改功能)。

\documentclass{article}
\begin{document}

\ExplSyntaxOn

\NewDocumentCommand \somecommand { m }
  {
    \jinwen_somecommand:n { #1 }
  }

\NewDocumentCommand \replace { m }
  {
    \jinwen_replace_use:n { #1 }
  }

\tl_new:N \l__jinwen_replace_head_tl
\seq_new:N \l__jinwen_replace_tail_seq

\cs_new:Nn \jinwen_somecommand:n { \,---\, #1 \,---\, }

\cs_new_protected:Nn \jinwen_replace_use:n
  {
    \__jinwen_split:n { #1 }
    \tl_use:N \l__jinwen_replace_head_tl
    \seq_map_function:NN \l__jinwen_replace_tail_seq \jinwen_somecommand:n
  }
\cs_new_protected:Nn \jinwen_replace_save:N
  {
    \__jinwen_split:V #1
    \tl_set_eq:NN #1 \l__jinwen_replace_head_tl % the head
    \seq_map_inline:Nn \l__jinwen_replace_tail_seq
     {
      \tl_put_right:Nn #1 { \jinwen_somecommand:n { ##1 } }
     }
  }

\cs_new_protected:Nn \__jinwen_split:n
  {
    \seq_set_split:Nnn \l__jinwen_replace_tail_seq { >> } { #1 }
    \seq_pop_left:NN \l__jinwen_replace_tail_seq \l__jinwen_replace_head_tl
  }
\cs_generate_variant:Nn \__jinwen_split:n { V }

\ExplSyntaxOff

X\replace{}X

\replace{aaa}

\replace{aaa>>bbb}

\replace{aaa>>bbb>>ccc}

\ExplSyntaxOn

\tl_new:N \l_jinwen_test_tl
\tl_set:Nn \l_jinwen_test_tl { aaa>>bbb>>ccc }

\jinwen_replace_save:N \l_jinwen_test_tl

\tl_show:N \l_jinwen_test_tl

\ExplSyntaxOff

\end{document}

正如您在日志文件中看到的,令牌列表变量已按预期更改。

> \l_jinwen_test_tl=aaa\jinwen_somecommand:n {bbb}\jinwen_somecommand:n {ccc}.

相关内容