将单词列表转换为表格

将单词列表转换为表格

我想转换如下术语列表:A、B、C、D、E、F

到如下表格:

| 一 | 乙 | 丙 |

| D | E | F |

或者

|一 |蘇格蘭 | E |

| B | D | F |

但不必每次都重写我的表格,因为对于大表格来说插入项目或移动/删除一些项目确实很困难。

是否存在可以帮助实现这一目标的软件包?

编辑:

通过混合使用您提供的所有内容,这里是一个有对齐问题的版本 - 没有中心块,垂直版本会稍微向右移动,但这旨在在我的文档中居中 - 有了中心块,水平版本就不居中了。

然而这里是:

\documentclass{book}
\RequirePackage{etoolbox}%

\newcounter{argcolumns}
\newcounter{argtargetcolumns}

\newcommand{\mylisttable}[3][h]{
  \setcounter{argcolumns}{0}
  \setcounter{argtargetcolumns}{#2}
  \def\mytable{}
  \def\mylist{}
  \forcsvlist{\listadd\mylist}{#3}

  \def\parser ##1{%
    \ifnumequal{\value{argcolumns}}{\value{argtargetcolumns}-1}{%
      \setcounter{argcolumns}{0}%
      \expandafter\def\expandafter\mytable\expandafter{%
        \mytable ##1 \cr%
      }%
    }{%
      \stepcounter{argcolumns}%
      \expandafter\def\expandafter\mytable\expandafter{%
        \mytable ##1 & %
      }%
    }%
  }%

  \forlistloop{\parser}{\mylist}%
  \begin{center}
    \ifx #1v \expandafter\valign\else\expandafter\halign\fi{& \hbox spread 0.1em{\hfil\strut##\hfil}\crcr
      \mytable%
      \whileboolexpr{%
        not (test {\ifnumequal{\value{argcolumns}}{0}}) and %
        test {\ifnumless{\value{argcolumns}}{\value{argtargetcolumns}-1}}
      }%
      {%
        & \stepcounter{argcolumns}%
      }\setcounter{argcolumns}{0}\cr
    }
  \end{center}
}

\begin{document}

\mylisttable[h]{4}{aaaaaaaaa,b,caaaa,daaaaaaaaaaaa,e,faaaaaaaaaa,g,h}
\mylisttable[h]{2}{a,b,c,d,e,f,g,h}
\mylisttable[v]{2}{a,b,c,d,e,f,g,h}
\mylisttable[v]{2}{a,b,c,d,e,f,g,h}
\mylisttable[h]{2}{a,b,c,d,e,f,g,h}
\end{document}

答案1

要做到这一点,您可以轻松使用etoolbox及其列表处理工具来完成。

例如,就你的情况而言,我会这样做:

编辑 :这是第一个解决方案。请查看最终解决方案,它可能更好。

\RequirePackage{etoolbox}%

\newtoggle{firstarg}%
\newtoggle{secondarg}%
\togglefalse{firstarg}%
\togglefalse{secondarg}%

\def\mycsvlist{A,B,C,D,E,F}%
\def\mylist{}%
\def\mytable{}%
%
\expandafter\forcsvlist\expandafter{%
  \expandafter\listadd\expandafter\mylist\expandafter}%
  \expandafter{\mycsvlist}
%
\def\parser #1{%
  \iftoggle{firstarg}%
  {%
    \iftoggle{secondarg}%
      {%
        \expandafter\def\expandafter\mytable\expandafter{%
          \mytable #1 \tabularnewline\hline%
        }%
        \togglefalse{firstarg}%
        \togglefalse{secondarg}%
      }{%
        \expandafter\def\expandafter\mytable\expandafter{%
          \mytable #1 & %
        }%
        \toggletrue{secondarg}%
      }%
    }{%
    \expandafter\def\expandafter\mytable\expandafter{%
      \mytable #1 & %
    }%
    \toggletrue{firstarg}%
  }%
}%
\forlistloop{\parser}{\mylist}%

好的,根据 @Bjonnh 关于将其扩展到 3 以外的其他列数的问题,我改进了我的解决方案,这就是我的想法:

\documentclass[10pt,a4paper,titlepage,twoside,onecolumn]{report}
\makeatletter

\RequirePackage{etoolbox}%

\newcounter{argcolumns}
\newcounter{argtargetcolumns}
\setcounter{argtargetcolumns}{4}

\def\mycsvlist{A,B,C,D,E,F}%
\def\mylist{}
\def\mytable{}

\expandafter\forcsvlist\expandafter{%
  \expandafter\listadd\expandafter\mylist\expandafter}%
  \expandafter{\mycsvlist}

\def\parser #1{%
  \ifnumequal{\value{argcolumns}}{\value{argtargetcolumns}-1}{%
    \setcounter{argcolumns}{0}%
    \expandafter\def\expandafter\mytable\expandafter{%
      \mytable #1 \tabularnewline\hline%
    }%
  }{%
    \stepcounter{argcolumns}%
    \expandafter\def\expandafter\mytable\expandafter{%
      \mytable #1 & %
    }%
  }%
}%

\forlistloop{\parser}{\mylist}%

\makeatother

\begin{document}
      \begin{tabular}{|c|c|c|c|}%
    \hline%
    \mytable%
    \whileboolexpr{%
      not (test {\ifnumequal{\value{argcolumns}}{0}}) and %
      test {\ifnumless{\value{argcolumns}}{\value{argtargetcolumns}-1}}
    }%
    {%
      & \stepcounter{argcolumns}%
    }\setcounter{argcolumns}{0}\tabularnewline%
    \hline%
  \end{tabular}
\end{document}

如果您想更改列数,您只需将值更改为argtargetcolumns您想要的列数(显然也是表中的列数)。

我还在表中添加了代码,以便您自动用空单元格填充最后一行。

但是,如果您希望手动执行此操作(或继续用其他内容填充表格),那么您实际上只需要\mytable在您的tabular环境中执行此操作。

答案2

memoir 类提供\autorows\autocols宏,它们接受以逗号分隔的项目列表(例如单词),并以行或列顺序的表格形式显示它们。可以指定列数和条目在列中的位置(左、中、右)。

答案3

值得深思的是:

\halign{& \hbox spread 1em{\hfil\strut#\hfil}\crcr
  A & B & C \cr
  D & E & F \cr
}
\bye

在此处输入图片描述

并更改\halign\valign(实际上,只是将更改为hv无需进行其他更改):

在此处输入图片描述

相关内容