如何在表内使用新环境?

如何在表内使用新环境?

如何定义用于表格(个别)行的格式?

示例:(对于每一行)第一列始终为粗体,第二列具有斜体“标题”和一些文本,可能还有其他内容(例如列表)。我想在每一行后添加一些额外的垂直空间。如下所示:

\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

相关内容