2 つの引数を持つ数学演算子を定義するにはどうすればよいでしょうか?

2 つの引数を持つ数学演算子を定義するにはどうすればよいでしょうか?

私は関数プログラミングに関する論文を書いています。この論文では関数の適用はスペースで表されます (例: f(x,y) の場合は fxy)。LaTeX で正しいスペースを挿入するには、どのような方法が有効でしょうか。

1つの引数を持つ関数の場合は、mathopを次のように使用できることを知っています。

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

しかし、それをどのように一般化すればよいのか疑問に思いました。

特に、$\foo x~y$ と $\foo x\,y$ は正しい間隔を与えていないようです。

答え1

関数名と引数リストの 2 つの引数を持つコマンドを使用することをお勧めします。この方法により、表記法について簡単に考えを変更できます (コード内のコメントを参照)。

\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 倍にしました。2 番目の可能性を使用した場合の比較を以下に示します。

ここに画像の説明を入力してください

完全を期すために、3 番目の可能性を示します。

ここに画像の説明を入力してください

ドキュメント内のコードではなく、定義のみを変更します。

答え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}

インコンソラータ/オイラーサンプル

これらを 1 つまたは 2 つ以上宣言する場合は、任意のソース関数を宣言するためのより一般的なコマンドが必要になります。

関連情報