显示表格后填充表格

显示表格后填充表格

我想创建一个表格,该表格填充整个文档,但显示在开头。类似于

\documentclass{article}

\begin{document}
\questiontable

\addrow{Question 1}{20}
\addrow{Question 2}{30}
\addrow{Question 3}{40}

\end{document}

输出应相当于

\begin{tabular}{cc}
Question 1 & 20 \\
Question 2 & 30 \\
Question 3 & 40 \\
\end{tabular}

这类似于创建目录的方式,所以我期望多次编译,但我不知道这样做的内部原理。如果之前有人问过这个问题,请原谅。我找不到类似的问题,但可能是因为我不知道到底要搜索什么。我遇到的最接近的是这里,但该解决方案仅适用于生产 ToC。

我更喜欢使用纯 TeX 的解决方案,这样我就可以修改它们,但任何其他解决方案都非常感谢。

特别是,我希望修改提供的解决方案以允许扩展参数

\documentclass{article}

\begin{document}
\questiontable

\newcounter{question}
\newcounter{mark}

\setcounter{mark}{10} \setcounter{question}{1}
\addrow{{Question \thequestion}{\themark}}

\setcounter{mark}{20} \setcounter{question}{2}
\addrow{{Question \thequestion}{\themark}}

\setcounter{mark}{30} \setcounter{question}{3}
\addrow{{Question \thequestion}{\themark}}

\end{document}

答案1

这是一个可能的解决方案;请注意这里使用的值周围的附加括号来实现最大的灵活性,这样您就可以拥有不同格式的表格。

我打印了两次表格来展示如何使用这些键。

\documentclass{article}
\usepackage{booktabs}

\ExplSyntaxOn

\NewDocumentCommand{\questiontable}{}
 {
  \exp_args:NnV \begin{tabular} \g_tohiko_qt_spec_tl
  \toprule
  \tl_if_empty:NF \g_tohiko_qt_header_tl
   {
    \tl_use:N \g_tohiko_qt_header_tl \\ \midrule
   }
  \seq_use:Nn \g_tohiko_qt_rows_seq { \\ } \\
  \bottomrule
  \end{tabular}
 }

\NewDocumentCommand{\addrow}{m}
 {
  \tohiko_qt_addrow:n { #1 }
 }

\NewDocumentCommand{\questiontablesetup}{m}
 {
  \keys_set:nn { tohiko/qt } { #1 }
 }

\NewDocumentCommand{\tohikoaddrow}{m}
 {
  \seq_gput_right:Nn \g_tohiko_qt_rows_seq { #1 }
 }

\seq_new:N \g_tohiko_qt_rows_seq
\seq_new:N \l__tohiko_qt_temp_seq

\keys_define:nn { tohiko/qt }
 {
  spec .tl_gset:N = \g_tohiko_qt_spec_tl,
  spec .initial:n = { cc },
  cols .int_gset:N = \g_tohiko_qt_cols_tl,
  cols .initial:n = 2,
  header .tl_gset:N = \g_tohiko_qt_header_tl
 }

\cs_new_protected:Nn \tohiko_qt_addrow:n
 {
  \seq_set_split:Nnn \l__tohiko_qt_temp_seq {} { #1 }
  \iow_shipout:cx { @auxout } { \tohikoaddrow { \seq_use:Nn \l__tohiko_qt_temp_seq { & } } }
 }

\ExplSyntaxOff

\begin{document}

\questiontablesetup{header={Question & Points}}

\questiontable

\bigskip

\questiontablesetup{header={\multicolumn{1}{c}{Q} & P},spec={lc}}

\questiontable

\addrow{{Question 1}{20}}
\addrow{{Question 2}{30}}
\addrow{{Question 3}{40}}
\addrow{{Question 121}{40}}

\end{document}

在此处输入图片描述

如何应对不断扩大的计数器值?这是一种可行的方法。

\documentclass{article}
\usepackage{booktabs}

\ExplSyntaxOn

\NewDocumentCommand{\questiontable}{}
 {
  \exp_args:NnV \begin{tabular} \g_tohiko_qt_spec_tl
  \toprule
  \tl_if_empty:NF \g_tohiko_qt_header_tl
   {
    \tl_use:N \g_tohiko_qt_header_tl \\ \midrule
   }
  \seq_use:Nn \g_tohiko_qt_rows_seq { \\ } \\
  \bottomrule
  \end{tabular}
 }

\NewDocumentCommand{\addrow}{m}
 {
  \tohiko_qt_addrow:n { #1 }
 }

\NewDocumentCommand{\questiontablesetup}{m}
 {
  \keys_set:nn { tohiko/qt } { #1 }
 }

\NewDocumentCommand{\tohikoaddrow}{m}
 {
  \seq_gput_right:Nn \g_tohiko_qt_rows_seq { #1 }
 }

\seq_new:N \g_tohiko_qt_rows_seq
\seq_new:N \l__tohiko_qt_temp_seq
\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }

\keys_define:nn { tohiko/qt }
 {
  spec .tl_gset:N = \g_tohiko_qt_spec_tl,
  spec .initial:n = { cc },
  header .tl_gset:N = \g_tohiko_qt_header_tl
 }

\cs_new_protected:Nn \tohiko_qt_addrow:n
 {
  \seq_set_split:Nnx \l__tohiko_qt_temp_seq {} { \text_expand:n { #1 } }
  \iow_shipout:cx { @auxout } { \tohikoaddrow { \seq_use:Nn \l__tohiko_qt_temp_seq { & } } }
 }

\ExplSyntaxOff

\begin{document}

\questiontablesetup{header={Question & Points}}

\questiontable

\bigskip

\questiontablesetup{header={\multicolumn{1}{c}{Q} & P},spec={lc}}

\questiontable

\newcounter{question}
\newcounter{mark}

\setcounter{mark}{10} \setcounter{question}{1}
\addrow{{Question \thequestion}{\themark}}

\setcounter{mark}{20} \setcounter{question}{2}
\addrow{{Question \thequestion}{\themark}}

\setcounter{mark}{30} \setcounter{question}{3}
\addrow{{Question \thequestion}{\themark}}

\setcounter{mark}{30} \setcounter{question}{121}
\addrow{{\textbf{Q\'uestion} \thequestion}{\themark}}

\end{document}

我为最后一个案例添加了格式,以表明它得到了尊重。然而,实际用例可能会以不同的方式处理。

在此处输入图片描述

相关内容