我正在尝试创建一个带有参数的新环境,将内容放入这样的多列中
\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
(并且每列两侧都有这样的空间)。