Удаление дубликатов из списка строк, разделенных запятыми

Удаление дубликатов из списка строк, разделенных запятыми

Это продолжение Разница во времени компиляции между двумя немного разными версиями.

Как стало очевидно при задании этого вопроса, скорость этой компиляции серьезно зависит от длины списка, разделенного запятыми \ReferencedID. Это список меток, собранных из текста. Но этот список может содержать дубликаты, и на самом деле в примере в моем вопросе они есть. Итак, как можно удалить дубликаты из списка, разделенного запятыми?

Для конкретности, вот список в моем примере:

\gdef \ReferencedIDs{,2014.11.14,2014.11.14,2014.11.17,2014.11.14,2014.07.18.tm,2014.11.12.tm,2013.10.05.kanjur,2013.10.05.powai,2013.10.06,2013.10.28.zhm,2013.10.17,2013.10.22,2013.10.14.ks,2013.10.06,2013.10.17,2013.10.22,2013.10.24,2013.10.28,2013.10.30,2013.11.11,2014.09.05.tm,2014.07.18.tm,2014.11.12.tm,2014.11.17,2015.01.06,2015.01.06}

решение1

Предполагая, \ReferencedIDsчто уже сформирован список, разделенный запятыми, вы можете объединить макросы, которые я уже показал вseqsplit не работает, если строка не указана напрямую в качестве аргумента

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}

\usepackage{seqsplit}
\usepackage{xparse}

\ExplSyntaxOn
\cs_set_eq:NN \faheem_seqsplit:n \seqsplit
\cs_generate_variant:Nn \faheem_seqsplit:n { V }
\clist_new:N \l_faheem_referenced_ids_clist

\NewDocumentCommand{\printIDs}{s}
 {
  \clist_set:NV \l_faheem_referenced_ids_clist \ReferencedIDs
  \IfBooleanF{#1}
  { \clist_remove_duplicates:N \l_faheem_referenced_ids_clist }
  \faheem_seqsplit:V \l_faheem_referenced_ids_clist
 }
\ExplSyntaxOff

\def\ReferencedIDs{,2014.11.14,2014.11.14,2014.11.17,2014.11.14,2014.07.18.tm,%
  2014.11.12.tm,2013.10.05.kanjur,2013.10.05.powai,2013.10.06,2013.10.28.zhm,%
  2013.10.17,2013.10.22,2013.10.14.ks,2013.10.06,2013.10.17,2013.10.22,2013.10.24,%
  2013.10.28,2013.10.30,2013.11.11,2014.09.05.tm,2014.07.18.tm,2014.11.12.tm,%
  2014.11.17,2015.01.06,2015.01.06}


\begin{document}

This is the original list with duplicates, \printIDs*

Here is the list with duplicates removed, \printIDs

\end{document}

введите описание изображения здесь

решение2

Спасибо Джозефу Райту за то, что он показал мне, как это сделать с помощью expl3. Следующий код в значительной степени говорит сам за себя. Строка, которая удаляет дубликаты, это

\clist_remove_duplicates:N \l_ReferencedIDs

Для получения документации см. interface3.pdfфайл, который можно найти на TeX Live, по крайней мере, с расширением texdoc interface3.

\documentclass[12pt]{article}
\usepackage{seqsplit}
\usepackage{expl3}
\usepackage[T1]{fontenc}
\let\oldseqsplit\seqsplit% Copy \seqsplit
\renewcommand{\seqsplit}{% Redefine \seqsplit to...
\expandafter\oldseqsplit\expandafter}% ...expand its argument before processing it

\gdef \ReferencedIDs{,2014.11.14,2014.11.14,2014.11.17,2014.11.14,2014.07.18.tm,2014.11.12.tm,2013.10.05.kanjur,2013.10.05.powai,2013.10.06,2013.10.28.zhm,2013.10.17,2013.10.22,2013.10.14.ks,2013.10.06,2013.10.17,2013.10.22,2013.10.24,2013.10.28,2013.10.30,2013.11.11,2014.09.05.tm,2014.07.18.tm,2014.11.12.tm,2014.11.17,2015.01.06,2015.01.06}
\ExplSyntaxOn
\clist_set:NV \l_ReferencedIDs \ReferencedIDs % initialise list
\clist_remove_duplicates:N \l_ReferencedIDs % remove duplicates
\gdef \DeduplicatedReferencedIDs{\l_ReferencedIDs}
\ExplSyntaxOff

\begin{document}

This is the original list with duplicates, \seqsplit{\ReferencedIDs}.

Here is the list with duplicates removed, \seqsplit{\DeduplicatedReferencedIDs}.

\end{document}

ПРИМЕЧАНИЕ: Перенос \seqsplit{\DeduplicatedReferencedIDs}не выполняется правильно. Я не знаю почему.

Связанный контент