Einen LaTeX2e-Zähler mit LaTeX3 manipulieren

Einen LaTeX2e-Zähler mit LaTeX3 manipulieren

Ich habe expl3Code, mit dem ich einen Zähler manipulieren möchte, der von einem Paket mit LaTeX2e-Code definiert wird.

Wenn ich den Zähler manipulieren möchte foo, kann ich entweder LaTeX2e-Code mit LaTeX3-Code vermischen:

% some expl3 code
\addtocounter{foo}{123}
% more expl3 code

oder ich könnte es nur mit Befehlen machen expl3:

% some expl3 code
\int_gadd:Nn \c@foo { 123 }
% more expl3 code

Welche Art der Manipulation des Zählers ist vorzuziehen? Oder ist es egal, welche Art ich wähle?

Bearbeiten:Hier ist ein MWE, das das datenumberPaket verwendet:

\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}

Das datenumberPaket definiert den datenumberZähler und weist ihm mit dem \setdatetodayBefehl eine Ganzzahl zu. \datedategibt ein Datum abhängig vom an übergebenen Wert aus \setdatebynumber. Natürlich könnte ich eine eigene Ganzzahl definieren und diese an den \setdatebynumberBefehl übergeben, aber die von übergebene Ganzzahl \setdatetodayist nicht trivial und ich möchte vermeiden, die Berechnungen selbst durchzuführen.

Antwort1

Ich denke, ich kann eine mehr oder weniger „offizielle“ Antwort geben: Verwenden Sie die LaTeX2e-Befehle. Das Vermischen der beiden Schnittstellen führt zu Problemen, und obwohl wir an mehreren Bereichen arbeiten, haben wir noch keinen Gegenansatz auf „Benutzerebene“. (Tatsächlich ist die gesamte Frage, wie Variablen auf Dokumentebene behandelt werden sollen, offen.)

Der Grund, den ich \setcounterhier anführen würde, ist, dass es \c@...sich um eineinternfür LaTeX2e, und der ganze Sinn besteht darin, expl3klare Schnittstellen und interne Komponenten zu haben. Es gibt keinen Grund, die Schnittstellen hier zu missbrauchen (kein Funktionsgewinn), also bleiben Sie dabei.

Antwort2

ErsteIch würde die Verwendung interner Befehle möglichst vermeiden: insbesondere, wenn bereits eine Schnittstelle vorhanden ist. So würde ich beispielsweise verwenden

\addtocounter{datenumber}{...}

anstatt direkt mit

\c@datenumber

Auch,Ich würde es mit Zählern verwenden, \addtocounterdie auf der Ebene der LaTeX-Benutzeroberfläche bereitgestellt werden. Ich würde es \int_gadd:Nnnur für zählerähnliche Dinge verwenden, die mit definiert sind expl3.

Nächste,@Ich würde Notation nicht mit expl3Notation vermischen. Wenn Sie beides verwenden müssen, würde ich die beiden klar trennen und eine Schnittstelle erstellen, wenn sie irgendwie Informationen austauschen müssen. Aber wenn irgendwie möglich, würde ich versuchen, die Vermischung der beiden zu vermeiden, selbst mit einer Schnittstelle.

DannIch würde meinen eigenen Befehlssatz erstellen, expl3um direkt mit den Befehlen eines bestimmten Pakets zu interagieren. Innerhalb dieser Befehle würde ich nur Standard-LaTeX-Makros/-Strukturen und alle von Paketen für die Benutzeroberfläche bereitgestellten LaTeX-Makros/-Strukturen verwenden.

Endlich,Ich würde den expl3Code erstellen, deran der Oberflächeist reiner expl3Code.

Wenn Sie der obigen Empfehlung folgen, würde Ihr MWE also etwa so aussehen:

\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}

verwandte Informationen