更新 1

更新 1

我正在尝试为表格建立一个行列表,然后将该列表呈现到表格中。我用它etoolbox来管理列表并循环遍历它。我已经接近成功,但我无法正确生成表格中的多列。似乎在第一列之后,&其余的列就丢失了。

\documentclass{article}
\usepackage{float}
\usepackage{etoolbox}

\begin{document} 

\newcommand\mylist{}

\newcommand{\addRow}[3]{
  \listadd{\mylist}{#1,#2,#3}
}

\newcommand{\makerow}[1]{
  \renewcommand*{\do}[1]{##1&}
  \docsvlist{#1}
}

\newcommand{\dorow}[1]{\makerow{#1} \\ \hline}

\newcommand{\makeTable}{
  \begin{table}[H]
    \begin{tabular}{|c|c|c|}
      \hline
      Uppercase & Number & Lowercase \\ \hline
      \forlistloop{\dorow}{\mylist}
    \end{tabular}
  \end{table}
}

\addRow{A}{1}{a}
\addRow{B}{2}{b}
\addRow{C}{3}{c}
\makeTable

\end{document}

格式错误的表格


更新 1

&我在调试表格方面取得了一些进展。我意识到之前每行末尾都多了一个\\ \hline,于是我用这个修复了这个问题http://tex.stackexchange.com/a/89187/5764

\newcommand{\makerow}[1]{%
  \def\delim{\def\delim{ & }}%
  \renewcommand*{\do}[1]{\delim##1}%
  \docsvlist{#1}%
}

如果我转义&'s,那么我会得到下表,其中似乎所有内容都在正确的位置

转义的 & 符号

但没有转义的&',它仍然看起来像第一个表。它仍然像是&' 被删除或没有被正确解释。

答案1

您可以使用更紧凑的代码。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\addRow}{mmm}
 {
  \seq_gput_right:Nn \g__nelson_table_seq { {#1},{#2},{#3} }
 }

\NewDocumentCommand{\makeTable}{}
 {
  \begin{flushleft}
  \begin{tabular}{|c|c|c|}
  \hline
  Uppercase & Number & Lowercase \\ \hline
  \seq_map_function:NN \g__nelson_table_seq \__nelson_table_make:n
  \end{tabular}
  \end{flushleft}
 }

\seq_new:N \g__nelson_table_seq

\cs_new_protected:Nn \__nelson_table_make:n
 {
  \clist_use:nn { #1 } { & } \\ \hline
 }

\ExplSyntaxOff

\begin{document}

\addRow{A}{1}{a}
\addRow{B}{2}{b, q}
\addRow{C}{3}{c}
\makeTable

\end{document}

在此处输入图片描述

\addRow命令像您的代码一样,将逗号分隔的列表添加到全局序列(类似于列表etoolbox)。\makeTable调用时,序列被映射,每个项目都执行\clist_use:nn { #1 } { & },将&每个项目放在中间;最后我们发出\\

每个项目都受到括号内的保护,因此参数中的逗号不会中断(显示示例)。

最后,没有必要,\begin{table}[H]而且flushleft已经足够了(也许你想要center)。

答案2

尝试此代码。(添加缺失的\delim

A

\documentclass{article}
\usepackage{float}
\usepackage{etoolbox}

\begin{document} 
    
    \newcommand\mylist{}
    
    \newcommand{\addRow}[3]{
    \def\delim{&}% added <<<<<<<<<<<<<<<<<<
        \listadd{\mylist}{#1,\delim#2,#3}% changed <<<<<<<<<<<
    }
    

\newcommand{\makerow}[1]{%
    \def\delim{\def\delim{&}}%
    \renewcommand*{\do}[1]{##1\delim}%
    \docsvlist{#1}%
}
    
    \newcommand{\dorow}[1]{\makerow{#1} \\ \hline}
    
    \newcommand{\makeTable}{
        \begin{table}[H]
            \begin{tabular}{|c|c|c|}
                \hline
                Uppercase & Number & Lowercase \\ \hline
                \forlistloop{\dorow}{\mylist}
            \end{tabular}
        \end{table}
    }
    
    \addRow{A}{1}{a}
    \addRow{B}{2}{b}
    \addRow{C}{3}{c}
    \addRow{D}{4}{d}
    
    \makeTable  

\end{document}

相关内容