遍历列表以生成引用

遍历列表以生成引用

我想创建一个新命令,在其中传递一个以逗号分隔的列表,然后该列表将被迭代以创建引用。

例子:

\iteratecommand{ref1, ref2, ref3}

并且在 iteratecommand 中它应该遍历列表并创建 \ref{ref1}, \ref{ref2}, \ref{ref3}。

编辑:

非常抱歉。我当时太匆忙,解释得太模糊了。我想要实现的是拥有一个可以减少我打字的宏。目前我有这个:

\begin{description}
    \item[Static Title] \hfill \\
    \ref{ref1}, \ref{ref2}
\end{description}

我希望有一个宏,我只需传递引用,它就会输出带有引用的描述。因此,不要使用:

\documentclass{article}
\begin{document}
\begin{description}
    \item[Static Title] \hfill \\
    \ref{ref1}, \ref{ref2}
\end{description}

\begin{description}
    \item[Static Title] \hfill \\
    \ref{ref1}, \ref{ref2}
\end{description}

\begin{description}
    \item[Static Title] \hfill \\
    \ref{ref1}, \ref{ref2}
\end{description}
\end{document}

我想要这样的东西:

\documentclass{article}
\begin{document}
\reff{ref1, ref2}

\reff{ref1, ref2}

\reff{ref1, ref2}
\end{description}
\end{document}

我希望现在更清楚了。我刚刚想到我可以使用给出的答案之一并将其放入处理描述部分的另一个宏中?

答案1

这是一个\reff命令(也适用于一个参考):

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\reff}{m}
 {
  \seq_set_split:N \l_cherrung_reff_seq { , }{ #1 }
  \seq_pop_right:NN \l_cherrung_reff_seq \l_cherrung_reff_tl
  \seq_map_inline:Nn \l_cherrung_reff_seq { \ref{##1},~ }
  \ref{\tl_use:N \l_cherrung_reff_tl}
 }
\seq_new:N \l_cherrung_reff_seq
\tl_new:N \l_cherrung_reff_tl
\ExplSyntaxOff
\newcounter{test}
\begin{document}
\refstepcounter{test}\label{a}
\refstepcounter{test}\label{b}
\refstepcounter{test}\label{c}

\reff{a,b,c}

\end{document}

输出为

1、2、3

正如预期的那样。


您可以将此命令用于其他目的:添加

\newcommand{\staticdesc}[1]{%
  \begin{description}
  \item[Static Title] \hfill \\
  \reff{#1}
  \end{description}}

之后\ExplSyntaxOff\staticdesc{ref1,ref2}相当于输入

\begin{description}
\item[Static Title] \hfill \\
\ref{ref1}, \ref{ref2}
\end{description}

答案2

xparse您还可以使用具有内部功能的包SplitList

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\NewDocumentCommand \iteratecommand {> { \SplitList { , } } m }
 {%
   \ProcessList {#1} {\myref }
 }
\NewDocumentCommand{\myref}{m}{\ref{#1},~}
\begin{document}
\begin{align}
x\label{ref1}\\y\label{ref2}\\z\label{ref3}
\end{align}
\iteratecommand{ref1, ref2, ref3}

\end{document}

当然,使用当前的方法,最后的引用不会被单独处理。

但是该包cleveref有一些内部函数来处理此类输入。

答案3

\makeatletter
\@for\f:=ref1, ref2, ref3\do{\ref{\f}}

来自@egreg 答案的示例适合使用这个循环:

\documentclass{article}

\makeatletter
\def\reff#1{\@for\f:=#1\do{\ref{\f}}}
\makeatother

\newcounter{test}
\begin{document}
\refstepcounter{test}\label{a}
\refstepcounter{test}\label{b}
\refstepcounter{test}\label{c}

\reff{a,b,c}

\end{document}

答案4

你也可以用这个etoolbox

\documentclass{article}
\usepackage{etoolbox}
\newcounter{iref}
\newcommand{\reff}[1]{\def\do##1{\stepcounter{iref}\ifnumgreater{\value{iref}}{1}{, }{}\ref{##1}}\docsvlist{#1}}

\newcounter{test}
\begin{document}
\refstepcounter{test}\label{a}
\refstepcounter{test}\label{b}
\refstepcounter{test}\label{c}

\reff{a,b,c}
\end{document}

相关内容