다음에 대한 후속 질문입니다.이 질문, 어디크리스티안 후퍼특정 문제에 대한 훌륭한 솔루션을 제공했습니다. 해당 섹션의 시작 부분에 해당 섹션 내에서 발생하는 특수 명령을 나열하고 싶었습니다. 그것은 완벽하게 작동합니다.
이제 모든 목록의 내용을 한 페이지, 바람직하게는 문서의 시작 부분에 표시하여 이 작업의 범위를 조금 확장하고 싶습니다. 범위가 제한된 로컬 목록을 사용하여 코드가 작동하는 것을 확인했습니다. 각 섹션에 대한 전역 목록을 추가하여 섹션 외부에서 액세스할 수 있도록 하는 것이 가능합니까? 나는 인터넷에서 이에 대한 유용한 정보를 찾을 수 없었습니다.
많은 감사드립니다!
답변1
이것은 OP에 연결된 답변에서 제공한 이전 솔루션을 확장합니다.
기본적으로 사람의 모습을 다시 섹션별로 저장하는 것과 같은 전략을 적용하는데, 사람이 나타나는 섹션 번호를 레이블과 함께 수집한 후 이 목록을 다시 추출하여 \ListOfPersons
긴 테이블로 만든 테이블을 설정하고, 관련 섹션에 대한 하이퍼링크가 포함되어 있습니다.
제 생각에는 코드가 약간 압축될 수 있지만 여기 있습니다.
\documentclass{scrartcl}
\usepackage{array}
\usepackage{longtable}
\usepackage{xcolor}
\usepackage{refcount}
\usepackage{xparse}
\usepackage{hyperref}
\newcolumntype{L}[1]{>{\raggedright}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft}p{#1}}
\newif\ifusehyperlinks
\ExplSyntaxOn
\seq_new:N \g_luke_listofpersons_seq
\seq_new:N \l_luke_listofpersons_seq
\NewDocumentCommand{\addperson}{m}{%
\seq_if_in:NnF \g_luke_listofpersons_seq {#1} {
\seq_gput_right:Nn \g_luke_listofpersons_seq {#1}
\seq_gremove_duplicates:N \g_luke_listofpersons_seq
\seq_new:c {g_luke_#1_scene_seq }
}
\int_compare:nNnT {\number\value{section}} > {0} {
\seq_gput_right:cx {g_luke_#1_scene_seq } {\thesection}
}
}
\NewDocumentCommand{\addpersonlocal}{m}{%
\seq_gput_right:Nn \l_luke_listofpersons_seq {#1}
\int_compare:nNnT {\number\value{section}} > {0} {
\seq_gput_right:cx {g_luke_#1_scene_seq } {\thesection}
}
% \seq_show:c {g_luke_#1_scene_seq }
}
\cs_new:Npn \IfPersonCalledAlreadyF #1#2 {%
\seq_if_in:NnF \l_luke_listofpersons_seq {#1} {#2}
}
\NewDocumentCommand{\DisplayPersons}{}{%
\seq_clear:N \l_luke_listofpersons_seq
\group_begin:
\seq_clear:N \l_tmpa_seq
\seq_map_inline:Nn \g_luke_listofpersons_seq {%
\IfRefUndefinedExpandable{##1\thesection}{}{
\seq_put_right:Nn \l_tmpa_seq {\use:c{##1h}}
}
}
\seq_if_empty:NF \l_tmpa_seq {
\PrePersonList
\seq_use:Nn \l_tmpa_seq {,~}
\PostPersonList
}
\group_end:
}
\cs_generate_variant:Nn \seq_set_from_clist:Nn {Nx}
% This creates the table entry line per person, by 'cracking' the stored list of sections into the relevant section number and then provides a hyper link
\cs_new:Npn \generatelistofpersonstableline {
\seq_map_inline:Nn \g_luke_listofpersons_seq {
\seq_set_from_clist:Nx \l_tmpa_seq {\getrefnumber{person::##1}}
\seq_if_empty:NF \l_tmpa_seq {
\use:c{##1h} & \seq_set_from_clist:Nx \l_tmpa_seq {\getrefnumber{person::##1}}
\int_set:Nn \l_tmpa_int {\seq_count:N \l_tmpa_seq}
\int_zero:N \l_tmpb_int
\seq_map_inline:Nn \l_tmpa_seq {
\int_incr:N \l_tmpb_int
\ifusehyperlinks
\hyperlink{section.####1}{####1}
\else
####1
\fi
\int_compare:nNnF {\l_tmpa_int} = {\l_tmpb_int} {
,\space
}
}
\tabularnewline
}
}
}
\NewDocumentCommand{\ListOfPersons}{}{%
\begin{longtable}{L{5cm}R{10cm}}
\bfseries Person & \bfseries Sections \tabularnewline
\endhead
\generatelistofpersonstableline
\end{longtable}
}
\makeatletter
\NewDocumentCommand{\storelistofpersons}{}{%
\seq_map_inline:Nn \g_luke_listofpersons_seq {
\protected@edef\@currentlabel{\seq_use:cn {g_luke_##1_scene_seq}{,}}
\label{person::##1}%
% ##1 \space \seq_use:cn {g_luke_##1_scene_seq} {,}
% \par
}
}
\makeatother
\AtEndDocument{%
\storelistofpersons%
}
\ExplSyntaxOff
\NewDocumentCommand{\PostPersonList}{}{%
\bigskip%
}
\NewDocumentCommand{\displayindividualperson}{m}{%
\textbf{#1}%
}
\NewDocumentCommand{\PrePersonList}{}{%
{\large \bfseries Persons in Section \thesection}
}
\makeatletter
\NewDocumentCommand{\NewPerson}{m+m}{%
% Add this person to the global list
\addperson{#1}%
% Now define the personal \...x command
\expandafter\NewDocumentCommand\csname #1x\endcsname{+m}{%
%Check if the person has been called in the local section already
\IfPersonCalledAlreadyF{#1}{%
\addpersonlocal{#1}
% Add the personal to the local list, i.e. per section
% Check whether the label has been defined already
\protected@edef\@currentlabel{\thesection.#1}\label{#1\thesection}
}%
\textsc{#1:} ##1%
}% End of the \...x command
\expandafter\NewDocumentCommand\csname #1h\endcsname{}{%
#2{#1}%
}
}% End of \NewPerson
\makeatother
\NewPerson{tom}{\colorbox{green}}
\NewPerson{frodo}{\colorbox{yellow}}
\NewPerson{Gandalf}{\fcolorbox{yellow}{yellow!60!blue}}
\NewPerson{Paulo}{\colorbox{green}}
\NewPerson{David}{\colorbox{orange}}
\usehyperlinkstrue
\begin{document}
\ListOfPersons
\section{In the supermarket}
\DisplayPersons
\tomx{Hi, I'm Tom!}
\frodox{Hi, I'm Frodo!}
\section{At TeX.SE}
\DisplayPersons
\frodox{Hi, I'm Frodo!}
\frodox{I am going to Mordor}
\Gandalfx{Cast the ring into the fire!}
\tomx{Waiting for Godot}
\section{In TeX.SE Chat}
\DisplayPersons
\Paulox{Quack!}
\Gandalfx{Quack!}
\Davidx{I've got a recipe for Duck in Orange Sauce}
\tomx{That's marvellous}
\frodox{Pineapple pizza!}
\end{document}