我有一些expl3
程式碼想要操作由使用 LaTeX2e 程式碼的套件定義的計數器。
如果我想操作 counter foo
,我可以將 LaTeX2e 程式碼與 LaTeX3 程式碼混合:
% some expl3 code
\addtocounter{foo}{123}
% more expl3 code
或者我可以只使用expl3
命令來做到這一點:
% some expl3 code
\int_gadd:Nn \c@foo { 123 }
% more expl3 code
哪種操作計數器的方式比較好?或者我選擇哪一種方式並不重要?
編輯:這是一個 MWE,使用該datenumber
套件:
\documentclass{article}
\usepackage{datenumber,xparse}
\makeatletter
\ExplSyntaxOn
\cs_new_protected:Npn \juhu_futuredate:n #1
{
\setdatetoday
\int_gadd:Nn \c@datenumber { #1 } % \addtocounter{datenumber}{#1}
\setdatebynumber{\thedatenumber}
In ~ #1 ~ days ~ is ~ \datedate.
}
\NewDocumentCommand{\futuredate}{m}
{
\juhu_futuredate:n { #1 }
}
\ExplSyntaxOff
\makeatother
\begin{document}
\futuredate{7}
\end{document}
該datenumber
包定義了datenumber
計數器並使用命令為其分配一個整數\setdatetoday
。\datedate
根據給定的值列印日期\setdatebynumber
。當然,我可以定義一個自己的整數並將其傳遞給命令\setdatebynumber
,但是給出的整數\setdatetoday
並不簡單,我想避免自己進行計算。
答案1
我想我可以提供一個或多或少的“官方”答案:使用 LaTeX2e 命令。混合這兩個介面會帶來麻煩,雖然我們正在幾個領域開展工作,但我們還沒有找到「使用者層級」的計數器方法。 (事實上,如何處理文件層級的變數的整個問題是開放的。)
我在這裡使用的原因\setcounter
是\c@...
是內部的對於 LaTeX2e,其重點expl3
是擁有清晰的介面和內部結構。沒有理由濫用這裡的介面(沒有功能增益),所以堅持使用它們。
答案2
第一的如果可能的話,我會避免使用內部命令:特別是當已經提供了介面時。例如,我會使用
\addtocounter{datenumber}{...}
而不是直接與
\c@datenumber
也,我將使用\addtocounter
LaTeX 使用者介面層級提供的計數器。我只會用於\int_gadd:Nn
用 定義的類似計數器的東西expl3
。
下一個,我不會將@
符號與expl3
符號混合在一起。如果您必須同時使用兩者,那麼如果它們必須以某種方式共享訊息,我會明確將兩者分開並創建一個介面。但如果可能的話,我會盡量避免兩者的混合,即使有一個介面。
然後我將創建自己的一組expl3
命令來直接與任何特定套件提供的命令進行互動。在這些命令中,我只會使用標準 LaTeX 巨集/結構以及用戶介面套件提供的任何 LaTeX 巨集/結構。
最後,我會創建expl3
這樣的程式碼在表面上是純粹的expl3
程式碼。
因此,按照上述建議,您的 MWE 將變成如下所示:
\documentclass{article}
\usepackage{datenumber,xparse}
\makeatletter
%% define/work with functions that use `@`
%% notation create an interface for these
%% functions if necessary.
\makeatother
\ExplSyntaxOn
%% User level interface
\NewDocumentCommand{\futuredate}{m}
{
\juhu_futuredate:n { #1 }
}
%% Internal `expl3` code that on the surface remains purely `expl3`
%% Though these functions might "stand in" for non-expl3 code.
\cs_new_protected:Npn \juhu_futuredate:n #1
{
%% ... expl3 code ...
\_juhu_initialize_date:
%% ... expl3 code ...
\_juhu_advance_date_by:n {#1}
%% ... expl3 code ...
\_juhu_reset_by_datenumber:
%% ... expl3 code ...
\_juhu_print_future_date:n {#1}
%% ... expl3 code ...
}
%% Interface with commands from `datenumber` package
\cs_new_protected:Nn \_juhu_initialize_date: {\setdatetoday}
\cs_new_protected:Nn \_juhu_reset_by_datenumber: {\setdatebynumber{\thedatenumber}}
\cs_new_protected:Npn \_juhu_advance_date_by:n #1 {\addtocounter{datenumber}{#1}}
\cs_new_protected:Npn \_juhu_print_future_date:n #1 {In ~ #1 ~ days ~ is ~ \datedate}
\ExplSyntaxOff
\begin{document}
\futuredate{7}
\end{document}