![Ejemplo](https://rvso.com/image/461896/Ejemplo.png)
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 \SetKwFunction
con 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\).
En factorial x - 1
el ú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.
Respuesta2
Esto se puede lograr cambiando SetKwFunction
la 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}