쉼표로 구분된 문자열 목록에서 중복 항목 삭제

쉼표로 구분된 문자열 목록에서 중복 항목 삭제

이는 후속 조치입니다. 약간 다른 두 버전 간의 컴파일 시간 차이.

그 질문을 할 때 명백해졌듯이, 컴파일 속도는 쉼표로 구분된 목록의 길이에 따라 심각한 영향을 받습니다 \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

를 사용하여 이 작업을 수행하는 방법을 알려준 Joseph Wright에게 감사드립니다 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}올바르게 래핑되지 않습니다. 이유를 모르겠습니다.

관련 정보