替换命令中的子字符串

替换命令中的子字符串

我遇到一个问题,似乎无法替换命令输出的字符串。

在我的文档中,我使用\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这是我对您之前的问题的建议。

在此处输入图片描述

相关内容