包含多列内容的新环境

包含多列内容的新环境

我正在尝试创建一个带有参数的新环境,将内容放入这样的多列中

\begin{tabular}{p{5em} p{\textwidth-3\columnsep -5em}}\\[-0.5em]
\toprule \addlinespace[1.4ex]
\textbf{NFR-1} & \textbf{Extensibility} \hfill \textbf{P1} \\ \addlinespace
\midrule[\heavyrulewidth] \addlinespace[1.4ex] 
\multicolumn{2}{p{\textwidth-2\columnsep}}{Description text} \\ \addlinespace
\midrule \addlinespace
\end{tabular}\\[1em]

变成 正确的表

当我设置新的环境,如在这个 MWE 中

\documentclass{article}
\usepackage{booktabs,calc}
\usepackage{hyperref}

\newenvironment{card}[4]{
\hypertarget{#1:#2}{}
\vspace{0.75ex}
\centering
\setlength{\defaultaddspace}{1.2ex}
\begin{tabular}{p{5em} p{\textwidth-3\columnsep -5em}}\\[-0.5em]
\toprule \addlinespace[1.4ex]
\textbf{#1-#2} & \textbf{#3} \hfill \textbf{#4} \\ \addlinespace
\midrule[\heavyrulewidth] \addlinespace[1.4ex] 
\multicolumn{2}{p{\textwidth-2\columnsep}}
}{
\\ \addlinespace
\midrule \addlinespace
\end{tabular}\\ [1em]
}

\begin{document}
\begin{card}{NFR}{1}{Extensibility}{P1}
Description text.
\end{card}
\end{document}

看起来很奇怪: 在此处输入图片描述

我认为它不喜欢多列命令的拆分。我已经尝试过了\bgroup\egroup但只会产生错误。

在这种情况下该怎么办?

答案1

像这样吗?

有趣的表格

environ提供了一种定义新环境的方法,这样您就可以处理环境的全部内容,这些内容在宏中捕获。默认情况下,内容存储在 中\BODY,但您可以根据需要对其进行自定义以避免冲突(请参阅手册,其中prooftrees.sty包含如何执行此操作以避免与forest.sty的使用发生冲突的示例\BODY)。

\documentclass{article}
\usepackage{booktabs,environ,calc}
\usepackage{hyperref}

\NewEnviron{card}[4]{%
  \hypertarget{#1:#2}{}%
  \vspace{0.75ex}%
  \centering
  \setlength{\defaultaddspace}{1.2ex}%
  \begin{tabular}{p{5em} p{\textwidth-3\tabcolsep-5em}}\\[-0.5em]
    \toprule \addlinespace[1.4ex]
    \textbf{#1-#2} & \textbf{#3} \hfill \textbf{#4} \\ \addlinespace
    \midrule[\heavyrulewidth] \addlinespace[1.4ex]
    \multicolumn{2}{p{\textwidth-2\columnsep}}{\BODY} \\ \addlinespace
    \midrule \addlinespace
  \end{tabular}%
  \vspace{1em}% you can't use \\ here and should never use it outside tabular etc. anyhow
}

\begin{document}
\noindent
\begin{card}{NFR}{1}{Extensibility}{P1}
  Description text.
\end{card}
\end{document}

答案2

您需要一个单列表格:

\documentclass{article}
\usepackage{booktabs,calc}
\usepackage{hyperref}
\usepackage{lipsum}

\newenvironment{card}[4]{%
  \par\hypertarget{#1:#2}{}\vspace{0.75ex}
  \centering
  \setlength{\defaultaddspace}{1.2ex}
  \begin{tabular}{p{\textwidth-2\tabcolsep}}\\[-0.5em]
  \toprule
  \addlinespace[1.4ex]
  \makebox[5em][l]{\textbf{#1-#2}}\hspace{2\tabcolsep}\textbf{#3}\hfill\textbf{#4}\\
  \addlinespace
  \midrule[\heavyrulewidth] \addlinespace[1.4ex] 
}{%
  \\ \addlinespace
  \midrule \addlinespace
  \end{tabular}
  \par\vspace{1em}
}

\begin{document}

\lipsum[2]

\begin{card}{NFR}{1}{Extensibility}{P1}
Description text.
\end{card}

\lipsum[3]

\end{document}

然而,间距似乎不遵循任何特定规则。

请注意,列间距的参数不是\columnsep,而是\tabcolsep(并且每列两侧都有这样的空间)。

在此处输入图片描述

相关内容