基于 token 的条件代码

基于 token 的条件代码

这是Xparse 在每个命令后添加反斜杠

xparse允许使用条件标记插入到宏的参数文本中t<token>(来自文档

t可选的,如果存在则<token>返回一个值,否则返回一个值。给定为。\BooleanTrue<token>\BooleanFalset<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}

相关内容