내가 뭘 하려는지
독자가 클릭하여 내가 참조하는 텍스트 줄을 볼 수 있는 사용자 정의 상호 참조 태그를 만들고 싶습니다. 그러나 수동으로 번호를 다시 매기지 않고도 텍스트에서 항목을 추가하고 뺄 수 있도록 태그 번호 매기기를 자동화하고 싶습니다.
이를 달성하기 위해 저는 현재 매우 일반적인 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
\CGet
then 에서 이 값을 사용하면 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}
}