Eu tenho um expl3
có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 expl3
comandos:
% 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 datenumber
pacote:
\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 datenumber
pacote define o datenumber
contador e atribui um número inteiro a ele com o \setdatetoday
comando. \datedate
imprime uma data dependendo do valor dado a \setdatebynumber
. Claro, eu poderia definir um número inteiro próprio e passá-lo para o \setdatebynumber
comando, mas o número inteiro fornecido por \setdatetoday
nã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 \setcounter
aqui é 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 \addtocounter
contadores fornecidos no nível da interface do usuário LaTeX. Eu usaria \int_gadd:Nn
apenas para coisas semelhantes a contador definidas com expl3
.
Próximo,Eu não misturaria @
notação com expl3
notaçã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 expl3
comandos 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 expl3
código quena superfícieé puramente expl3
có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}