Tengo un expl3
có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 expl3
comandos:
% 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 datenumber
paquete:
\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 datenumber
paquete define el datenumber
contador y le asigna un número entero con el \setdatetoday
comando. \datedate
imprime una fecha dependiendo del valor dado a \setdatebynumber
. Por supuesto, podría definir un número entero propio y pasarlo al \setdatebynumber
comando, pero el número entero dado por \setdatetoday
no 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 \setcounter
aquí es que \c@...
es uninternopara LaTeX2e, y el objetivo expl3
es 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 \addtocounter
con contadores proporcionados en el nivel de interfaz de usuario de LaTeX. Lo usaría \int_gadd:Nn
solo para cosas similares a contadores definidas con expl3
.
Próximo,No mezclaría @
notación con expl3
notació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 expl3
comandos 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 expl3
có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}