xparse - 如果在序言中定义,\NewDocumentCommand 定义的行为会有所不同

xparse - 如果在序言中定义,\NewDocumentCommand 定义的行为会有所不同

我遇到了与定义点相关的包\NewDocumentCommand中的命令的一个非常奇怪的行为。以下代码有效:xparse

\documentclass{article}
\usepackage{xparse}

\begin{document}
\NewDocumentCommand{\Test}{m >{\SplitList {;}}r<>}{
 #1, #2
}
\Test{1}<123;32>
\end{document}

然而,如果我们将Test定义改为序言

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand{\Test}{m >{\SplitList {;}}r<>}{
 #1, #2
}    

\begin{document}
\Test{1}<123;32>
\end{document}

失败并出现以下错误

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!
! LaTeX error: "xparse/missing-required"
! 
! Failed to find required argument starting with '<' for command '\Test '.
! 
! See the LaTeX3 documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.44 \Test{1}<
              123;32>
|'''''''''''''''''''''''''''''''''''''''''''''''
| The current command '\Test ' expects an argument starting with '<'. LaTeX
| did not find it, and will insert a default value to be processed.
|...............................................

这看起来很奇怪,出乎意料。这是在https://www.overleaf.com

答案1

仅当加载西班牙语或加利西亚语模块时才会重现此问题babel

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage{xparse}

\NewDocumentCommand{\TestPreamble}{m >{\SplitList {;}}r<>}{#1, #2}

\begin{document}

\NewDocumentCommand{\TestDocument}{m >{\SplitList {;}}r<>}{#1, #2}

\TestPreamble{1}<123;32>

\TestDocument{1}<123;32>

\end{document}

我们得到

! LaTeX3 Error: Failed to find required argument starting with '<' for command
(LaTeX3)        '\TestPreamble '.

For immediate help type H <return>.
 ...                                              

l.11 \TestPreamble{1}<
                      123;32>

该命令\TestDocument运行正常。

这是由于<前后含义发生变化\begin{document}。定义个人命令时,应始终注意加载语言定义的简写。

通过使用es-noquoting禁用赋予的(现在相当无用的)含义的选项,可以解决这个特定问题<

\documentclass{article}
\usepackage[spanish,es-noquoting]{babel}
\usepackage{xparse}

\NewDocumentCommand{\TestPreamble}{m >{\SplitList {;}}r<>}{#1, #2}

\begin{document}

\NewDocumentCommand{\TestDocument}{m >{\SplitList {;}}r<>}{#1, #2}

\TestPreamble{1}<123;32>

\TestDocument{1}<123;32>

\end{document}

相关内容