
Als Folgemaßnahme zu Unterschied in der Kompilierungszeit zwischen zwei leicht unterschiedlichen Versionen Ich hab geschriebenLöschen von Duplikaten aus einer durch Kommas getrennten Liste von Zeichenfolgen.
Zusammenfassung des Problems: Die vorherige Frage zeigte TeX-Code, der eine Liste von Zeichenfolgen verwendete, die aus Referenzen im Text abgeleitete Beschriftungen waren. Diese Liste konnte jedoch Duplikate enthalten, und der Code entfernte diese Liste nicht. Die zweite Frage konzentrierte sich auf die Entfernung dieser Duplikate aus dieser Liste, nachdem sie aus dem Text gesammelt wurden.
David Carlisle hat jedoch im Chat angedeutet, dass es möglich sein könnte, zunächst eine Liste ohne Duplikate zu erstellen. Ich hatte angenommen, dass es schneller und einfacher wäre, eine Liste mit Duplikaten zu erstellen und dann die Duplikate zu entfernen, aber vielleicht ist das nicht der Fall. Auf jeden Fall wäre ich an einer Lösung interessiert, die diesen Ansatz verwendet.
Der entsprechende Austausch begann am
http://chat.stackexchange.com/transcript/message/20082058#20082058
wo David schrieb
Ich verstehe nicht, warum Sie \clist_remove_duplicates:N benötigen. Wenn Duplikate ein Problem darstellen, nehmen Sie sie einfach nicht in die Liste auf.
Ich antwortete mit
@DavidCarlisle, nun, Sie müssten die Liste bei jeder Hinzufügung überprüfen. Das könnte man natürlich tun, aber es ist wahrscheinlich effizienter, Duplikate am Ende zu entfernen.
Worauf David antwortete:
@FaheemMitha, das bezweifle ich
und anschließend
@FaheemMitha Sie fügen einen Verweis hinzu, wenn also \csname r@#1\endcsname bereits definiert ist, haben Sie diesen Verweis schon einmal gesehen und müssen ihn nicht erneut hinzufügen. Es muss eine Liste mit Duplikaten erstellt werden
Ich antwortete:
Sie meinen vermutlich, dass der Code in der ursprünglichen Frage geändert werden kann, sodass keine Duplikate hinzugefügt werden.
worauf er antwortete
@FaheemMitha, ja, obwohl ich r@#1 nicht teste (da dies Ihnen nur sagt, dass es ein Label gibt), aber Sie könnten jeden Verweis einen CS-Namen hinterlassen lassen, damit Sie wissen, dass Sie ihn gesehen haben (das tauscht Platz gegen Zeit)
Antwort1
Sie können einfach ein Flag-Makro (für irgendetwas) definieren und dann keinen neuen Eintrag hinzufügen, wenn das Makro bereits definiert ist.
% VERSION 1
\iftrue
\makeatletter
\let\oldref\ref
\def\ref#1{%
\expandafter\ifx\csname R@#1\endcsname\relax
\global\expandafter\let\csname R@#1\endcsname\@empty
\immediate\write\@auxout{%
\string\gappto\string\ReferencedIDs{#1,}%
}%
\fi
\oldref{#1}%
}
\def\ReferencedIDs{}
\makeatother
\else
% VERSION 2
\makeatletter
\AtBeginDocument{\providecommand\ReferencedIDs{}}
\AtEndDocument{\immediate\write\@auxout{\gdef\string\ReferencedIDs{\ReferencedIDs}}}
\let\oldref\ref
\def\ref#1{%
\expandafter\ifx\csname R@#1\endcsname\relax
\global\expandafter\let\csname R@#1\endcsname\@empty
\g@addto@macro\ReferencedIDs{#1,}%
\fi
\oldref{#1}%
}
\makeatother
\fi