我在我的文档中使用algorithmic
排版算法环境,但我想定制某些方面并解决问题。
我正在使用algpseudocode
带有选项的包noend
,但当结束线被抑制时,它会产生难看的垂直间隙(见下图第六行和第七行之间)。我该如何解决这个问题?
其次,我使用function
命令在同一环境中生成两个不同的过程algorithm
,但我希望只对函数体进行行号,并且 Reduce 函数的行数应该从 1 重新开始。
第三,也是最后一点,我使用命令分离了两个功能\Statex
,但我希望垂直空间宽度小于整条白线。
这是我的代码。
\begin{algorithm}[H]
\caption{Calcola il grado di ogni vertice del grafo $G = (V,E)$}
\label{degree}
\begin{algorithmic}[1]
\Function{\textsc{Map}$( \left \langle u;v \right \rangle )$}{}
\State \textbf{emit} $\left \langle u;v \right \rangle$
\EndFunction
\Statex
\Function{\textsc{Reduce}$( \left \langle u;\Gamma(u) \right \rangle )$}{}
\State $d(u) \gets 0$
\ForAll{$v \in \Gamma(u)$}
\State $d(u) \gets d(u) + 1$
\EndFor
\State \textbf{emit} $\left \langle u;d(u) \right \rangle$
\EndFunction
\end{algorithmic}
\end{algorithm}
谢谢你!
答案1
要从 1 重新开始行号,您必须重置计数器ALG@line
,因此我们定义了一个新命令\resetline
,在您需要该更改时发出:
\makeatletter
\newcommand{\resetline}{\setcounter{ALG@line}{0}}
\makeatother
对于两个函数之间的间距,您可以使用正常跳过,而不是发出(\Statex
,,\smallskip
)。\medskip
\bigskip
平均能量损失
\documentclass{article}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\makeatletter
\newcommand{\resetline}{\setcounter{ALG@line}{0}}
\makeatother
\begin{document}
\begin{algorithm}[H]
\caption{Calcola il grado di ogni vertice del grafo $G = (V,E)$}
\label{degree}
\begin{algorithmic}[1]
\Function{\textsc{Map}$( \left \langle u;v \right \rangle )$}{}
\State \textbf{emit} $\left \langle u;v \right \rangle$
\EndFunction
\medskip\resetline
\Function{\textsc{Reduce}$( \left \langle u;\Gamma(u) \right \rangle )$}{}
\State $d(u) \gets 0$
\ForAll{$v \in \Gamma(u)$}
\State $d(u) \gets d(u) + 1$
\EndFor
\State \textbf{emit} $\left \langle u;d(u) \right \rangle$
\EndFunction
\end{algorithmic}
\end{algorithm}
\end{document}
输出:
与选项相关的小间隙noend
是为了指示函数的结束,因此我将保持原样,但如果您确实想删除它,您可以在序言中添加以下几行(需要包etoolbox
):
\patchcmd{\ALG@doentity}
{\item[]\nointerlineskip}
{\relax}
{}
{}
完整代码:
\documentclass{article}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\usepackage{etoolbox}
\makeatletter
\newcommand{\resetline}{\setcounter{ALG@line}{0}}
\patchcmd{\ALG@doentity}
{\item[]\nointerlineskip}
{\relax}
{}
{}
\makeatother
\begin{document}
\begin{algorithm}[H]
\caption{Calcola il grado di ogni vertice del grafo $G = (V,E)$}
\label{degree}
\begin{algorithmic}[1]
\Function{\textsc{Map}$( \left \langle u;v \right \rangle )$}{}
\State \textbf{emit} $\left \langle u;v \right \rangle$
\EndFunction
\medskip\resetline
\Function{\textsc{Reduce}$( \left \langle u;\Gamma(u) \right \rangle )$}{}
\State $d(u) \gets 0$
\ForAll{$v \in \Gamma(u)$}
\State $d(u) \gets d(u) + 1$
\EndFor
\State \textbf{emit} $\left \langle u;d(u) \right \rangle$
\EndFunction
\end{algorithmic}
\end{algorithm}
\end{document}
输出: