生成包含一些非空字符串的逗号分隔列表

生成包含一些非空字符串的逗号分隔列表

我正在尝试生成一个逗号分隔的列表,该列表使用可能为空也可能不为空的字符串。例如,\mylist{\stringA,\stringB,\stringC}将扩展为A, Cif Bis empty 或B, Cif Ais 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}

上述过程使用如何迭代以逗号分隔的列表?

相关内容