
Dies ist eine Fortsetzung zu Unterschied in der Kompilierungszeit zwischen zwei leicht unterschiedlichen Versionen.
Wie beim Stellen dieser Frage deutlich wurde, wird die Geschwindigkeit dieser Kompilierung stark von der Länge der durch Kommas getrennten Liste beeinflusst \ReferencedID
. Dies ist die Liste der aus dem Text gesammelten Beschriftungen. Diese Liste kann jedoch Duplikate enthalten, und im Beispiel meiner Frage ist dies tatsächlich der Fall. Wie kann man also Duplikate aus einer durch Kommas getrennten Liste löschen?
Der Konkretheit halber lautet die Liste in meinem Beispiel:
\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}
Antwort1
Vorausgesetzt, \ReferencedIDs
es wurde bereits als Komma-getrennte Liste gebildet, können Sie die Makros kombinieren, die ich bereits inseqsplit funktioniert nur, wenn die Zeichenfolge direkt als Argument angegeben wird
\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}
Antwort2
Vielen Dank an Joseph Wright, der mir gezeigt hat, wie das mit geht expl3
. Der folgende Code ist weitgehend selbsterklärend. Die Zeile, die die Duplikate entfernt, lautet
\clist_remove_duplicates:N \l_ReferencedIDs
Die Dokumentation finden Sie in der interface3.pdf
Datei, die zumindest auf TeX Live mit zu finden ist 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}
HINWEIS: Das \seqsplit{\DeduplicatedReferencedIDs}
Umbrechen erfolgt nicht richtig. Ich weiß nicht, warum.