LaTeX3으로 LaTeX2e 카운터 조작

LaTeX3으로 LaTeX2e 카운터 조작

expl3LaTeX2e 코드를 사용하는 패키지에 의해 정의된 카운터를 조작하려는 코드가 있습니다 .

카운터를 조작하려면 fooLaTeX2e 코드와 LaTeX3 코드를 혼합하면 됩니다.

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

또는 다음 명령만 사용하여 수행할 수도 있습니다 expl3.

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

카운터를 조작하는 방법 중 어떤 방법이 더 바람직합니까? 아니면 어떤 길을 선택해도 상관없나요?

편집하다:다음은 패키지를 사용하는 MWE입니다 datenumber.

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

패키지 는 카운터를 datenumber정의 datenumber하고 명령을 사용하여 카운터에 정수를 할당합니다 \setdatetoday. \datedate에 주어진 값에 따라 날짜를 인쇄합니다 \setdatebynumber. 물론 자신만의 정수를 정의하여 \setdatebynumber명령에 전달할 수도 있지만 에서 제공하는 정수 \setdatetoday는 중요하지 않으며 직접 계산을 수행하는 것을 피하고 싶습니다.

답변1

나는 다소 '공식적인' 답변을 제공할 수 있다고 생각합니다. LaTeX2e 명령을 사용하십시오. 두 인터페이스를 혼합하면 문제가 발생하며 여러 영역에서 작업하는 동안 아직 '사용자 수준' 카운터 접근 방식이 없습니다. (실제로 문서 수준의 변수를 어떻게 처리해야 하는지에 대한 전체 질문은 공개되어 있습니다.)

내가 \setcounter여기를 사용하는 이유 \c@...내부LaTeX2e의 경우 전체 요점은 expl3명확한 인터페이스와 내부를 갖는 것입니다. 여기서는 인터페이스를 남용할 이유가 없으므로(기능상의 이점 없음) 이를 고수하십시오.

답변2

첫 번째가능하다면 내부 명령을 사용하지 않을 것입니다. 특히 인터페이스가 이미 제공되는 경우에는 더욱 그렇습니다. 예를 들어, 저는

\addtocounter{datenumber}{...}

직접 작업하는 것보다

\c@datenumber

또한,\addtocounterLaTeX 사용자 인터페이스 수준에서 제공되는 카운터를 사용하겠습니다 . 나는 \int_gadd:Nn으로 정의된 카운터와 유사한 것에 대해서만 사용하겠습니다 expl3.

다음,@나는 표기법과 표기법을 섞지 않을 것입니다 expl3. 둘 다 사용해야 한다면 둘을 명확하게 분리하고 어떻게든 정보를 공유해야 한다면 인터페이스를 만들 것입니다. 그러나 가능하다면 인터페이스를 사용하더라도 이 둘이 혼합되는 것을 피하려고 노력할 것입니다.

그 다음에expl3나는 특정 패키지에서 제공하는 명령과 직접 상호 작용하는 명령 세트를 만들 것입니다 . 이러한 명령 내에서는 표준 LaTeX 매크로/구조와 사용자 인터페이스용 패키지에서 제공하는 LaTeX 매크로/구조만 사용합니다.

마지막으로,나는 expl3다음과 같은 코드를 만들 것이다.표면에순전히 expl3코드입니다.

따라서 위의 권장 사항에 따르면 MWE는 다음과 같습니다.

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

관련 정보