Manipular un contador LaTeX2e con LaTeX3

Manipular un contador LaTeX2e con LaTeX3

Tengo un expl3código en el que quiero manipular un contador definido por un paquete usando código LaTeX2e.

Si quiero manipular el contador foo, podría mezclar el código LaTeX2e con el código LaTeX3:

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

o podría hacerlo usando solo expl3comandos:

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

¿Qué forma de manipular el contador es preferible? ¿O no importa el camino que elija?

Editar:Aquí hay un MWE, usando el datenumberpaquete:

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

El datenumberpaquete define el datenumbercontador y le asigna un número entero con el \setdatetodaycomando. \datedateimprime una fecha dependiendo del valor dado a \setdatebynumber. Por supuesto, podría definir un número entero propio y pasarlo al \setdatebynumbercomando, pero el número entero dado por \setdatetodayno es trivial y quiero evitar hacer los cálculos por mi cuenta.

Respuesta1

Supongo que puedo dar una respuesta más o menos "oficial": utilice los comandos LaTeX2e. Mezclar las dos interfaces genera problemas y, aunque estamos trabajando en varias áreas, todavía no tenemos un enfoque de respuesta a 'nivel de usuario'. (De hecho, toda la cuestión de cómo se deben manejar las variables a nivel de documento está abierta).

La razón por la que usaría \setcounteraquí es que \c@...es uninternopara LaTeX2e, y el objetivo expl3es tener interfaces e componentes internos claros. No hay razón para abusar de las interfaces aquí (no se gana funcionalidad), así que quédese con ellas.

Respuesta2

PrimeroEvitaría el uso de comandos internos si es posible: especialmente cuando ya existe una interfaz proporcionada. Entonces, por ejemplo, usaría

\addtocounter{datenumber}{...}

en lugar de trabajar directamente con

\c@datenumber

También,Lo usaría \addtocountercon contadores proporcionados en el nivel de interfaz de usuario de LaTeX. Lo usaría \int_gadd:Nnsolo para cosas similares a contadores definidas con expl3.

Próximo,No mezclaría @notación con expl3notación. Si debe usar ambos, los separaría claramente y crearía una interfaz si de alguna manera deben compartir información. Pero si es posible, intentaría evitar la mezcla de los dos, incluso con una interfaz.

EntoncesCrearía mi propio conjunto de expl3comandos para interactuar directamente con los proporcionados por cualquier paquete en particular. Dentro de estos comandos, solo usaría macros/estructuras de LaTeX estándar y cualquier macro/estructura de LaTeX proporcionada por los paquetes para la interfaz de usuario.

Finalmente,yo crearía elexpl3 código queen la superficiees puramente expl3código.

Entonces, siguiendo la recomendación anterior, tu MWE se convertiría en algo como:

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

información relacionada