LaTeX 在根文檔上輸出本機列表

LaTeX 在根文檔上輸出本機列表

這是一個後續問題這個問題, 在哪裡克里斯蒂安·胡弗為我的某個問題提供了一個很好的解決方案:我想在該部分的開頭列出該部分中特殊命令的出現情況。效果非常好。

現在我想透過在一頁上顯示所有這些清單的內容來稍微擴展一下這個東西的範圍,最好是在文件的開頭。我發現代碼透過使用範圍有限的本地列表來工作。是否可以以某種方式為每個部分添加全域列表,以便可以從該部分外部存取這些列表?我在網上找不到任何關於此的有用資訊。

預先非常感謝!

答案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}

在此輸入影像描述

相關內容