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}
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:
Para completar, aquí está la tercera posibilidad:
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}
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}
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.