Listen automatisch beim Schreiben erstellen

Inhalt, Abbildungen, Tabellen, Quellcodes und andere Verzeichnisse


Flame
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Sa 6. Apr 2019, 21:54

Listen automatisch beim Schreiben erstellen

Beitrag von Flame »

Hallo zusammen,

es gibt ja schon viele fertige Pakete in LaTeX, mit denen Listen automatisch erstellt werden, wie beispielsweise \tableofcontents etc.

Ich habe zwar via Google schon einiges gefunden, was in die Richtung geht, wonach ich suche, aber es war dann doch ein anderes Problem, das nicht ganz zu meinem passte. Oder es war dann so umfangreich, dass ich den hunderten Seiten nicht die drei für mich wesentlichen Befehle entnehmen konnte.

Ich möchte, dass LaTeX beim kompilieren eine oder mehrere Listen mit Punkten erstellt, die ich beim Schreiben im Text festlege. In etwa so:
...Präambel...

%Die Liste definieren (muss vielleicht auch gar nicht in die Präambel)
\def{\list}

\begin{document}

\section{TOP 1}

\begin{itemize}
\item Item 1
\item Item 2
...
%zum nächsten Item möchte ich einen Eintrag in meiner Liste erstellen
\item Item n \put_in_list{Das ist der Text, der zu diesem Item in der Liste erscheinen soll}
\item Weitere Items
\end{enumerate}

\section{TOP2}

... usw.

Hier kommen dann noch viele weitere TOPs.

%Hier soll LaTeX dann die Liste im Text einfügen.
\insert_list_here 

\end{document}
Ich hoffe, damit wird einigermaßen klar, was ich will. Ich habe das Gefühl, dass es dafür eine sehr einfache Lösung gibt. Es gibt sicher eine Möglichkeit, eine Liste \list zu definieren und einen dazugehörigen Befehl \put_in_list{}, welcher diese Liste dann füllt. Dann braucht es natürlich noch einen Befehl wie \insert_list_1, der LaTeX dann sagt, wo im Text er diese Liste einfügen soll. Mit optionalen Argumenten ließ sich ggf. noch eine Referenz einfügen, dass man den Eintrag in der Liste auch dem entsprechenden Abschnitt im Text zuordnen kann.

Ich hätte gerne eine Lösung, die ohne copy und paste auskommt. Wenn ich den Eintrag im Text ändere und dann auch 10 verschiedene Listen erstelle, wird es schnell unübersichtlich und überall steht dann etwas anderes. Daher soll LaTeX da quasi mitdenken und die Liste automatisch mit anpassen.

Gruß
Flame

Gast

Beitrag von Gast »

Ich kapiere zwar nur die Hälfte von dem, was Du da von Dir gibst, aber drei Dinge:
  • Du solltest in LaTeX \def vermeiden, weil Du damit leicht Dinge umdefinieren kannst, ohne es zu merken. Verwende besser \newcommand etc.
  • \list gibt es schon. Das ist die mehr oder weniger interne Listen-Umgebung, die für itemize, enumerate, description etc. verwendet wird.
  • Wenn ich halbwegs verstehe, was Du willst, dann suchst Du nach der Möglichkeit, ein Vewzeichnis zu erstellen. Das ginge mit Paketen wie tocbasic, caption etc. Es kann aber auch sein, dass Du etwas wie ein Glossar oder eine Nomenklatur suchst. Das ginge dann mit nomencl oder glossaries oder acro oder ähnlichen Paketen.

Gast

Beitrag von Gast »

Je nach Anwendung gibt es wesentlich bessere Ideen, aber prinzipiell kann man so etwas mit expl3 und sequences recht leicht basteln. Auch mit etoolbox und seinen Listen wäre das möglich. Der Nachteil der naiven Lösung ist, dass nur die Elemente in der Liste ausgegeben werden können, die vor dem Aufrufen des Ausgabebefehls zu Liste hinzugefügt wurden. Ansonsten müsste man die Liste sammeln und in der .aux-Datei zwischenspeichern.
\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \g_flame_list_seq

\NewDocumentCommand{\addtoflamelist}{m}{
  \seq_gput_left:Nn \g_flame_list_seq {#1}
}

\NewDocumentCommand{\clearflamelist}{}{
  \seq_gclear:N \g_flame_list_seq
}

\msg_new:nnn { flamelist } { emptylist }
  { Empty~list.~Items~can~be~added~using~\token_to_str:N\addtoflamelist. }

\keys_define:nn { flame-list-printlist }
{
  env     .code:n    = \tl_set:Nn \l_flame_listenv_tl {#1},
  env     .initial:n = itemize,
  
  heading .code:n    = \cs_set:Npn \l_flame_heading_cs {#1},
  heading .initial:n = \section,
  
  title   .code:n    = \tl_set:Nn \l_flame_listtitle_tl {#1},
  title   .initial:n = Flame-Liste,
}


\NewDocumentCommand{\printflamelist}{O{}}{
  \seq_if_empty:NTF \g_flame_list_seq
    { 
      \msg_warning:nn { flamelist } { emptylist }
    }
    { 
      \group_begin:
      \keys_set:nn { flame-list-printlist } { #1 }
      \l_flame_heading_cs{\l_flame_listtitle_tl}
      \begin{\l_flame_listenv_tl}
        \seq_map_function:NN \g_flame_list_seq \item
      \end{\l_flame_listenv_tl}
      \group_end:
    }
}
\ExplSyntaxOff

\begin{document}

\section{TOP 1}

\begin{enumerate}
\item Item 1
\item Item 2
\item Item n\addtoflamelist{Das ist der Text, der zu diesem Item in der Liste erscheinen soll}
\item Weitere Items
\end{enumerate}

\section{TOP2}
Item n\addtoflamelist{Blob}

Hier kommen dann noch viele weitere TOPs.

\printflamelist

\clearflamelist

\addtoflamelist{Das ist der Text, der zu diesem Item in der Liste erscheinen soll}
\addtoflamelist{Das ist der Text, der zu diesem Item in der Liste erscheinen soll}

\printflamelist[env=enumerate,heading=\section*,title=Foo]
\end{document}

Flame
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Sa 6. Apr 2019, 21:54

Beitrag von Flame »

Danke schon mal fürs Reindenken und die Antworten! Das klingt schon mal nach einem konstruktiven Vorschlag, den ich selbst nicht hinbekommen hätte ;-). Ich muss das mal ausprobieren und vermutlich noch etwas darüber nachdenken. Ich hatte schon vermutet, dass es nicht so trivial ist.

Ich melde mich nochmal, ob es funktioniert.

Was mir beim ersten drüberschauen noch nicht klar ist, wozu \clearflamelist gut sein soll?

Gruß
Flame

Gast

Beitrag von Gast »

Das Grundprinzip ist recht simpel, da es in expl3 den seq-Typen gibt, der eine einfache Liste ist. \addtoflamelist fügt einen Eintrag am Ende der Liste zu. \printflamelist iteriert über die ganze Liste, wenn sie nicht leer ist, und gibt innerhalb einer Listenumgebung jeden Eintrag in einem \item aus. Kompliziert wird der Code nur durch die zusätzlichen Anpassungsmöglichkeiten (und eventuell durch die etwas ungewöhnliche expl3-Syntax).

\clearflamelist ist dazu da, die bis jetzt aufgebaute Liste zu löschen. Das war vor allem in dem Beispiel ganz praktisch, da ich dann ohne viel Aufwand nacheinander zwei Listen mit unterschiedlichem Inhalt erstellen konnte. Wenn in der Anwendung mehrere Listen gewünscht sind, wäre es wohl besser, das über eine Erweiterung der Makros zu lösen, die es erlaubt, mehrere unabhängige Listen nebeneinander zu nutzen.

Bevor Du Dich auf diese von mir eigentlich mehr zum Spaß in einer halben Stunde zum expl3-Lernen zusammengeschusterte Lösung stürzt, möchte ich Dich warnen, dass es für bestimmte Arten von Listen, wie bereits von dem Gast am 6. April angesprochen, fertige und wesentlich ausgeklügeltere Systeme gibt als das hier. Wenn Du uns ein bisschen mehr über Deinen eigentlichen Plan verraten kannst, dann bekommst Du vielleicht Hinweise auf passendere Dinge.

Antworten