Beispiel

Beispiel

Wenn ich eine Funktion wie \SetKwFunction{Func}{func}in algorithm2e definiere, \Func{a, b}druckt

Funktion(a, b)

standardmäßig. Wie kann ich es drucken lassen?

Funktion[a, b]

wie in Wolfram oder

func ab

wie in Haskell?

Ich habe mir die Dokumentation von algorithm2e angesehen und nichts dazu gefunden, aber die Unfähigkeit, dies zu ändern, scheint eine seltsame Einschränkung zu sein, angesichts all der Anpassungsmöglichkeiten, die algorithm2e bietet. Wenn das nicht möglich ist, was sind einige einfache Alternativen mit \SetKwFunctionähnlichem Verhalten und dieser Fähigkeit?

Beispiel

Die Präambel des Dokuments lautet:

\documentclass{article}

\usepackage[vlined]{algorithm2e}
\SetFuncSty{textsf}
\SetKwProg{Fn}{function}{}{}

Der erste Fall wird durch den folgenden Code erzeugt und die anderen Fälle zeigen, wie es aussehen soll, werden aber mit Workarounds erzeugt.

\begin{algorithm}[H]
    \SetKwFunction{Factorial}{factorial}

    \Fn{\Factorial{x}}{
        \uIf{\(x \le 1\)}{
            0
        }\Else{
            \(x \cdot \Factorial{\(x-1\)}\)
    } }
\end{algorithm}

This here \Factorial{x} grows very rapidly with \(x\).

Beispiele, wie es aussieht und wie es aussehen könnte

Im factorial x - 1letzten Fall sollten Klammern stehen, aber ich habe den Fehler zu spät bemerkt und beschlossen, sie der Demonstration halber beizubehalten.

Antwort1

Ich schlage vor, das Paket ein wenig zu überarbeiten. Die öffnenden und schließenden Klammern sind fest verdrahtet, daher ersetzen wir sie durch Makros. Außerdem wird den Trennzeichen ein eigener Stil zugewiesen.

\documentclass{article}
\usepackage[vlined]{algorithm2e}

\makeatletter
\renewcommand{\SetKwFunction}[2]{%
  \expandafter\gdef\csname @#1\endcsname##1{%
    \FuncSty{#2}\FuncDelSty{\FuncOpen}\FuncArgSty{##1}\FuncDelSty{\FuncClose}%
  }%
  \expandafter\gdef\csname#1\endcsname{%
    \@ifnextchar\bgroup{\csname @#1\endcsname}{\FuncSty{#2}\xspace}%
  }%
}
\newcommand{\FuncDelSty}[1]{\textnormal{#1}\unskip}
\newcommand{\SetFuncDelSty}[1]{%
  \renewcommand{\FuncDelSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}%
}
\providecommand{\gobblearg}[1]{}
\newcommand{\FuncOpen}{(}
\newcommand{\FuncClose}{)}
\newcommand{\matharg}[1]{\ensuremath{#1}}
\SetFuncArgSty{matharg} % function arguments are in math, not in text
\makeatother

\SetFuncSty{textsf}
\SetKwProg{Fn}{function}{}{}

\ExplSyntaxOn
\NewDocumentCommand{\haskellargs}{m}
 {
  \seq_set_from_clist:Nn \l_tmpa_seq { #1 }
  \ensuremath{\;\seq_use:Nn \l_tmpa_seq { \; }}
 }
\ExplSyntaxOff


\begin{document}

\section*{Standard}

\begin{algorithm}[H]
    \SetKwFunction{Factorial}{factorial}
    \Fn{\Factorial{x}}{
        \uIf{\(x \le 1\)}{
            0
        }\Else{
            \(x \cdot \Factorial{x-1}\)
    } }
\end{algorithm}

\section*{Brackets}

\begin{algorithm}[H]
    \SetKwFunction{Factorial}{factorial}
    \renewcommand{\FuncOpen}{[}\renewcommand{\FuncClose}{]}
    \Fn{\Factorial{x}}{
        \uIf{\(x \le 1\)}{
            0
        }\Else{
            \(x \cdot \Factorial{x-1}\)
    } }
\end{algorithm}

\section*{Haskell}

\begin{algorithm}[H]
    \SetKwFunction{Factorial}{factorial}
    \SetFuncArgSty{haskellargs}
    \renewcommand{\FuncOpen}{}\renewcommand{\FuncClose}{}
    \Fn{\Factorial{x}}{
        \uIf{\(x \le 1\)}{
            0
        }\Else{
            \(x \cdot \Factorial{(x-1)}\)
    } }
\end{algorithm}

\begin{algorithm}[H]
    \SetKwFunction{Test}{test}
    \SetFuncArgSty{haskellargs}
    \renewcommand{\FuncOpen}{}\renewcommand{\FuncClose}{}
    \Fn{\Test{x,y}}{
        \uIf{\(x>y\)}{
          $x-y$
        }\Else{
          $y-x$
    } }
\end{algorithm}

\end{document}

Den Stil bestimmen Sie natürlich ein für alle Mal.

Bildbeschreibung hier eingeben

Antwort2

SetKwFunctionDies kann durch eine Änderung der Implementierung wie folgt erreicht werden :

\documentclass{article}
\usepackage{algorithm2e}
\makeatletter
\renewcommand{\SetKwFunction}[2]{%
  \expandafter\gdef\csname @#1\endcsname##1{\FuncSty{#2[}\FuncArgSty{##1}\FuncSty{]}}%
  \expandafter\gdef\csname#1\endcsname{%
    \@ifnextchar\bgroup{\csname @#1\endcsname}{\FuncSty{#2}\xspace}}%
}%
\makeatother
\begin{document}
\begin{algorithm}
  \SetKwFunction{Func}{func}
  \SetKwProg{Fn}{Function}{:}{\KwRet}
  \Fn{\Func{$f$, $a$, $b$, $\varepsilon$}}{
        a\;
        b\;
  }
\end{algorithm}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen