從動態文字建立非重複標籤列表

從動態文字建立非重複標籤列表

作為後續 兩個略有不同的版本之間的編譯時間差異 我寫從逗號分隔的字串清單中刪除重複項

問題摘要:前一個問題顯示了一些使用字串清單的 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

相關內容