有通过命令捕获的数字列表\Numbers
。使用时\PrintNumbers
,它应该只打印唯一的数字。
梅威瑟:
\documentclass{article}
\makeatletter
\gdef\PrintNumbers{}
\def\Numbers#1{\g@addto@macro\PrintNumbers{#1 }}
\makeatother
\begin{document}
\Numbers{1}
\Numbers{2}
\Numbers{3}
\Numbers{3}
\Numbers{4}
\Numbers{4}
\PrintNumbers
\end{document}
当前产出:
1 2 3 3 4 4
所需输出:
1 2 3 4
命令\removeduplicates
来自此链接与请求的不一样,需要单一输入。
答案1
您可以为每个唯一的数字创建一个命令,并以该命令的存在为条件:
\documentclass{article}
\makeatletter
\newcommand{\PrintNumbers}{}
\newcommand{\Numbers}[1]{%
\ifcsname @number@#1\endcsname% Check if macro exists
\unskip
\else% ...if not...
\@namedef{@number@#1}{}% ...define it and...
\g@addto@macro\PrintNumbers{#1 }% ...add it to the list
\fi
}
\makeatother
\begin{document}
\Numbers{1}
\Numbers{2}
\Numbers{3}
\Numbers{3}
\Numbers{4}
\Numbers{4}
\PrintNumbers
\end{document}
答案2
您可以使用xparse
和expl3
。在以下版本的代码中,重复项在打印时被删除。当\Numbers
被调用时,这很容易做到;这取决于您想如何使用列表。请注意,构建的列表不会受到 的影响\PrintNumbers
,因此以后可以以不同的方式使用它。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\Numbers}{m}
{
\seq_put_right:Nn \l_kumaresh_numbers_seq { #1 }
}
\NewDocumentCommand{\PrintNumbers}{O{~}}
{
\seq_set_eq:NN \l_kumaresh_temp_seq \l_kumaresh_numbers_seq
\seq_remove_duplicates:N \l_kumaresh_temp_seq
\seq_use:Nn \l_kumaresh_temp_seq { #1 }
}
\seq_new:N \l_kumaresh_numbers_seq
\seq_new:N \l_kumaresh_temp_seq
\ExplSyntaxOff
\begin{document}
\Numbers{1}
\Numbers{2}
\Numbers{3}
\Numbers{3}
\Numbers{4}
\Numbers{4}
\PrintNumbers
\PrintNumbers[--]
\end{document}
答案3
这是另一个版本:
\documentclass{article}
\makeatletter
\def\PrintNumbers{}
\def\Numbers#1{%
\expandafter\ifx\csname Numbers@#1\endcsname\relax%
\g@addto@macro\PrintNumbers{#1 }%
\expandafter\gdef\csname Numbers@#1\endcsname{0}%
\fi%
}
\makeatother
\begin{document}
\Numbers{1}
\Numbers{2}
\Numbers{3}
\Numbers{3}
\Numbers{4}
\Numbers{4}
\PrintNumbers
\end{document}