Ich schreibe eine Arbeit über funktionale Programmierung, bei der die Funktion durch Leerzeichen gekennzeichnet wird (z. B. fxy für f(x,y)). Wie kann ich das in LaTeX richtig setzen, um den richtigen Abstand zu erhalten?
Ich weiß, dass man für eine einargumentierte Funktion Mathop wie folgt verwenden kann
\newcommand\foo{\mathop{\mathrm{foo}}}
aber ich habe mich gefragt, wie man es verallgemeinern kann.
Insbesondere $\foo x~y$ und $\foo x\,y$ scheinen keinen korrekten Abstand zu ergeben.
Antwort1
Ich schlage vor, einen Befehl mit zwei Argumenten zu verwenden: dem Funktionsnamen und der Liste der Argumente. Auf diese Weise können Sie Ihre Meinung zur Notation leicht ändern (siehe Kommentare im Code).
\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}
Ich habe mich für einen doppelten schmalen Zwischenraum entschieden, da der schmale Zwischenraum zu klein erscheint: Hier ist der Vergleich bei Verwendung der zweiten Möglichkeit:
Der Vollständigkeit halber hier noch die dritte Möglichkeit:
Sie ändern nur die Definition, nicht den Code im Dokument.
Antwort2
In Quelltextlisten und Pseudocode ist es üblich, Funktionsnamen in einer Schreibmaschinenschriftart zu setzen. (Vielleicht bevorzugen Sie jedoch einen anderen Stil, z. B. serifenlose Schrift oder Kapitälchen.) Dies gilt häufig auch für die Abstände, aber wenn Sie dies wirklich leicht lesbar machen möchten, sollten Sie meiner Meinung nach die Funktion und ihre Argumente etwas enger platzieren als binäre Operatoren, die wiederum etwas enger platziert sind als relationale Operatoren, um der Reihenfolge der Operationen zu entsprechen.
Also vielleicht so etwas wie:
\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}
Sie können das natürlich noch weiter aufpeppen. Dieser Stil imitiert zum Beispiel DEKsKonkrete Mathematik:
\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}
Wenn Sie mehr als ein oder zwei davon deklarieren, benötigen Sie einen allgemeineren Befehl zum Deklarieren einer beliebigen Quellfunktion.