我需要一个非常简单的东西——当我得到一个用逗号分隔的字符串的宏参数时,我可以将其拆分并将结果字符串分配到数组中吗?
简而言之,我想写这样的东西:
\newcommand{\test}[1]{
\def\array = \parse{#1}{,}
}
所以我以后可以像这样使用它:
\someOtherMacro{\array[1]}
我正在查看其他答案,但我找不到这个任务真正简单的东西(只是解析字符串并分配结果)。
答案1
您可以考虑使用arrayjobx
:
\documentclass{article}
\usepackage{arrayjobx}
\makeatletter
\renewcommand{\readarray}[3][&]{\read@array[#1]{#2}{#3}}%
\makeatother
\newcommand{\someOtherMacro}{\textbf}
\begin{document}
\newarray\mynames
\readarray{mynames}{Moe&Larry&Curly}
1: \mynames(1) and \someOtherMacro{\mynames(2)} and \mynames(3)
\readarray[,]{mynames}{Moe,Larry,Curly}
2: \mynames(1) and \mynames(2) and \someOtherMacro{\mynames(3)}
\end{document}
答案2
这个listofitems
包在这方面非常强大。第一个例子是基于,
分隔符进行解析的。
第二个示例是两层解析,首先通过\\
,然后再次使用空格分隔符。
解析为n-tiers 不会对软件包造成任何问题。如果需要,它还可以选择丢弃空白数组元素。
在这两种情况下,通过使用星号形式的\readlist
调用,前导/尾随空格已被删除。
\documentclass{article}
\usepackage{listofitems}
\begin{document}
\setsepchar{,}
\readlist*\parsed{This, is, my , list, of words}
There are \parsedlen{} items in list
Here are the items:
\showitems\parsed
item 4 is ``\parsed[4]''.
\setsepchar{\\/ }
\readlist*\multiparsed{%
This is a test\\
of the\\
emergency broadcast system.%
}
Here is the other list:
\showitems\multiparsed
Row 2 is ``\multiparsed[2].''
2nd word of row 3 is ``\multiparsed[3,2]''.
\end{document}
答案3
使用 非常容易expl3
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definearray}{mm}
{
\seq_new:c { g_eenoku_array_#1_seq }
\seq_gset_split:cnn { g_eenoku_array_#1_seq } { , } { #2 }
}
\cs_generate_variant:Nn \seq_gset_split:Nnn { c }
\NewDocumentCommand{\usearray}{mm}
{
\seq_item:cn { g_eenoku_array_#1_seq } { #2 }
}
\ExplSyntaxOff
\definearray{names}{Moe,Larry,Curly}
\begin{document}
\usearray{names}{1}
\usearray{names}{2}
\usearray{names}{3}
\end{document}