我正在尝试生成一个逗号分隔的列表,该列表使用可能为空也可能不为空的字符串。例如,\mylist{\stringA,\stringB,\stringC}
将扩展为A, C
if B
is empty 或B, C
if A
is empty 等。
如果重要的话,则会用 生成字符串xstring
,例如,\StrBetween[3,4]{\longstring}{text:}{,}[\stringC]
根据条件是否满足,其可能是或可能不是空的。
我很确定我曾经在某个地方见过类似的东西,但我就是找不到它。
答案1
这可以通过纯扩展来完成,但由于您正在使用,xstring
所以实际上没有必要:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\mylist}{ m o }
{
\clist_clear:N \l_tmpa_clist
\clist_map_inline:nn { #1 }
{
\clist_put_right:No \l_tmpa_clist { ##1 }
}
\IfNoValueTF{#2}
{ \l_tmpa_clist }
{ \clist_set_eq:NN #2 \l_tmpa_clist }
}
\ExplSyntaxOff
\newcommand\stringA{A}
\newcommand\stringB{}
\newcommand\stringC{C}
\begin{document}
\mylist{\stringA,\stringB,\stringC}
\mylist{\stringA,\stringB,\stringC}[\listA]
\show\listA
\end{document}
该\show\listA
命令产生
> \listA=macro:
->A,C.
如果没有可选参数,则结果将被简单打印。
如果你想打印结果列表的逗号后面有一个空格,那么就需要采用不同的方法:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\mylist}{ m }
{
\seq_clear:N \l_tmpa_seq
\clist_map_inline:nn { #1 }
{
\tl_if_empty:oF { ##1 } { \seq_put_right:No \l_tmpa_seq { ##1 } }
}
\seq_use:Nn \l_tmpa_seq {,~}
}
\ExplSyntaxOff
\newcommand\stringA{A}
\newcommand\stringB{}
\newcommand\stringC{C}
\begin{document}
\mylist{\stringA,\stringB,\stringC}
\end{document}
如果您想避免\newcommand{\stringB}{ }
打印空格,请使用\tl_if_blank:oF
而不是\tl_if_empty:oF
。
答案2
请尝试以下操作:
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\def\ifemptyarg#1{% https://tex.stackexchange.com/a/58638/5764
\if\relax\detokenize{#1}\relax % H. Oberdiek
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
\providecommand{\listcomma}{}
\newcommand{\mylist}[2][,]{%
\renewcommand{\listcomma}{\renewcommand{\listcomma}{#1}}% https://tex.stackexchange.com/a/89187/5764
\renewcommand*{\do}[1]{% How to process each item
\expandafter\ifemptyarg\expandafter{##1}
{}% Do nothing
{\unskip\listcomma{} \penalty0 ##1}% Print <,> <space> <item>
}%
\docsvlist{#2}% Process list
}
\begin{document}
\def\strA{strA}
\def\strB{strB}
\def\strC{}
\def\strD{strD}
\mylist{\strA,\strB,\strC,\strD}
\end{document}
上述过程使用如何迭代以逗号分隔的列表?。