我想以某种方式呈现我的算法,以便读者可以在额外的框架内看到这样的函数:
为了编写伪代码,我更喜欢algorithmicx
包。
任何意见是极大的赞赏。
答案1
的另一项工作\tikzmark
。在每次使用\Function
和\EndFunction
需要框架时,都要放置一些标记;然后分别使用这些标记作为的第一和第二个参数\Drawbox
;第三个强制参数控制框架的宽度:
\documentclass{article}
\usepackage{algpseudocode}
\usepackage{tikz}
\newcommand\tikzmark[1]{%
\tikz[remember picture,overlay]\node (#1) {};}
\algdef{SE}[FUNCTION]{Function}{EndFunction}%
[2]{\algorithmicfunction\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}\vskip3pt}%
{\algorithmicend\ \algorithmicfunction}
\newlength\funcwd
\settowidth\funcwd{\algorithmicfunction}
\addtolength\funcwd{3pt}
\newcommand\Drawbox[3]{%
\begin{tikzpicture}[remember picture,overlay]
\coordinate (s#1) at ([xshift=-\funcwd,yshift=6pt]#1.north west);
\coordinate (e#1) at ([xshift=#3,yshift=1pt]#2.south east);
\draw (s#1) rectangle (e#1);
\draw ([yshift=-1.2\baselineskip]s#1) -- ([yshift=-1.2\baselineskip]e#1|-s#1);
\end{tikzpicture}
}
\begin{document}
\begin{algorithmic}
\Function{\tikzmark{start1}CallA}{$a$} \label{alg:a}
\State \Call{CalcSquare}{$a$}
\Function{\tikzmark{start2}CalcSquare}{$b$} \label{alg:b}
\State \Return $b\times b$
\EndFunction\tikzmark{end2}
\EndFunction\tikzmark{end1}
\end{algorithmic}
\Drawbox{start1}{end1}{74pt}
\Drawbox{start2}{end2}{55pt}
\end{document}