brauche Hilfe beim Erstellen einer dynamischen Spaltentabelle

brauche Hilfe beim Erstellen einer dynamischen Spaltentabelle
\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}

Bildbeschreibung hier eingeben

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 ;.

Bildbeschreibung hier eingeben

verwandte Informationen