使用 LaTeX3 操作 LaTeX2e 計數器

使用 LaTeX3 操作 LaTeX2e 計數器

我有一些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

也,我將使用\addtocounterLaTeX 使用者介面層級提供的計數器。我只會用於\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}

相關內容