
\NewDocumentCommand\foo{>{\SplitList{;}}m}
{
\begin{table}
\begin{tabular}{ \ProcessList{#1} c}
\ProcessList{#1}{\additem}
\end{tabular}
\end{table}}
}
\newcommand\additem[1]{#1 &}
Ich versuche, eine dynamische Tabelle zu erstellen, die so viele Argumente wie möglich aus der Liste aufnimmt und in die Tabelle ausgibt, wobei jedes Element eine Spalte ist. Ich habe ein Problem mit der Anzahl der Spalten und der Anzahl der eingefügten &. Für jede Hilfe wäre ich sehr dankbar.
mein Problem ist die Vorhersage der Spaltenanzahl in der Tabelle. und die Verhinderung der
! Package array Error: Illegal pream-token (\ProcessList):
c' verwendet.`
oder wenn ich die Prozessliste entferne bekomme ich
! Extra alignment tab has been changed to \cr.
Antwort1
Es ist unklar, was dieser Befehl tun würde, da eine einzeilige Tabelle nur eine Zeile ist und daher tabular
überhaupt nicht benötigt wird: Sie würden das erforderliche Verhalten erhalten, indem Sie einfach sagen
\NewDocumentCommand{\foo}{>{\SplitList{;}}m}{%
\begin{table}
\centering
\ProcessList{#1}{\additem}
\end{table}
}
\newcommand{\additem}[1]{\mbox{\hspace{\tabcolsep}#1\hspace{\tabcolsep}}}
Vollständiges Beispiel mit explizit gleichem Tabellensatz, um zu sehen, dass die Ausgabe genau dieselbe ist:
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\foo}{>{\SplitList{;}}m}{%
\begin{table}[htp]
\centering
\ProcessList{#1}{\additem}
\end{table}
}
\newcommand{\additem}[1]{\mbox{\hspace{\tabcolsep}#1\hspace{\tabcolsep}}}
\begin{document}
\foo{abc;def;ghijkl;m}
\begin{center}
\begin{tabular}{*{4}{c}}
abc & def & ghijkl & m
\end{tabular}
\end{center}
\end{document}
So können Sie ein nützlicheres Makro erstellen:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\foo}{m}
{
\bob_make_table:n { #1 }
}
\int_new:N \l_bob_colcount_int
\seq_new:N \l_bob_rows_seq
\seq_new:N \l_bob_temp_seq
\tl_new:N \l_bob_table_tl
\cs_new_protected:Npn \bob_make_table:n #1
{
\seq_set_split:Nnn \l_bob_rows_seq { \\ } { #1 }
\int_zero:N \l_bob_colcount_int
% count the number of columns
\seq_map_inline:Nn \l_bob_rows_seq
{
\seq_set_split:Nnn \l_bob_temp_seq { ; } { ##1 }
\int_compare:nT { \seq_count:N \l_bob_temp_seq > \l_bob_colcount_int }
{
\int_set:Nn \l_bob_colcount_int { \seq_count:N \l_bob_temp_seq }
}
}
% produce the table
\tl_set:Nn \l_bob_table_tl { \begin{tabular}{*{\l_bob_colcount_int}{c}} }
\seq_map_inline:Nn \l_bob_rows_seq
{
\seq_set_split:Nnn \l_bob_temp_seq { ; } { ##1 }
\tl_put_right:Nx \l_bob_table_tl { \seq_use:Nn \l_bob_temp_seq { & } }
\tl_put_right:Nn \l_bob_table_tl { \\ }
}
% print the table
\tl_use:N \l_bob_table_tl
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\foo{
abc;def\\
ghijkl;m;nopqrs;tu\\
vz
}
\end{document}
Zeilen sind durch \\
und Spalten durch getrennt ;
.