仅打印唯一编号

仅打印唯一编号

有通过命令捕获的数字列表\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

您可以使用xparseexpl3。在以下版本的代码中,重复项在打印时被删除。当\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}

相关内容