LaTeX gibt lokale Listen im Stammdokument aus

LaTeX gibt lokale Listen im Stammdokument aus

Dies ist eine Folgefrage fürdiese Frage, WoChristian Hupferbot mir eine tolle Lösung für ein bestimmtes Problem: Ich wollte die Vorkommen spezieller Befehle innerhalb eines Abschnitts am Anfang dieses Abschnitts auflisten. Das funktioniert einwandfrei.

Jetzt möchte ich den Umfang dieser Sache ein wenig erweitern, indem ich den Inhalt aller dieser Listen auf einer Seite anzeige, vorzugsweise am Anfang des Dokuments. Ich sehe, dass der Code mit lokalen Listen mit begrenztem Umfang funktioniert. Ist es irgendwie möglich, für jeden Abschnitt globale Listen hinzuzufügen, sodass diese von außerhalb des Abschnitts aufgerufen werden können? Ich konnte im Internet keine hilfreichen Informationen dazu finden.

Vielen Dank im Voraus!

Antwort1

Dies erweitert die vorherige Lösung, die ich in der vom OP verlinkten Antwort gegeben habe

Grundsätzlich wende ich die gleiche Strategie an wie beim Speichern des Auftretens einer Person wieder auf Abschnittsbasis, indem ich die Abschnittsnummern sammle, in denen eine Person mit Beschriftungen auftritt, diese Liste dann wieder extrahiere und eine \ListOfPersonsmit einer langen Tabelle erstellte Tabelle mit Hyperlinks zu den relevanten Abschnitten einrichte.

Ich denke, der Code kann noch etwas gekürzt werden, aber hier ist er:

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

Bildbeschreibung hier eingeben

verwandte Informationen