내 expl3 \prop_item이 내 \stepcounter를 증가시키는 이유는 무엇입니까?

내 expl3 \prop_item이 내 \stepcounter를 증가시키는 이유는 무엇입니까?

내가 뭘 하려는지

독자가 클릭하여 내가 참조하는 텍스트 줄을 볼 수 있는 사용자 정의 상호 참조 태그를 만들고 싶습니다. 그러나 수동으로 번호를 다시 매기지 않고도 텍스트에서 항목을 추가하고 뺄 수 있도록 태그 번호 매기기를 자동화하고 싶습니다.

이를 달성하기 위해 저는 현재 매우 일반적인 expl3 \prop_Python dict또는 C 와 유사하게 동작하는 를 함께 모으고 있습니다 . map명령 내에서 사용자 정의 태그를 설정하고 호출하고 테스트를 진행합니다. 하지만 \prop_item예상하지 못한 방식으로 카운터가 증가하는 것 같습니다 .

MWE

\documentclass{article}

\usepackage{hyperref}
\usepackage{xparse}

% Define a dict-like object where I can store the label and my associated text.
\ExplSyntaxOn
\prop_new:N \g_prop_dict
\NewDocumentCommand{\dictappend}{mm}{%
  \prop_gput:Nnn\g_prop_dict{#1}{#2}
}
\NewDocumentCommand{\CGet}{m}{%
  \prop_item:Nn\g_prop_dict{#1}
}
\ExplSyntaxOff

% First counter
\newcounter{articlejournal}
\setcounter{articlejournal}{1}
\newcommand{\countAJ}[1]{%
    \dictappend{#1}{AJ\thearticlejournal}
    \phantomsection\label{#1}{\textbf{AJ\thearticlejournal}}
    \stepcounter{articlejournal}
}% 

% Secound counter
\newcounter{articleconference}
\setcounter{articleconference}{1}
\newcommand{\countAC}[1]{%
    \dictappend{#1}{AC\thearticleconference}
    \phantomsection\label{#1}{\textbf{AC\thearticleconference}}
    \stepcounter{articleconference}
}% 

% Command to retrieve the value and format it correctly.
\newcommand{\myref}[1]{\hyperref[#1]{\textbf{\CGet{#1}}}}

\begin{document}
\countAJ{foo} - is test 1

\countAJ{bar} - is test 2

\countAC{baz} - this is a different one

Here I reference \myref{bar} and \myref{foo}, and here I want \myref{baz}.

I expect these to look like AJ2, AJ1, and AC1, respectively.
\end{document}

여기에 이미지 설명을 입력하세요

입력 변수를 불변으로 만들기

서식이 지정된 줄이 예상한 대로 \dictappend{#1}{A*\thearticle***}변경할 수 없는 값을 전달하지 않는 것 같습니다 . \the그게 작동하는 방식이 아닌가요?

내가 원하지 않거나 작동하지 않는 것

  • 나는 부품을 사용해 보았습니다.이 게시물, 그러나 시도한 구성에는 도움이 되지 않았습니다. @egreg의 답변은 에 적용하면 제대로 작동하는 것처럼 보이지만 \dictappend{#1}{\edef\newstring{AJ\thearticlejournal}}이는 내 문자열을 사라지게 하기 때문에 이상합니다 .
  • 2-인수 레이블 정의를 적절하게 만들기이 질문여기서는 허용되지 않습니다. 수동으로 번호를 다시 매기지 않고도 큰 목록에 새 항목을 삽입할 수 있기를 원합니다. 내 사용 사례에는 자체 참조가 필요합니다.
  • 참조하려는 카운터가 여러 개 있으므로 를 \myref사용하여 \the카운트에 액세스해도 필요한 효과가 없습니다.여기에 인용된 대로. 단독으로 사용할 때 \the제가 관리할 수 있는 최선은 카운터 값만 주입하는 것이었습니다.
  • 마찬가지로 \refstepcounter비슷한 작업을 수행합니다.이 예텍스트 대신 값만 반환합니다.

물어보세요

이 작업 중에 변수가 증가하는 이유는 무엇입니까? 각 dict 항목이 정의된 후에 변경되지 않도록 이 문제를 어떻게 해결할 수 있습니까?

답변1

다음을 사용하여 속성 목록에 카운터 값을 저장할 때:

\NewDocumentCommand{\dictappend}{mm}{%
  \prop_gput:Nnn\g_prop_dict{#1}{#2}
}

그런 다음 다음과 같이 사용 \dictappend하십시오 \countAJ.

\dictappend{#1}{AJ\thearticlejournal}

에 서명이 AJ\thearticlejournal주어지면 "조작 없음"으로 저장하고 있습니다 .n\prop_gput:Nnn

\CGetthen 에서 이 값을 사용하면 AJ\thearticlejournal확장됩니다. 즉, (and ) \thearticlejournal를 호출한 위치에서 의 현재 값을 가져옵니다 .\CGet\myref

이 값을 저장한 시점의 값이 되도록 하려면 해당 시점에서 확장해야 합니다. in \prop_gput:Nnx대신 을 사용하여 수행할 수 있는 작업은 다음과 같습니다 .\prop_gput:Nnn\dictappend

\NewDocumentCommand{\dictappend}{mm}{%
  \prop_gput:Nnx\g_prop_dict{#1}{#2}
}

관련 정보