LaTeX3でLaTeX2eカウンターを操作する

LaTeX3でLaTeX2eカウンターを操作する

expl3LaTeX2e コードを使用してパッケージによって定義されたカウンターを操作するコードがいくつかあります。

カウンターを操作したい場合は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 コマンドを使用してください。2 つのインターフェイスを混在させると問題が生じます。私たちはいくつかの領域で作業していますが、まだ「ユーザー レベル」のカウンター アプローチはありません。(実際、ドキュメント レベルの変数をどのように処理するかという問題全体が未解決です。)

\setcounterここで使う理由\c@...は、内部LaTeX2e の場合、の全体的な目的はexpl3明確なインターフェースと内部構造を持つことです。ここでインターフェースを乱用する理由はないので (機能上の利点はありません)、そのまま使用してください。

答え2

初め可能な限り、特にインターフェースがすでに提供されている場合は、内部コマンドの使用は避けます。たとえば、

\addtocounter{datenumber}{...}

直接作業するのではなく

\c@datenumber

また、\addtocounter私はLaTeX ユーザー インターフェイス レベルで提供されるカウンターと一緒に を使用します。\int_gadd:Nnで定義されたカウンターのようなものにのみを使用しますexpl3

次、@表記法と表記法を混在させないようにしますexpl3。両方を使用する必要がある場合は、2 つを明確に区別し、何らかの方法で情報を共有する必要がある場合はインターフェイスを作成します。ただし、可能であれば、インターフェイスを使用する場合でも、2 つを混在させないようにします。

それから特定のパッケージによって提供されるコマンドと直接対話するための独自のコマンド セットを作成します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}

関連情報