循环使表格为空

循环使表格为空

首先,我看到过几篇类似的帖子,这就是我所得到的结果:

循环和字符 &

在表格环境中使用循环的问题

我也非常确信这可以用 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}

相关内容