为什么宏的单字母参数的括号会影响其输出?

为什么宏的单字母参数的括号会影响其输出?

我认为\ul 8\ul8\ul{8}是将参数传递8给命令的相同方式\ul。但是,它们产生不同的输出。为什么?

梅威瑟:

\documentclass{article}
\usepackage{soul}

\newcommand\A\ul
\newcommand\B[1]{\ul#1}
\newcommand\C[1]{\ul{#1}}

\begin{document}

Text \ul8 using \verb|\ul8|

Text \A8 using \verb|\A8|

Text \B8 using \verb|\B8|

Text \C8 using \verb|\C8|

Text \ul{8} using \verb|\ul{8}|

Text \A{8} using \verb|\A{8}|

Text \B{8} using \verb|\B{8}|

Text \C{8} using \verb|\C{8}|

\end{document}

在此处输入图片描述

答案1

该命令\ul是 的别名\textul,但这不是主要内容; 的定义\textul

\DeclareRobustCommand*\textul{\SOUL@ulsetup\SOUL@}

这表明不是一个带有参数的命令;反过来\SOUL@定义为

\def\SOUL@{\futurelet\SOUL@@\SOUL@expand}

文件中对此宏的描述.dtx

此宏是 的入口soul。只有在设置灵魂驱动程序后,使用它才有意义。命令后的下一个标记soul将分配给\SOUL@@。这可以是括号中的一些文本,也可以是包含文本的宏的名称。

用户文档第 2 节开头也对此进行了解释:

soul软件包提供了五个命令,旨在强调文本部分。每个命令都有一个参数,可以是文本本身,也可以是包含文本的宏的名称(例如\so\text)。请参阅表 1 了解完整的命令调查。

因此\ul8无法正常工作是预料之中的(并且有记录)。

相关内容