Hi, hier ist grad viel los, deswegen die späte Antwort
Also ich habe gefragt, ob die Elemente eindeutig sind, weil man dann einfach Duplikate aus der Liste löschen könnte.
Ob deine Lösung performant ist, kann ich nicht sagen, damit habe ich mich bei TeX ehrlich gesagt noch nie auseinander gesetzt (setzten müssen …)
Hier eine Lösung mit LaTeX3 (expl3). Ein paar Erklärungen stehen im Code, wenn noch was unklar ist, frag einfach
\documentclass{scrreprt}
\usepackage{tabu}
% environ brauchen wir, um den Umgebungsinhalt verarbeiten zu können
% xparse benutzen wir für \NewDocumentCommand, außerdem läd es expl3,
% das wir für die LaTeX3-Funktionen brauchen.
\usepackage{environ,xparse}
% Für schönere Tabellen
\usepackage{booktabs}
% LaTeX3-Syntax einschalten:
% - Leerzeichen werden ignoriert
% - erforderliche LZ werden mit ~ gesetzt
% - : und _ als Teil von Befehlsnahmen
% siehe auch expl3.pdf und source3.pdf
\ExplSyntaxOn
% Als erstes legen wir eine neue Sequenz-Variable (vgl. mit Array) an.
\seq_new:N \l_godi_table_items_seq
% Nun definieren wir einen Befhl, um ein Element der Sequenz hinzuzufügen.
\cs_new:Npn \godi_save_table_item:n #1 {
\seq_gput_right:Nn \l_godi_table_items_seq { #1 }
}
% Dann definieren wir einen neuen Befehl, um den Umgebungsinhalt (\BODY) zu
% verarbeiten: Innerhalb einer Gruppe soll \tabItem zu \godi_save_table_item:n
% werden. Den Inhalt schreiben wir in eine temporäre H-Box, die wir dann
% einfach wegwerfen (bzw. einfach so lassen, wie sie ist) damit er nicht
% im Dokument ausgegeben wird.
\cs_new:Npn \godi_evaluate_table_body:n #1 {
\group_begin:
\cs_set_eq:NN \tabItem \godi_save_table_item:n
\hbox_set:Nn \l_tmpa_box { #1 }
\group_end:
}
\cs_generate_variant:Nn \godi_evaluate_table_body:n { N }
% Die Umgebung definieren wir mit \NewEnviron: Darin leeren wir zunächst die
% Sequenz und lesen dann die Elemente aus. Danach kann der Inhalt wie gehabt
% mit tabu gesetzt werden.
\NewEnviron { tab } {
\seq_clear:N \l_godi_table_items_seq
\godi_evaluate_table_body:N \BODY
\begin{table}
\centering% [\center ist falsch!]
\begin{tabu} { X[m] }
\toprule
Test ~ Tabelle \\% ~für Leerzeichen, normale werden ignoriert.
\midrule
\BODY
\bottomrule
\end{tabu}
\end{table}
}
% Den Befehl definieren wir so, dass er einfach nur seinen Inhalt ausgibt;
% die tatsächliche Arbeit (Sequenz ergänzen) macht ja \godi_save_table_item:n.
\NewDocumentCommand { \tabItem } { m } {
#1 % Element einfach nur ausgeben.
}
% Um die Elemente auszugeben definieren wir dann noch \tabItems.
\NewDocumentCommand { \tabItems } { } {
\seq_use:Nn \l_godi_table_items_seq { ; ~ }
}
% LaTeX3-Syntax wieder abschalten
\ExplSyntaxOff
% Umrühren – fertig!
\begin{document}
\begin{tab}
\tabItem{TabItem1} \\
\tabItem{TabItem2} \\
\end{tab}
\textbf{Ausgabe der Tabellenelemente:}
\tabItems
\begin{tab}
\tabItem{TabItem3} \\
\tabItem{TabItem4} \\
\tabItem{TabItem5} \\
\end{tab}
\textbf{Ausgabe der Tabellenelemente:}
\tabItems
\end{document}
Ich habe mir außerdem erlaubt, deine Tabellen etwas aufzughübschen
warum kannst du in
meinem Blogartikel über Tabellen nachlesen. Dort habe ich auch ein paar Worte zur Zukunftssicherheit von tabu geschrieben.
\center ist übrigens falsch! Es gibt nur \centering oder die Umgebung {center} letztere fügt aber davon und danach zusätzliche Abstände ein und das willst du hier vermutlich eher nicht. Siehe dazu auch
When should we use \begin{center} instead of \centering?
Viele Grüße
Tobi