我需要用逗号分割字符串,但我还没有找到一种简单的方法来实现它xstring
(xparse
尽管我可能遗漏了一些显而易见的东西)。所以如果我说:
\def\pleaseHelp{"I, am, confused"}
提取的最简单方法是什么:
{"I", "am", "confused"}
并将\pleaseHelp
其存储为变量?我觉得这应该很简单。
答案1
listofitems
是一个功能强大的列表解析包。您的示例是其功能中最简单的一个:
\documentclass{article}
\usepackage{listofitems}
\begin{document}
\def\pleaseHelp{I, am, confused}
\readlist*\mylist{\pleaseHelp}% star option removes surrounding whitespace
Individual items:\\
``\mylist[1]'' and\\
``\mylist[2]'' and\\
``\mylist[3]''
Loop over list:
\foreachitem\x\in\mylist[]{\ifnum\xcnt=1\else\ and \fi``\x''}
\end{document}
此外,您还可以在 之前使用以下内容更改解析分隔符\readlist
:
\setsepchar{;}
您可以同时基于多个分隔符进行解析,并使用 或 ( ||
) 分隔符规范:
\setsepchar{,||.||;||:}
\readlist*\Z{To be, or not to be; that is the question.}
\Z[1]
将产生一个包含as To be
、\Z[2]
as or not to be
、\Z[3]
as 的列表that is the question
。
您可以使用斜线 ( /
) 分隔符列表进行嵌套解析,例如:
\setsepchar{*/,}
\readlist*\Z{this is, a test* of multi-level, parsing}
然后,\Z[1,1]
包含this is
,\Z[1,2]
包含a test
,\Z[2,1]
包含of multi-level
,和\Z[2,2]
包含parsing
。
当我使用“包含”这个词时,我的意思是“通过两次扩展,扩展为实际的标记”,因此在上面的例子中,\detokenize\expandafter\expandafter\expandafter{\Z[2,2]}
将产生parsing
。
答案2
由于您没有发布 MWE,这里有一个简单的方法来访问这种逗号分隔列表的项目(看看http://mirrors.ctan.org/macros/latex/contrib/l3kernel/interface3.pdf了解更多信息):
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand { \giveme } { m m }
{
\clist_item:nn { #1 } { #2 }
}
\ExplSyntaxOff
其用途如下:
\giveme{I, am, confused}{1} % would return I which is item 1
如果您确实想存储变量,请查看l3clist
我上面链接的文档中描述的模块。