Como definir um operador matemático com dois argumentos?

Como definir um operador matemático com dois argumentos?

Estou escrevendo um artigo sobre programação funcional onde a aplicação da função é denotada por espaço (por exemplo, fxy para f(x,y)). Qual seria a maneira correta de digitar isso em LaTeX para obter o espaçamento correto?

Eu sei que para funções de um argumento pode-se usar o mathop da seguinte maneira

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

mas me perguntei como generalizar isso.

Em particular, $\foo x~y$ e $\foo x\,y$ não parecem fornecer espaçamento correto.

Responder1

Sugiro usar um comando com dois argumentos: o nome da função e a lista de argumentos. Dessa forma, você pode facilmente mudar de ideia sobre a notação (veja os comentários no código).

\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}

insira a descrição da imagem aqui

Optei por um espaço fino dobrado porque o espaço fino parece muito pequeno: aqui está a comparação quando a segunda possibilidade é usada:

insira a descrição da imagem aqui

Para completar, aqui está a terceira possibilidade:

insira a descrição da imagem aqui

Você apenas altera a definição, não o código dentro do documento.

Responder2

Em listagens de fontes e pseudocódigo, é comum compor nomes de funções em uma fonte de máquina de escrever. (Embora você possa preferir um estilo diferente, como sem serifa ou versalete.) Isso geralmente se estende ao espaçamento, mas se você realmente deseja facilitar a leitura, acho que deseja que a função e seus argumentos sejam espaçados um um pouco mais próximos do que os operadores binários, que são espaçados um pouco mais do que os operadores relacionais, para corresponder à ordem das operações.

Então, talvez algo como:

\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}

Amostra de inconsolação

Você pode melhorar ainda mais isso, é claro. Por exemplo, este estilo imita o DEKMatemática Concreta:

\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}

Amostra Inconsolata/Euler

Se você declarar mais de um ou dois deles, você desejará algum comando mais genérico para declarar uma função de origem arbitrária.

informação relacionada