将多个逗号分隔的列表转换为一个表格,每个列表一列

将多个逗号分隔的列表转换为一个表格,每个列表一列

我一直在这里搜索有关逗号分隔列表的信息,但我找到的唯一信息是如何对单个列表进行排序或迭代,这并不是我所需要的。如果我找不到相关问题,请随时链接到它并关闭它。

我所追求的是一种将几个逗号分隔的列表合并到单个表格类型的表中的方法,以生成考试多项选择题部分的几种形式的答案。

因此,我会得到类似以下内容的内容:

\begin{document}
\magicFunction{ 
    {A, b, b, a, a, b, b, c}% Test Form A, form is first entry.
    }{
    {B, a, b, c, c, e, a, a}% Test form B
    }{
    {C, c, c, c, a, a, b, c}% Test form C
    }
\end{document}

我想将其扩展为以下内容:

\begin{document}
\begin{tabular}{cccc}
\textbf{Problem Number} & \textbf{Form A} & \textbf{Form B} & \textbf{Form C} \\\hline\hline
1  & b & a & c \\
2  & b & b & c\\\hline
3  & a & c & c \\
4  & a & c & a \\\hline
5  & b & e & a \\
6  & b & a & b \\\hline
7  & c & a & c \\
\end{tabular}
\end{document}

标题信息并不难编写,特别是因为我不介意为每种表格数量设置不同的函数(即“2 表格”函数 vs“3 表格” vs“4 表格”;4 是最多的)。我遇到的问题是弄清楚如何将正确的答案表格放在正确的位置。如果它被转置,这样我就可以注入整行,我可以&在列表中写入符号,而不是使用逗号分隔的列表,但出于排版原因,最好垂直列出答案,因为大多数考试更像是 12-30 多项选择题。此外,我希望magicFunction长度独立......这意味着每个表格都有相同数量的答案(因此表格总是满的),但任何给定的测试可能都有不同数量的答案,因此不能硬编码。我可以将答案数量作为参数传递给函数,但我不知道如何同时迭代多个逗号分隔的列表,而不是连接该过程。

任何帮助都将不胜感激。我不介意使用 LaTeX3,我认为这是最简洁的方法,但我在尝试解析 LaTeX3 中的所有语法和命名方案时仍然笨拙而笨拙,因此当我自己尝试使用它并出现错误时,我无法弄清楚错误实际上是由什么引起的。

谢谢!

答案1

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\magicFunction}{m}
 {
  \jason_magic:n { #1 }
 }

\int_new:N \l__jason_magic_cols_int
\int_new:N \l__jason_magic_rows_int
\tl_new:N \l__jason_magic_table_tl

\cs_new_protected:Nn \jason_magic:n
 {
  \int_zero:N \l__jason_magic_cols_int
  \int_zero:N \l__jason_magic_rows_int
  \tl_map_inline:nn { #1 }
   {
    \int_incr:N \l__jason_magic_cols_int
    \__jason_magic_makeclist:n { ##1 }
   }
  \__jason_magic_maketable:
  % print the table
  \begin{tabular}{ c *{\l__jason_magic_cols_int}{c} }
  \l__jason_magic_table_tl
  \end{tabular}
 }

% syntactic sugar for avoiding long strings
\cs_new:Nn \__jason_magic_clist:n
 {
  l__jason_magic_ \int_eval:n { #1 } _clist
 }

% store the parts in clists and get the number of rows
\cs_new_protected:Nn \__jason_magic_makeclist:n
 {
  \clist_clear_new:c { \__jason_magic_clist:n { \l__jason_magic_cols_int } }
  \clist_set:cn { \__jason_magic_clist:n { \l__jason_magic_cols_int } } { #1 }
  \int_set:Nn \l__jason_magic_rows_int
   {
    \int_max:nn
     { \l__jason_magic_rows_int }
     { \clist_count:c { \__jason_magic_clist:n { \l__jason_magic_cols_int } } }
   }
 }

\cs_new_protected:Nn \__jason_magic_maketable:
 {
  % make the first row
  \tl_set:Nn \l__jason_magic_table_tl { Problem~number }
  \int_step_inline:nn { \l__jason_magic_cols_int }
   {
    \tl_put_right:Nx \l__jason_magic_table_tl
     {
      & Form~\int_to_Alph:n { ##1 }
     }
   }
  \tl_put_right:Nn \l__jason_magic_table_tl { \\ \hline }
  % make the following rows
  \int_step_inline:nn { \l__jason_magic_rows_int }
   {
    \tl_put_right:Nx \l__jason_magic_table_tl { ##1 }
    \int_step_inline:nn { \l__jason_magic_cols_int }
     {
      \tl_put_right:Nx \l__jason_magic_table_tl
       {
        & \clist_item:cn { \__jason_magic_clist:n { ####1 } } { ##1 }
       }
     }
    \tl_put_right:Nn \l__jason_magic_table_tl { \\ }
    \int_if_odd:nF { ##1 } { \tl_put_right:Nn \l__jason_magic_table_tl { \hline } }
   }
 }

\ExplSyntaxOff

\begin{document}

\magicFunction{ 
    {b, b, a, a, b, b, c}% Test Form A, form is first entry.
    {a, b, c, c, e, a, a}% Test form B
    {c, c, c, a, a, b, c}% Test form C
}

\end{document}

在此处输入图片描述

其思路是为每一列分配一个列表。然后通过逐行索引从每个列表中提取相关项来构建表格。

答案2

这不是完整的答案,但值得你思考。该memoir课程提供了它所称的内容自动制表\autorows其中输入基本上由以行排序 ( ) 方式或列排序 ( \autocols) 方式制表的条目逗号分隔列表组成。

例如:

\documentclass{memoir}
\begin{document}
\autorows{c}{3}{l}{one, two, three, four, five, six, seven}
\end{document}

将产生一个表格(抱歉,我是 GOM,尚未上传图形)

one   two  three
four  five six
seven

参见第 11.8.2 节自动制表 请参阅手册以了解更多信息(> texdoc memoir)。

相关内容