我正在尝试通过迭代预定义数据来填充表格,并使用如下代码在&
(下一列)和(下一行)中遇到错误:\\
\begin{document}
% \foreach \s in \schedule {
% \textbf{\GetListMember{\s}{1}:} \GetListMember{\s}{2} \\
% }
\begin{tabular}{ll}
\foreach \s in \schedule {
\textbf{\GetListMember{\s}{1}} & \GetListMember{\s}{2} \\
}
\end{tabular}
\end{document}
完整示例:
\documentclass[12pt, a4paper]{article}%
\usepackage[T1]{fontenc}%
\usepackage[utf8]{inputenc}%
\usepackage{pgffor}%
\usepackage{xstring}%
%
%\tracingall%
%
\setlength{\parindent}{0in}%
%
\newcommand*{\GetListMember}[2]{%
\edef\dotheloop{%
\noexpand\foreach \noexpand\a [count=\noexpand\i] in {#1} {%
\noexpand\IfEq{\noexpand\i}{#2}{\noexpand\a\noexpand\breakforeach}{}%
}}%
\dotheloop%
}%
%
\edef\schedule {%
%{{Title},{Description}},%
{{Ipsum},{Pellentesque mauris mauris, feugiat ut.}},%
{{Lorem},{Integer viverra blandit magna, in imperdiet sapien sollicitudin at.}},%
{{Presen},{Nunc eu euismod nunc. Sed tincidunt, sem eu facilisis rhoncus.}},%
{{Magna},{Phasellus velit dui, tristique at sem et, finibus volutpat sapien.}},%
{{Vide},{Fusce in sapien mi. Vestibulum sed venenatis risus. Ut turpis dui.}},%
{{Albi},{Proin dolor mauris, pellentes sem convallis. Suspendisse elementum.}},%
{{Cosco},{Integer in molestie diam. Donec sapien, porta lacinia gravida ac.}}%
}%
\begin{document}
% \foreach \s in \schedule {
% \textbf{\GetListMember{\s}{1}:} \GetListMember{\s}{2} \\
% }
\begin{tabular}{ll}
\foreach \s in \schedule {
\textbf{\GetListMember{\s}{1}} & \GetListMember{\s}{2} \\
}
\end{tabular}
\end{document}
pdflatex
状态:
! Extra }, or forgotten \endgroup.
<template> \unskip \hfil }
\hskip \tabcolsep \endtemplate
l.36 }
不幸的是,跟踪构建过程\tracingall
会无休止地运行,而且我不熟悉宏。构建成功,文档如下:
\begin{document}
% \foreach \s in \schedule {
% \textbf{\GetListMember{\s}{1}:} \GetListMember{\s}{2} \\
% }
\begin{tabular}{l}
\foreach \s in \schedule {
\textbf{\GetListMember{\s}{1}} \GetListMember{\s}{2}
}
\end{tabular}
\end{document}
和:
\begin{document}
\foreach \s in \schedule {
\textbf{\GetListMember{\s}{1}:} \GetListMember{\s}{2} \\
}
% \begin{tabular}{ll}
% \foreach \s in \schedule {
% \textbf{\GetListMember{\s}{1}} & \GetListMember{\s}{2} \\
% }
% \end{tabular}
\end{document}
您可以在这里找到有关以下问题的讨论GetListMember
:访问列表特定成员的宏
我对每个能够通过迭代和访问二维数据来构建表的解决方案都很满意。
答案1
\foreach
不能跨越表格单元格。
有一种更简单的方法来完成这项任务,即使用expl3
。
我定义了一个\listloop
命令,该命令以列表名称和对每个列表项执行的操作的模板作为参数。
在这种情况下,列表中的每个项目都由一对括号项目组成,因此我们可以定义
\makerow
要执行的操作\textbf{#1} & #2 \\
,并且模板将是
\makerow#1
这样我们就可以准确地将两个参数传递给\makerow
。模板中的#1
代表正在处理的当前列表项。
另一个类似的例子是建立描述列表。
诀窍在于\clist_map_function:cN
将结果一起传递;该作业在第一个单元格中完成(在这种tabular
情况下,但随后&
将\\
构建单元格。\__walfi_list_loop:n
每次调用时都会重新定义一个临时函数。
\documentclass[12pt, a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newlist}{mm}
{
\clist_clear_new:c { l_walfi_list_#1_clist }
\clist_set:cn { l_walfi_list_#1_clist } { #2 }
}
\NewDocumentCommand{\looplist}{mm}
{
\cs_gset:Nn \__walfi_list_loop:n { #2 }
\clist_map_function:cN { l_walfi_list_#1_clist } \__walfi_list_loop:n
}
\ExplSyntaxOff
\newlist{schedule}{
%{Title}{Description},
{Ipsum}{Pellentesque mauris mauris, feugiat ut.},
{Lorem}{Integer viverra blandit magna, in imperdiet sapien sollicitudin at.},
{Presen}{Nunc eu euismod nunc. Sed tincidunt, sem eu facilisis rhoncus.},
{Magna}{Phasellus velit dui, tristique at sem et, finibus volutpat sapien.},
{Vide}{Fusce in sapien mi. Vestibulum sed venenatis risus. Ut turpis dui.},
{Albi}{Proin dolor mauris, pellentes sem convallis. Suspendisse elementum.},
{Cosco}{Integer in molestie diam. Donec sapien, porta lacinia gravida ac.}
}
\newcommand{\makerow}[2]{\textbf{#1} & #2 \\}
\newcommand{\makeitem}[2]{\item[#1] #2}
\begin{document}
\begin{tabular}{lp{8cm}}
\looplist{schedule}{\makerow#1}
\end{tabular}
\begin{description}
\looplist{schedule}{\makeitem#1}
\end{description}
\end{document}