Ich habe expl3
Code, 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 datenumber
Paket 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 datenumber
Paket definiert den datenumber
Zähler und weist ihm mit dem \setdatetoday
Befehl eine Ganzzahl zu. \datedate
gibt ein Datum abhängig vom an übergebenen Wert aus \setdatebynumber
. Natürlich könnte ich eine eigene Ganzzahl definieren und diese an den \setdatebynumber
Befehl übergeben, aber die von übergebene Ganzzahl \setdatetoday
ist 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 \setcounter
hier anführen würde, ist, dass es \c@...
sich um eineinternfür LaTeX2e, und der ganze Sinn besteht darin, expl3
klare 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, \addtocounter
die auf der Ebene der LaTeX-Benutzeroberfläche bereitgestellt werden. Ich würde es \int_gadd:Nn
nur für zählerähnliche Dinge verwenden, die mit definiert sind expl3
.
Nächste,@
Ich würde Notation nicht mit expl3
Notation 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, expl3
um 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 expl3
Code erstellen, deran der Oberflächeist reiner expl3
Code.
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}