这实际上是一个后续问题/真正的问题先前这个问题。
我想将以 开头的文本转换为>>
居中文本。
这个看似愚蠢的目的的动机是为我的包添加一种新的语法
jwjournal
,这样像这样的行>> (some remark)
就会转换成居中的注释。
假设要解析的字符串已经存储在一个标记列表中\l_jwjournal_tmp_tl
。目标是识别>>
并使其后的文本居中。但是,如果>>
发现多个,则应分别居中相应的文本。因此,例如,如果的内容\l_jwjournal_tmp_tl
是aaa>>bbb>>ccc
,我希望bbb
和ccc
居中。
先前的这个问题已经解决了正确解析此标记列表的主要问题。现在对我来说的问题是\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}.