在表格环境中 \\ 到底起什么作用?如何使用 obedlines 自动执行此操作?

在表格环境中 \\ 到底起什么作用?如何使用 obedlines 自动执行此操作?

我知道这\\是 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}

结果:

在此处输入图片描述

相关内容