¿Cómo definir un operador matemático con dos argumentos?

¿Cómo definir un operador matemático con dos argumentos?

Estoy escribiendo un artículo sobre programación funcional donde la aplicación de funciones se indica mediante espacios (por ejemplo, fxy para f(x,y)). ¿Cuál sería la forma correcta de componer eso en LaTeX para obtener el espaciado correcto?

Sé que para una función de un argumento se puede usar mathop de la siguiente manera

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

pero me preguntaba cómo generalizarlo.

En particular, $\foo x~y$ y $\foo x\,y$ no parecen proporcionar el espaciado correcto.

Respuesta1

Sugiero utilizar un comando con dos argumentos: el nombre de la función y la lista de argumentos. De esta manera puedes cambiar fácilmente de opinión sobre la notación (ver comentarios en el 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}

ingrese la descripción de la imagen aquí

Opté por un espacio doblemente delgado porque el espacio delgado parece demasiado pequeño: aquí está la comparación cuando se usa la segunda posibilidad:

ingrese la descripción de la imagen aquí

Para completar, aquí está la tercera posibilidad:

ingrese la descripción de la imagen aquí

Simplemente cambia la definición, no el código dentro del documento.

Respuesta2

En los listados de fuentes y en el pseudocódigo, es habitual componer los nombres de las funciones en una fuente de máquina de escribir. (Aunque es posible que prefieras un estilo diferente, como sans-serif o versalitas). Esto a menudo se extiende al espaciado, pero si realmente quieres que esto sea fácil de leer, creo que querrás que la función y sus argumentos estén espaciados un un poco más cerca que los operadores binarios, que están espaciados un poco más que los operadores relacionales, para coincidir con el orden de las operaciones.

Entonces, tal vez 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}

muestra desconsolada

Puedes adornar esto aún más, por supuesto. Por ejemplo, este estilo imita en cierto modo el de DEK.Matemáticas Concretas:

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

Muestra de Inconsolata/Euler

Si declara más de uno o dos de estos, querrá algún comando más genérico para declarar una función fuente arbitraria.

información relacionada