定制算法环境的某些方面

定制算法环境的某些方面

我在我的文档中使用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} 

输出:

在此处输入图片描述

相关内容