首先,我看到过几篇类似的帖子,这就是我所得到的结果:
我也非常确信这可以用 edef 来完成,但我认为不用 edef 也可以做到。
我正在使用 collection.sty;相关部分在这里:
\newcommand*{\collectionnew}[1]{%
\newcounter{collection@#1@count}}
\newcommand*{\collectionadd}[3][]{%
\expandafter\def\csnamecollection@#2@item\roman{collection@#2@count}\endcsname{#3}%
\if\relax\noexpand#1\relax% if #1 is empty
\else\expandafter\def\csnamecollection@#2@key\roman{collection@#2@count}\endcsname{#1}\fi%
\stepcounter{collection@#2@count}}
\newcommand*{\collectiongetitem}[2]{%
\csname collection@#1@item\romannumeral #2\endcsname}
\newcommand*{\collectiongetkey}[2]{%
\csname collection@#1@key\romannumeral #2\endcsname}
\newcounter{collection@iterator}
\newcommand*{\collectionloop}[2]{%
\setcounter{collection@iterator}{0}%
\loop\ifnum\value{collection@iterator}<\value{collection@#1@count}%
\def\collectionloopid{\arabic{collection@iterator}}%
\def\collectionloopitem{\collectiongetitem{#1}{\collectionloopid}}%
\def\collectionloopkey{\collectiongetkey{#1}{\collectionloopid}}%
#2%
\stepcounter{collection@iterator}%
\repeat}
完整文件位于https://github.com/glittershark/resume/blob/master/collection.sty
我正在尝试获取一个集合(在 collectionloop 项目中使用列分隔符并制作一个表格
\documentclass{article}
\usepackage{collection}
\collectionnew{sEvents}
\collectionadd[A]{sEvents}{B&C}
\collectionadd[X]{sEvents}{Y&Z}
\def\schedulelines{}%
\collectionloop{sEvents}{%
\expandafter\def\expandafter\schedulelines\expandafter{\schedulelines \collectionloopkey}
\expandafter\def\expandafter\schedulelines\expandafter{\schedulelines & }
\expandafter\def\expandafter\schedulelines\expandafter{\schedulelines \collectionloopitem}
\expandafter\def\expandafter\schedulelines\expandafter{\schedulelines \\ \hline }
}
\begin{document}
\begin{tabular}{|l|c|l|}
\hline\textbf{col1}&\textbf{col2}&\textbf{col3}\\
\hline
\schedulelines
\end{tabular}
\end{document}
我应该得到一个 3x3 的表格,每个单元格都被框起来,其中第 2 行是 ABC,第 3 行是 XY Z。但我得到的是一个 3x3 表格,其中第二行和第三行是空的,并且缺少右边框。
我也尝试过在循环内的 \collectionadd 和 \expandafter 中用命令 \def\TAB{&} 替换 & 来隐藏它,但是据我所知这并没有改变任何内容。
答案1
不确定我是否会使用未记录的软件包。我相信有更好的方法。
\documentclass{article}
\usepackage{collection}
\collectionnew{sEvents}
\collectionadd[A]{sEvents}{B&C}
\collectionadd[X]{sEvents}{Y&Z}
\def\schedulelines{}%
\collectionloop{sEvents}{%
\edef\schedulelines{%
\unexpanded\expandafter{\schedulelines}%
\romannumeral-`Q\collectionloopkey
&%
\romannumeral-`Q\collectionloopitem
\unexpanded{\\ \hline}%
}%
}
\begin{document}
\begin{tabular}{|l|c|l|}
\hline\textbf{col1}&\textbf{col2}&\textbf{col3}\\
\hline
\schedulelines
\end{tabular}
\end{document}
一种不同的实现,可以避免大多数扩展问题。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definecollection}{m}
{
\prop_new:c { l_thomak_collection_#1_prop }
}
\NewDocumentCommand{\addtocollection}{mmm}
{
\prop_put:cnn { l_thomak_collection_#1_prop } { #2 } { #3 }
}
\NewDocumentCommand{\loopcollection}{mm}
{
\cs_set:Nn \__thomak_collection_do:nn { #2 }
\prop_map_function:cN { l_thomak_collection_#1_prop } \__thomak_collection_do:nn
}
\NewDocumentCommand{\clearcontainer}{m}
{
\tl_clear_new:N #1
}
\NewDocumentCommand{\appendto}{mm}
{
\tl_put_right:Nn #1 { #2 }
}
\ExplSyntaxOff
\definecollection{sEvents}
\addtocollection{sEvents}{A}{B&C}
\addtocollection{sEvents}{X}{Y&Z}
\clearcontainer{\schedulelines}
% #1 and #2 substitute \collectionloopkey and \collectionloopitem
\loopcollection{sEvents}{\appendto\schedulelines{#1 & #2 \\ \hline}}
\begin{document}
\begin{tabular}{|l|c|l|}
\hline
\textbf{col1}&\textbf{col2}&\textbf{col3}\\
\hline
\schedulelines
\end{tabular}
\end{document}