Manipule um contador LaTeX2e com LaTeX3

Manipule um contador LaTeX2e com LaTeX3

Eu tenho um expl3código onde quero manipular um contador definido por um pacote usando código LaTeX2e.

Se eu quiser manipular o contador foo, posso misturar o código LaTeX2e com o código LaTeX3:

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

ou eu poderia fazer isso usando apenas expl3comandos:

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

Qual forma de manipular o contador é preferível? Ou não importa o caminho que eu escolho?

Editar:Aqui está um MWE, usando o datenumberpacote:

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

O datenumberpacote define o datenumbercontador e atribui um número inteiro a ele com o \setdatetodaycomando. \datedateimprime uma data dependendo do valor dado a \setdatebynumber. Claro, eu poderia definir um número inteiro próprio e passá-lo para o \setdatebynumbercomando, mas o número inteiro fornecido por \setdatetodaynão é trivial e quero evitar fazer os cálculos sozinho.

Responder1

Acho que posso fornecer uma resposta mais ou menos 'oficial': use os comandos LaTeX2e. Misturar as duas interfaces é causar problemas e, embora estejamos trabalhando em diversas áreas, ainda não temos uma abordagem de contador no “nível do usuário”. (Na verdade, toda a questão de como as variáveis ​​no nível do documento devem ser tratadas está em aberto.)

A razão que eu usaria \setcounteraqui é que \c@...é uminternopara LaTeX2e, e o objetivo expl3é ter interfaces e componentes internos claros. Não há razão para abusar das interfaces aqui (sem ganho de funcionalidade), então fique com elas.

Responder2

PrimeiroEu evitaria usar comandos internos, se possível: principalmente quando já existe uma interface fornecida. Então, por exemplo, eu usaria

\addtocounter{datenumber}{...}

em vez de trabalhar diretamente com

\c@datenumber

Também,Eu usaria \addtocountercontadores fornecidos no nível da interface do usuário LaTeX. Eu usaria \int_gadd:Nnapenas para coisas semelhantes a contador definidas com expl3.

Próximo,Eu não misturaria @notação com expl3notação. Se você precisar usar ambos, eu separaria claramente os dois e criaria uma interface se eles precisassem de alguma forma compartilhar informações. Mas se possível, tentaria evitar a mistura dos dois, mesmo com uma interface.

EntãoEu criaria meu próprio conjunto de expl3comandos para interagir diretamente com aqueles fornecidos por qualquer pacote específico. Dentro desses comandos, eu usaria apenas macros/estruturas LaTeX padrão e quaisquer macros/estruturas LaTeX fornecidas por pacotes para a interface do usuário.

Finalmente,Eu criaria o expl3código quena superfícieé puramente expl3código.

Então, seguindo a recomendação acima, seu MWE ficaria 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}

informação relacionada