如何根据上下文定义具有正确间距的宏?

如何根据上下文定义具有正确间距的宏?

我想定义一个简单的宏,用于数学模式公式。该宏表示一个数学关系。关系的显示方式(粗体等)并不重要。重要的是它周围的间距。

具体来说,如果我的宏是\likes,我希望$a \likes b$在 之前出现一个空格b,但我也希望$\likes(a, b)$在 括号之前不出现空格。有没有办法编写一个可以在这些不同上下文中按预期运行的宏?

问题不在于什么对 LaTeX 来说是自然的,而在于什么对宏的用户来说是易读的。我宁愿避免编写 \likes{}或拥有两个版本的宏,一个带有空格,一个不带有空格。

渲染示例

    \documentclass{article}
    \begin{document}
    I want to be able to write all of the following:

    \verb+``$a \likes b$''+, yielding ``$a\ \textbf{likes}\ b$''

    \verb+``$\likes(a,b)$''+, yielding ``$\textbf{likes}(a,b)$''

    \verb+``$(a,b) \in \likes$''+, yielding ``$(a,b) \in \textbf{likes}$''

    \vspace{1ex}
    With the definition \verb+\newcommand{\likes}{\textbf{likes}}+ I get:

    \newcommand{\likes}{\textbf{likes}}

    \verb+``$a \likes b$''+ gives ``$a \likes b$'' (BAD, missing space
    before and after)

    \verb+``$\likes(a,b)$''+ gives ``$\likes(a,b)$'' (GOOD)

    \verb+``$(a,b) \in \likes$''+ gives ``$(a,b) \in \likes$'' (GOOD)

    \vspace{1ex}
    With the definition \verb+\newcommand{\likes}{\textbf{ likes }}+ I
    get:

    \renewcommand{\likes}{\textbf{ likes }}

    \verb+``$a \likes b$''+ gives ``$a \likes b$'' (GOOD)

    \verb+``$\likes(a,b)$''+ gives ``$\likes(a,b)$'' (BAD, unwanted spaces)

    \verb+``$(a,b) \in \likes$''+ gives ``$(a,b) \in \likes$'' (BAD, unwanted  
    spaces)

    \end{document}

答案1

您可以定义\likes\mathbin

\def\likes{\mathbin{\rm likes}}

%% TEST:
$a \likes b$       % prints: a likes b

$\likes(a,b)$      % prints: likes(a,b)

$(a,b) \in \likes$ % prints: (a,b) ∈ likes

\bye

相关内容