如何定义用于表格(个别)行的格式?
示例:(对于每一行)第一列始终为粗体,第二列具有斜体“标题”和一些文本,可能还有其他内容(例如列表)。我想在每一行后添加一些额外的垂直空间。如下所示:
\documentclass[a4paper, 10pt]{scrartcl}
\begin{document}
\begin{tabular*}{\textwidth}{p{0.4\textwidth}@{}p{0.6\textwidth}@{}}
\textbf{1st column entry, row 1} & \textit{2nd column title} -- 2nd column entry, row 1
\begin{itemize}
\item{some list}
\item{items here}
\end{itemize} \\
\multicolumn{2}{c}{\vspace{2.0em}} \\
\textbf{1st column entry, row 2} & \textit{2nd column title} -- 2nd column entry, row 2
\newline (maybe only a note here) \\
\multicolumn{2}{c}{\vspace{2.0em}} \\
\end{tabular*}
\end{document}
对于包含大量表格的大型文档,编写所有这些格式化命令非常繁琐。我想要做的是定义一个\newenvironment
,以便表格的每一行都可以像这样输入
\begin{TableRow}{1st column entry}{2nd column title}{2nd column entry}
%more stuff here, like, e.g., a list:
\begin{itemize}
\item{some}
\item{items}
\end{itemize}
\end{TableRow}
注意我想仅针对行的文本定义布局。这样我就可以在每个 2 列表格中使用该环境,而不管列宽如何。
这是我迄今为止无效的尝试:
\documentclass[a4paper, 10pt]{scrartcl}
\newenvironment{TableRow}[3]
{
\textbf{#1} & \textit{#2} -- #3
}
{
\\
\multicolumn{2}{c}{\vspace{2.0em}} \\
}
\begin{document}
\begin{tabular*}{\textwidth}{p{0.4\textwidth}@{}p{0.6\textwidth}@{}}
\begin{TableRow}{1st column entry, row 1}{2nd column title}{2nd column entry, row 1}
\begin{itemize}
\item{some}
\item{items}
\end{itemize} \\
\end{TableRow}
\begin{TableRow}{1st column entry, row 2}{2nd column title}{2nd column entry, row 2}
\newline (maybe only a note here) \\
\end{TableRow}
\end{tabular*}
\end{document}
在我的最小示例中,有 24 个错误,其中第一个是“!Extra } 或忘记了 \endgroup”。
(我怀疑我的\newenvironment
定义的第二个块也有错误(“\\”?)但是当我将第二个块留空时,也会出现此错误。)
答案1
您不能拥有一个跨越两个表格单元格的正常环境,因为您需要\begin{env}
在一个单元格中和\end{env}
另一个单元格中,并且单元格会形成组。
你可以用诡计做你想做的environ
事\aftergroup
:
\documentclass[a4paper, 10pt]{scrartcl}
\usepackage{environ}
\NewEnviron{TableRow}[3]{%
\toks0=\expandafter{\BODY}%
\toks2={\textbf{#1} & \textit{#2} -- #3}%
\xdef\TableRowContents{\the\toks2 \the\toks0 }%
\aftergroup\TableRowContents
}
\begin{document}
\noindent
\begin{tabular}{@{}p{0.4\textwidth}@{}p{0.6\textwidth}@{}}
\begin{TableRow}{1st column entry, row 1}{2nd column title}{2nd column entry, row 1}
\begin{itemize}
\item{some list}
\item{items here}
\end{itemize}
\end{TableRow}
\\[3ex]
\begin{TableRow}{1st column entry, row 2}{2nd column title}{2nd column entry, row 2}
\newline (maybe only a note here)
\end{TableRow}
\end{tabular}
\end{document}
请注意,这\multicolumn{2}{c}{\vspace{2em}}\\
是在行之间添加垂直空间的错误方法:\\[<dimen>]
才是正确的方法。
而且似乎tabular*
没有必要,因为无论如何你都要填充文本宽度。
TableRow
通过 定义的环境抓取\NewEnviron
内容,然后在由 启动的隐式组\begin{TableRow}
结束后传递的宏中构建表行,使用\aftergroup
。