比较

比较

在使用 LaTeX3 的可选环境参数时不能跳过行是故意的吗xparse

看来您可以跳过带有强制参数的行。

比较

\documentclass{article}
\usepackage{fontspec}
\usepackage{xparse}

\NewDocumentEnvironment{mandatory}{ m m m }
{\section{Mandatory}}
{#1\par #2\par #3}


\NewDocumentEnvironment{optional}{ O{first} O{second} O{third} }
{\section{Optional}}
{#1\par #2\par #3}

\begin{document}

\begin{mandatory}
{FIRST}
{SECOND}
{THIRD}
\end{mandatory}

\begin{optional} %<- Here is the problem child.
[FIRST]
[SECOND]
[THIRD]
\end{optional}

\begin{optional}[FIRST][SECOND][THIRD]
\end{optional}

\end{document}

输出

在此处输入图片描述

答案1

这是有意为之,但据我所知,有关此问题仍有讨论。

这个问题几年前就出现了amsmath,当时

\begin{align}
a &= b \\
[c] &= d
\end{align}

被考虑。使用默认的 LaTeX 设置,这会触发错误 ( Missing number, treated as zero),因为\\在查找其可选参数时会忽略空格。因此,的开发人员amsmath决定使用\@ifnextchar不需要在\\和其可选参数之间插入空格的不同版本。

在 中也使用了类似的方法xparse,但据我所知,仅适用于环境。因此

\documentclass{article}
\usepackage{xparse}

\NewDocumentEnvironment{foo}{O{x}O{y}}
  {START:#1#2}
  {END}
\NewDocumentCommand{\?}{O{x}O{y}m}{#1#2#3}

\begin{document}

\begin{foo}[A][B]
C
\end{foo}

\begin{foo}
[A]
[B]
C
\end{foo}

\?
[A]
[B]
{C}

\end{document}

只有在第二次环境调用时才会产生错误的输出foo,其中

开始:xy [A] [B] C 结束

将被打印。

答案2

解决方法(而不是建议)是

\makeatletter
\NewDocumentEnvironment{optional}
  { O{first} t\@sptoken O{second} t\@sptoken O{third} }
  {\section{Optional}}
  {#1\par #3\par #5}
\makeatother

相关内容