xparse
允许使用条件标记插入到宏的参数文本中t<token>
(来自文档:
t
可选的,如果存在则<token>
返回一个值,否则返回一个值。给定为。\BooleanTrue
<token>
\BooleanFalse
t<token>
但是,为什么以下两种实现方式(一种使用 (La)TeX,另一种使用 LaTeX3)不会产生相同的结果?
\documentclass{article}
\usepackage{amsmath,xparse}
\begin{document}
% LaTeX implementation
\makeatletter
\newcommand{\mycommand}[1]{%
\begin{alignat}{1} #1\null \end{alignat}%
}%
\newcommand{\command}[1]{\text{#1} \@ifnextchar\null{}{\\}}%
\makeatother
Some text before.
\mycommand{
\command{Hello}
\command{Hello two}
\command{Hello three}
}%
Some text after.
\noindent
\hrulefill
% LaTeX3 implementation
\RenewDocumentCommand{\mycommand}{ m }{%
\begin{alignat}{1} #1\null \end{alignat}%
}%
\RenewDocumentCommand{\command}{ m t\null }{\text{#1} \IfBooleanF{#2}{\\}}%
Some text before.
\mycommand{
\command{Hello}
\command{Hello two}
\command{Hello three}
}%
Some text after.
\end{document}
在添加到 LaTeX3 部分时,条件标记似乎被正确拾取\tracingmacros1
。但是,我不确定为什么\null
“从未找到”,导致\BooleanFalse
(因此\\
)甚至在最后一条语句中也是如此。
答案1
2e 命令在寻找字符时会跳过空格。
\documentclass{article}
\usepackage{amsmath,xparse}
\begin{document}
% LaTeX implementation
\makeatletter
\newcommand{\mycommand}[1]{%
\begin{alignat}{1} #1\null \end{alignat}%
}%
\newcommand{\command}[1]{\text{#1} \@ifnextchar\null{}{\\}}%
\makeatother
Some text before.
\mycommand{
\command{Hello}
\command{Hello two}
\command{Hello three}
}%
Some text after.
\noindent
\hrulefill
% LaTeX3 implementation
\RenewDocumentCommand{\mycommand}{ m }{%
\begin{alignat}{1} #1\null \end{alignat}%
}%
\RenewDocumentCommand{\command}{ m t\null }{\text{#1} \IfBooleanF{#2}{\\}}%
Some text before.
\mycommand{
\command{Hello}
\command{Hello two}
\command{Hello three}}%
Some text after.
\end{document}