我正在写一篇关于函数式编程的论文,其中函数应用用空格表示(例如,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 的具体数学:
\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}
如果您声明了多个或两个这样的函数,则需要一些更通用的命令来声明任意源函数。