Как определить математический оператор с двумя аргументами?

Как определить математический оператор с двумя аргументами?

Я пишу статью о функциональном программировании, где применение функции обозначается пробелом (например, 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'sКонкретная математика:

\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/Выборка Эйлера

Если вы объявляете более одного или двух из них, вам понадобится более общая команда для объявления произвольной исходной функции.

Связанный контент