在使用 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