我想创建一个表格,该表格填充整个文档,但显示在开头。类似于
\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}
我为最后一个案例添加了格式,以表明它得到了尊重。然而,实际用例可能会以不同的方式处理。