Excluindo duplicatas de uma lista de strings separadas por vírgula

Excluindo duplicatas de uma lista de strings separadas por vírgula

Este é um acompanhamento Diferença no tempo de compilação entre duas versões ligeiramente diferentes.

Como ficou óbvio ao fazer essa pergunta, a velocidade dessa compilação é seriamente afetada pelo comprimento da lista separada por vírgulas \ReferencedID. Esta é a lista dos rótulos coletados do texto. Mas esta lista pode conter duplicatas e, de fato, no exemplo da minha pergunta, contém. Então, como excluir duplicatas de uma lista separada por vírgulas?

Para ser mais concreto, a lista é meu exemplo:

\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}

Responder1

Supondo que \ReferencedIDsjá tenha sido formada uma lista separada por vírgulas, você pode combinar as macros que já mostrei emseqsplit não funciona a menos que a string seja fornecida diretamente como argumento

\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}

insira a descrição da imagem aqui

Responder2

Obrigado a Joseph Wright por me mostrar como fazer isso usando expl3. O código a seguir é amplamente autoexplicativo. A linha que remove as duplicatas é

\clist_remove_duplicates:N \l_ReferencedIDs

Para documentação, veja o interface3.pdfarquivo, encontrado no TeX Live, pelo menos, com extensão 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}

NOTA: O \seqsplit{\DeduplicatedReferencedIDs}não é enrolado corretamente; Eu não sei por quê.

informação relacionada