使用以下代码,我使用 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}
人们可以考虑添加合并变量或向现有变量添加项目(在末尾或开头)。