Ejemplo

Ejemplo

Si defino una función como \SetKwFunction{Func}{func}en el algoritmo2e, \Func{a, b}imprime

función (a, b)

por defecto. ¿Cómo puedo hacerlo para imprimir?

función [a, b]

como en Wolfram o

función ab

¿Como en Haskell?

Miré la documentación de Algoritm2e y no encontré nada al respecto, pero la imposibilidad de cambiar esto parece una limitación extraña con toda la personalización disponible en Algoritm2e. Si no es posible, ¿cuáles son algunas alternativas fáciles \SetKwFunctioncon un comportamiento similar y con esa capacidad?

Ejemplo

El preámbulo del documento es este:

\documentclass{article}

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

El primer caso se produce mediante el siguiente código y otros casos muestran cómo se supone que debe verse, pero se producen con soluciones alternativas.

\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\).

ejemplos de cómo se ve y cómo podría verse

En factorial x - 1el último caso debería tener paréntesis, pero me di cuenta del error demasiado tarde y decidí conservarlo para demostrarlo.

Respuesta1

Sugiero alguna cirugía en el paquete. Los paréntesis de apertura y cierre están programados, por lo que los reemplazamos con macros. También se asigna un estilo independiente a los delimitadores.

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

Por supuesto que elegirás el estilo de una vez por todas.

ingrese la descripción de la imagen aquí

Respuesta2

Esto se puede lograr cambiando SetKwFunctionla implementación de la siguiente manera:

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

ingrese la descripción de la imagen aquí

información relacionada