
作為後續 兩個略有不同的版本之間的編譯時間差異 我寫從逗號分隔的字串清單中刪除重複項。
問題摘要:前一個問題顯示了一些使用字串清單的 TeX 程式碼,這些字串是從文字中的引用派生的標籤。但是,該清單可能包含重複項,且程式碼不會刪除該清單的重複項。後一個問題的重點是從文字收集清單後重複刪除。
然而,大衛·卡萊爾在聊天中表示,也許可以在第一個實例中建立一個沒有重複的清單。我原以為創建一個包含重複項的列表,然後刪除重複項會更快更容易,但也許不是。無論如何,我對使用這種方法的解決方案感興趣。
相關交流開始於
http://chat.stackexchange.com/transcript/message/20082058#20082058
大衛寫的地方
我不明白為什麼你需要 \clist_remove_duplicates:N 如果重複是一個問題,那麼就不要將它們放入列表中。
我回覆了
@DavidCarlisle 好吧,你必須在每次添加時檢查清單。當然,人們可以做到這一點,但最後刪除愚人可能更有效。
對此,大衛回應:
@FaheemMitha 我對此表示懷疑
並跟進
@FaheemMitha您正在添加引用,因此如果 \csname r@#1\endcsname 已經定義,您之前已經見過此引用,不需要再次添加它。需要建立一個包含重複項的列表
我回答:
您可能是說可以修改原始問題中的程式碼,這樣就不會新增重複項。
他對此作出回應
@FaheemMitha是的,雖然沒有測試r@#1(因為這只是告訴你有一個標籤),但你可以讓每個裁判留下一個csname,這樣你就知道你已經看到了它(這以空間換取時間)
答案1
您可以只定義一個標誌巨集(任何內容),然後如果該巨集已經定義,則不新增條目。
% 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