为什么可以\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}