如何定義帶有兩個參數的數學運算子?

如何定義帶有兩個參數的數學運算子?

我正在寫一篇關於函數式程式設計的論文,其中函數應用程式以空格表示(例如,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}

因康索拉塔樣品

當然,你還可以把它打扮得更漂亮。例如,這種風格有點模仿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 樣本

如果您聲明其中一兩個以上,則需要一些更通用的命令來聲明任意來源函數。

相關內容