如何定义具有两个参数的数学运算符?

如何定义具有两个参数的数学运算符?

我正在写一篇关于函数式编程的论文,其中函数应用用空格表示(例如,fxy 表示 f(x,y))。在 LaTeX 中,如何正确排版才能获得正确的间距?

我知道对于单参数函数可以使用 mathop 如下

\newcommand\foo{\mathop{\mathrm{foo}}}

但我不知道该如何概括它。

特别是 $\foo x~y$ 和 $\foo x\,y$ 似乎没有提供正确的间距。

答案1

我建议使用带有两个参数的命令:函数名称和参数列表。这样,您可以轻松改变符号的想法(参见代码中的注释)。

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\fun}{mm}
 {% #1 = function name
  % #2 = arguments, comma separated
  \operatorname{\mathsf{#1}}% style as you like
  % first possibility
  \,\clist_use:nn { #2 } { \,\, }% no parentheses and space between variables
  % second possibility
  %\clist_use:nn { #2 } { \, }% no parentheses and space between variables
  % third possibility
  %(\clist_use:nn { #2 } { , })% standard notation
 }

\ExplSyntaxOff

\begin{document}

\[
\fun{foo}{x,y} + \fun{baz}{x,y,z}
\]

\end{document}

在此处输入图片描述

我选择了双倍的薄空间,因为薄空间似乎太小了:这是使用第二种可能性时的比较:

在此处输入图片描述

为了完整起见,以下是第三种可能性:

在此处输入图片描述

您只需更改定义,而不是更改文档内的代码。

答案2

在源代码列表和伪代码中,通常使用打字机字体来排版函数名称。(尽管您可能更喜欢其他样式,例如无衬线字体或小型大写字母。)这通常会扩展到间距,但如果您真的想让它易于阅读,我认为您希望函数及其参数的间距比二元运算符的间距稍近,而二元运算符的间距比关系运算符的间距稍近,以匹配运算顺序。

因此,也许是这样的:

\documentclass{article}
\usepackage{amsmath}
\usepackage{inconsolata} % Or your monospace font of choice.

\newcommand\foo[2]{%
\textup{\texttt{foo}}\,\textup{\texttt{#1}}\,\textup{\texttt{#2}}%
}

\begin{document}
\[ \foo{x}{y} + \foo{y}{z} \geq \foo{x}{z}
\]
\end{document}

Inconsolata 样本

当然,你还可以进一步修饰它。例如,这种风格有点模仿 DEK 的具体数学

\documentclass{article}
\usepackage{amsmath}
\usepackage{inconsolata} % Or your monospace font of choice.
\usepackage{eulervm}

\newcommand\foo[2]{%
\textup{\texttt{foo}}\,{#1}\,{#2}%
}

\begin{document}
\[ \foo{x}{y} + \foo{y}{z} \geq \foo{x}{z}
\]
\end{document}

Inconsolata/Euler 示例

如果您声明了多个或两个这样的函数,则需要一些更通用的命令来声明任意源函数。

相关内容