\NewDocumentEnvironment 无法正常工作

\NewDocumentEnvironment 无法正常工作

为什么可以\newenvironment工作,但相同的代码却不起作用\NewDocumentEnvironment

\documentclass{scrlttr2}

\usepackage[scaled]{helvet}
\renewcommand\familydefault{\sfdefault}

\RequirePackage{booktabs}
\RequirePackage{tabularx}

\newenvironment{invoice}
%\NewDocumentEnvironment{invoice}{}
    {\par\noindent%
     \tabularx{\textwidth}{cXrr}
     \toprule[0.7pt]\textbf{Pos.} & \textbf{Beschreibung} & \textbf{Gesamtpreis} \\ 
     \toprule[0.7pt]}
    {\midrule[0.7pt]
        && \textbf{Rechnungsbetrag} & \textbf{1234} \\ \cmidrule[0.7pt]{3-4} \\ \endtabularx}

\NewDocumentCommand{\invoiceitem}{mmm}
    {#1 & #2 && #3 \\}
    
\begin{document}
    
    \begin{invoice}
        \invoiceitem{1}{Eins}{23}
    \end{invoice}

\end{document}

答案1

问题在于\NewDocumentEnvironment和的相互作用tabularx,因为后者需要先吸收环境的全部内容才能采取行动。

在这种情况下,周围的环境也必须这样做。

align在、gather以及类似的环境中也会发生这种情况amsmath

因此解决方案是使用b(或者+b如果您想允许空行)参数说明符。

\documentclass{scrlttr2}

\usepackage[scaled]{helvet}
\renewcommand\familydefault{\sfdefault}

\RequirePackage{booktabs}
\RequirePackage{tabularx}

\NewDocumentEnvironment {invoice} { +b }
{%
  \noindent%
  \begin{tabularx}{\textwidth}{cXrr}
    \toprule[0.7pt]
    \textbf{Pos.} & \textbf{Beschreibung} &  & \textbf{Gesamtpreis} \\ 
    \toprule[0.7pt]
      #1
    \midrule[0.7pt]
      & & \textbf{Rechnungsbetrag} & \textbf{1234} \\ 
    \cmidrule[0.7pt]{3-4} \\ 
  \end{tabularx}
}{}

\NewDocumentCommand {\invoiceitem} { mmm }
  {#1 & #2 & & #3 \\}
    
\begin{document}
    
    \begin{invoice}
        \invoiceitem{1}{Eins}{23}
    \end{invoice}

\end{document}

相关内容