如何从文本变量传输一小段文本

如何从文本变量传输一小段文本

使用以下代码,我使用 bla bla 文本设置了一个变量 \AcIII。我将提取变量的一部分(即前两个 bla bla)并将其存储在另一个变量中(我接下来将使用)。我可以获得它吗?如果可以,如何获得?

\documentclass{article}
\usepackage{graphicx} % Required for inserting images
\newcommand{\AcIII}{bla bla bla blabla bla bla blabla bla bla blabla bla bla blabla bla bla blabla bla bla blabla bla bla bla}
\begin{document}

\AcIII

\end{document}

谢谢

雷纳托

答案1

已编辑以满足 OP 评论,以支持将子字符串提取到单独的宏中。

\documentclass{article}
\usepackage{graphicx} % Required for inserting images
\usepackage{listofitems}
\newcommand{\AcIII}{bla bla blax blabla bla bla blabla bla bla blabla bla bla blabla bla bla blabla bla bla blabla bla bla bla}

\newtoks\mytoks
\newcommand\addtotoks[1]{\global\mytoks\expandafter{\the\mytoks#1}}
\newcommand\xaddtotoks[1]{\expandafter\addtotoks\expandafter{#1}}

\def\getwords#1[#2]-[#3]{%
  \foreachitem\z\in#1[]{%
    \ifnum\zcnt>\numexpr#2-1\relax
      \ifnum\zcnt<\numexpr#3+1\relax
        \xaddtotoks{\z}%
        \addtotoks{ }%
      \fi
    \fi
  }%
  \expandafter\def\expandafter\somewords\expandafter{\the\mytoks}%
}
\begin{document}

\AcIII

\setsepchar{ }%Use space separator to parse list
\readlist\mybla{\AcIII}

There are a total of \listlen\mybla[] words in list.

The 3rd word is \mybla[3].

To extract words from location 4-9, we could do this:

\getwords\mybla[4]-[9]
\somewords

\end{document}

在此处输入图片描述

答案2

在这个实现中,变量有名称(没有反斜杠),从而避免发明命令名称。

文本按顺序存储,并以空格分隔。

然后我们可以使用该序列,通过打印它来恢复空格或插入不同的分隔符(在第二个例子中为连字符)。

提取可以从任何项目到任何其他项目。默认情况下,起点是 1。我们可以通过指定-1为强制参数来指定转到最后一个项目。所以我们甚至不需要计算项目并进行算术运算。例如,

\extractfromtextvariable{uptothelastbutone}{AcIII}{-2}

只会排除最后一项。其他示例请参见下面的代码。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\definetextvariable}{mm}
 {% #1 = new variable, #2 = text
  \renatop_textvar_define:nn { #1 } { #2 }
 }
\NewDocumentCommand{\usetextvariable}{m +O{~}}
 {% #1 = variable, #2 = text to put in between items (default a space)
  \renatop_textvar_use:nn { #1 } { #2 }
 }
\NewDocumentCommand{\extracttextvariable}{mmO{1}m}
 {% #1 = new variable, #2 = old variable, #3 = start, #4 = end
  \renatop_textvar_extract:nnnn { #1 } { #2 } { #3 } { #4 }
 }
\NewExpandableDocumentCommand{\lengthoftextvariable}{m}
 {
  \seq_count:c { l_renatop_textvar_#1_seq }
 }

\tl_new:N \l__renatop_textvar_temp_tl
\cs_generate_variant:Nn \seq_set_split:Nnn { c }

\cs_new_protected:Nn \renatop_textvar_define:nn
 {
  % allocate a sequence
  \seq_clear_new:c { l_renatop_textvar_#1_seq }
  % set the sequence by splitting at spaces
  \seq_set_split:cnn { l_renatop_textvar_#1_seq } {~} { #2 }
 }
\cs_new_protected:Nn \renatop_textvar_use:nn
 {
  % use the sequence with the desired separator
  \seq_use:cn { l_renatop_textvar_#1_seq } { #2 }
 }
\cs_new_protected:Nn \renatop_textvar_extract:nnnn
 {
  % clear a temporary tl variable
  \tl_clear:N \l__renatop_textvar_temp_tl
  % add to the tl variable the items braced
  \seq_map_inline:cn { l_renatop_textvar_#2_seq }
   {
    \tl_put_right:Nn \l__renatop_textvar_temp_tl { {##1} }
   }
  % extract the desired items
  \tl_set:Ne \l__renatop_textvar_temp_tl
   {
    \tl_range:Nnn \l__renatop_textvar_temp_tl { #3 } { #4 }
   }
  % allocate a new sequence
  \seq_clear_new:c { l_renatop_textvar_#1_seq }
  % add the extracted items
  \tl_map_inline:Nn \l__renatop_textvar_temp_tl
   {
    \seq_put_right:cn { l_renatop_textvar_#1_seq } { ##1 }
   }
 }

\ExplSyntaxOff

\definetextvariable{AcIII}{aa bb cc dd ee ff gg hh ii jj kk ll}

\begin{document}

\usetextvariable{AcIII}

\usetextvariable{AcIII}[-]

The variable \texttt{AcIII} has \lengthoftextvariable{AcIII} items.

\extracttextvariable{firstthree}{AcIII}{3}
\usetextvariable{firstthree} (first three)

\extracttextvariable{fromtwotosix}{AcIII}[2]{6}
\usetextvariable{fromtwotosix} (from second to sixth)

\extracttextvariable{fromtwotolast}{AcIII}[2]{-1}
\usetextvariable{fromtwotolast} (from second to last)

\extracttextvariable{lastthree}{AcIII}[-3]{-1}
\usetextvariable{lastthree} (last three)

\end{document}

在此处输入图片描述

人们可以考虑添加合并变量或向现有变量添加项目(在末尾或开头)。

相关内容