我正在尝试为表格建立一个行列表,然后将该列表呈现到表格中。我用它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
)
\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}