我想转换如下术语列表: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
(实际上,只是将更改为h
,v
无需进行其他更改):