在 xparse \NewDocumentEnvironment 中使用 longtable

在 xparse \NewDocumentEnvironment 中使用 longtable

我正在尝试为longtable环境创建一个包装器,它与标准\newenvironment命令配合得很好。现在我想使用包\NewDocumentEnvironment中的xparse选项来允许更多可选参数。但结果看起来不同,表格下方出现了一个额外的单元格。也许是由命令中的换行符引起的,因为当我将环境定义的结束代码块移动到起始代码块时\NewDocumentEnvironment没有出现错误(就像我在环境中的示例中所做的那样)。\end{longtable}myxparsetable2

我创建了一个最小示例。错误显示为myxparsetable1

\documentclass{scrartcl}
\usepackage{xparse}
\usepackage{longtable}

\NewDocumentEnvironment{myxparsetable1}{m}
{\begin{longtable}{#1}}
{\end{longtable}}

\NewDocumentEnvironment{myxparsetable2}{}
{%
  \begin{longtable}{|c|c|c|} \hline%
    col1 & col2 & col3 \\ \hline%
  \end{longtable}%
}
{}

\newenvironment{mytable}[1]
{\begin{longtable}{#1}}
{\end{longtable}}

\begin{document}

  Normal longtable:
  \begin{longtable}{|c|c|c|} \hline
    col1 & col2 & col3 \\ \hline
  \end{longtable}

  Custom mytable
  \begin{mytable}{|c|c|c|} \hline
      col1 & col2 & col3 \\ \hline
  \end{mytable}

  Custom myxparsetable1
  \begin{myxparsetable1}{|c|c|c|} \hline
      col1 & col2 & col3 \\ \hline
  \end{myxparsetable1}

  Custom myxparsetable2
  \begin{myxparsetable2}
  \end{myxparsetable2}

\end{document}

输出如下: 最小示例的输出

答案1

这是一个已知问题:使用 时, LaTeX 在处理 时内部使用的\NewDocumentEnvironment{foo}宏是“受保护的”,因此,LaTeX 无法知道对齐即将结束,直到它已经开始新的一行。\endfoo\end{foo}

\multicolumn这种情况与将not 作为单元格中的第一个项目的情况非常相似。

如果您想扫描多个参数\begin{foo},我可以提供一个解决方案:

\newenvironment{myxparsetable}{}{\end{longtable}}
\RenewDocumentCommand{\myxparsetable}{mO{}o}{%
  ...something with #2 and #3...
  \begin{longtable}{#1}
}

相关内容