我知道这\\
是 LaTeX 中非常繁重的命令,但它在tabular
环境中究竟起什么作用?
下列的我之前的问题,我重新定义了description
环境,实际上是作为表格单元格的简写:
\documentclass{article}
\usepackage{environ}
\newcommand{\itemwithoptarg}[1][]{#1 &}
\let\olditem\item% Capture current definition of \item
\newcommand{\restoreitem}{\global\let\item\olditem}
\RenewEnviron{description}{%
\gdef\item{\itemwithoptarg}% Global redefinition of \item
\global\let\BODY\BODY% Make \BODY global
\aftergroup\BODY% Print \BODY after description environment closes
\aftergroup\restoreitem% Restore original \item (if you use lists, for example)
}
\begin{document}
\begin{tabular}{ p{6em} l }
\begin{description}
\item[2019] An entry \\
\item[2021] A later entry \\
\end{description}
\end{tabular}
\end{document}
我用这个很多在我正在处理的文档中,条目很短,所以我认为\\
在每行末尾用代码删除 可能会很方便。这应该不太难吧?
不幸的是,我找不到确切的问题,但我找到了与此非常相似的解决方案,但它看起来像这样:
\documentclass{article}
\usepackage{environ}
\newcommand{\itemwithoptarg}[1][]{#1 &}
\let\olditem\item% Capture current definition of \item
\newcommand{\restoreitem}{\global\let\item\olditem}
\RenewEnviron{description}{%
\gdef\item{\itemwithoptarg}% Global redefinition of \item
\global\let\BODY\BODY% Make \BODY global
\aftergroup\BODY% Print \BODY after description environment closes
\aftergroup\restoreitem% Restore original \item (if you use lists, for example)
}
\begin{document}
\let\par=\cr
\obeylines
\begin{tabular}{ p{6em} l }
\begin{description}
\item[2019] An entry
\item[2021] A later entry
\end{description}
\end{tabular}
\end{document}
由于\obeylines
只是附加\par
到每一行,这只是重新定义\par
为表格的分隔符,然后调用\obeylines
。
但这不起作用——文档无法编译。然后我通过返回第一个 MWE 并将每个替换为 来测试这一点\\
。\cr
这失败了,并出现了类似的错误。我对 LaTeX 了解不够,无法确定,但我认为\obeylines
它工作正常,问题是我没有\par
正确地重新定义。
那么,\\
在表格环境中做什么呢(我应该重新定义\par
?我怎么会找到这个?我试过两者\meaning
,\show
但它们都给出了错误,而且我对 LaTeX 的内部原理不太了解。
答案1
正如评论中所提到的,有更简单、更强大的方法可以做到这一点。
但是,由于你可以控制开始时发生的事情\item
,你可以通过添加来使这种方法奏效\\
前一个项目,它将结束上一个表格行。这就像\gdef\item{\\\itemwithoptarg}
不需要\obeylines
或重新定义一样简单\par
。
使用此方法时,\\
最后一个条目后不会添加任何内容,但这在表格中实际上是可选的,因此这不是问题。但是,\\
第一个条目前也会添加一个,这会导致表格上方出现不必要的垂直空间。
为了解决这个问题,您可以创建一个将自身重新定义为 的命令\\
,并在 的开头使用此命令\item
。这意味着第一次调用该命令时,除了重新定义之外什么都不做,并且所有后续调用都会导致添加\\
。在环境结束时(在 的第三个可选参数中\RenewEnviron
),您可以重置下一个表的命令。
梅威瑟:
\documentclass{article}
\usepackage{environ}
\newcommand{\itemwithoptarg}[1][]{#1 &}
\let\olditem\item% Capture current definition of \item
\newcommand{\restoreitem}{\global\let\item\olditem}
\gdef\notfirst{\gdef\notfirst{\\}}
\RenewEnviron{description}{%
\gdef\item{\notfirst\itemwithoptarg}% Global redefinition of \item
\global\let\BODY\BODY% Make \BODY global
\aftergroup\BODY% Print \BODY after description environment closes
\aftergroup\restoreitem% Restore original \item (if you use lists, for example)
}[\gdef\notfirst{\gdef\notfirst{\\}}] % reset \notfirst for next table
\begin{document}
Before table
\begin{tabular}{p{6em}l}
\begin{description}
\item[2019] An entry
\item[2021] A later entry
\item[2022] A future entry
\end{description}
\end{tabular}
after table
\end{document}
结果: