我遇到一个问题,似乎无法替换命令输出的字符串。
在我的文档中,我使用\outerfunction
一个参数来调用,该参数实际上是一个键/值对列表。(这是我无法更改的,因为该命令在整个文档中都使用)
在\outerfunction
值列表中,项被剥离,并且键由分隔码 ( -SEPARATOR-
) 分隔并用括号括起来。
问题是我想删除右括号前的最后一个分隔代码。我尝试了\replace
提供的函数在这篇文章中,我也尝试了包\StrSubstitute
中的函数,xstring
但没有成功。
当我将硬编码的源字符串插入到这些函数中的任何一个中时,替换都会起作用。我无法理解其中的区别,也找不到解决方法。有人能帮我吗?
例子:
\documentclass{article}
\usepackage{stringstrings}
\usepackage{xstring}
\usepackage{xparse}
\def\replace#1#2#3{%
\def\tmp##1#2{##1#3\tmp}%
\tmp#1\stopreplace#2\stopreplace}
\def\stopreplace#1\stopreplace{}
\newcommand{\processlist}[1]
{%
\noexpandarg%
\ifx\listfinish#1\empty%
%\else\texttt{\stringpart{#1}--}\expandafter\processlist%
\else\texttt{#1-SEPARATOR-}\expandafter\processlist%
\fi%
}
\newcommand\outerfunction[2][\relax]
{%
arg1: #1\\
arg2: #2\\
\def\listfinish{#1}%
\long\def\listact{}%
\replace{(\processlist#2\listfinish)}{-SEPARATOR-)}{)}\\%this does nothing
\StrSubstitute{(\processlist#2\listfinish)}{-SEPARATOR-)}{)}\\%this does nothing
%using the text from the output for the StrSubstitute command works
\StrSubstitute{(key1 - value1-SEPARATOR-key2 - value2-SEPARATOR-key3 - value3-SEPARATOR-)}{-SEPARATOR-)}{)}
}
\begin{document}
\outerfunction
{
{key1 - value1}
{key2 - value2}
{key3 - value3}
}
\end{document}
答案1
这里有一个实现xparse
,您可以选择输出结果还是将其保存在宏中。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\outerfunction}{O{}mo}
{
\seq_clear:N \l__mayr_output_seq
\keys_set:nn { mayr/outerfunction }
{
% set the defaults
inner-sep = --,
outer-sep = -SEPARATOR-,
left = (,
right = ),
#1
}
\IfNoValueTF{#3}
{
\mayr_outerfunction:n { #2 }
}
{
\mayr_outerfunction_save:Nn #3 { #2 }
}
}
\seq_new:N \l__mayr_output_seq
\seq_new:N \l__mayr_temp_seq
\cs_generate_variant:Nn \seq_set_split:Nnn { NV }
\cs_generate_variant:Nn \seq_use:Nn { NV }
\keys_define:nn { mayr/outerfunction }
{
inner-sep .tl_set:N = \l__mayr_inner_separator_tl,
outer-sep .tl_set:N = \l__mayr_outer_separator_tl,
left .tl_set:N = \l__mayr_left_tl,
right .tl_set:N = \l__mayr_right_tl,
}
\cs_new_protected:Nn \mayr_outerfunction:n
{
\tl_map_inline:nn { #1 } { \__mayr_innerfunction:n { ##1 } }
\seq_use:NV \l__mayr_output_seq \l__mayr_outer_separator_tl
}
\cs_new_protected:Nn \mayr_outerfunction_save:Nn
{
\tl_map_inline:nn { #2 } { \__mayr_innerfunction:n { ##1 } }
\tl_set:Nx #1 { \seq_use:NV \l__mayr_output_seq \l__mayr_outer_separator_tl }
}
\cs_new_protected:Nn \__mayr_innerfunction:n
{
\seq_set_split:NVn \l__mayr_temp_seq \l__mayr_inner_separator_tl { #1 }
\seq_put_right:Nx \l__mayr_output_seq
{
\exp_not:V \l__mayr_left_tl
\seq_item:Nn \l__mayr_temp_seq { 1 }
\exp_not:V \l__mayr_right_tl
}
}
\ExplSyntaxOff
\begin{document}
\outerfunction
{
{key1 -- value1}
{key2 -- value2}
{key3 -- value3}
}
\outerfunction[inner-sep={=},outer-sep=---,left={[},right={]}]
{
{key1 = value1}
{key2 = value2}
{key3 = value3}
}[\saved]
\texttt{\meaning\saved}
\end{document}
您应该认识到\__mayr_innerfunction:n
这是我对您之前的问题的建议。