如何重现这个伪代码?

如何重现这个伪代码?

我正在尝试复制以下伪代码的风格。 原始伪代码

以下最小工作示例几乎实现了我想要的功能,除了第 7 行和第 8 行之间的额外垂直空间。我该如何解决这个问题?有没有更简单的方法以这种方式格式化伪代码?

\documentclass[12pt]{article}

\usepackage[noend]{algpseudocode}

\setlength\parindent{0pt}
\newcommand{\Def}[3]{\textbf{#1}\ \textsc{#2}\ifthenelse{\equal{#3}{}}{}{(#3)}}
\algrenewcommand{\alglinenumber}[1]{\footnotesize#1\hspace{1em}}% <- This line

\begin{document}

    \Def{procedure}{Euclidian}{$a,b$}
    \begin{algorithmic}[1]
        \State $x \gets a$
        \State $y \gets b$
        \While{$x \not= y$}
            \If{$x < y$}
                \State $x \gets x - y$
            \Else
                \State $y \gets y - x$
            \EndIf
        \EndWhile
        \State \textbf{return} $x$
    \end{algorithmic}

\end{document}

编辑 这次我尝试了 clrscode3e。它起作用了,但需要我黑客包代码。我仍然想知道是否有更简单的解决方案。

\documentclass[12pt]{article}

\usepackage{clrscode3e}

\setlength\parindent{0pt}

% Restore \gets
\let\gets=\leftarrow

% Print 'do' and 'then'
\renewcommand{\Do}{\textbf{do}\addtocounter{indent}{1}}
\renewcommand{\Then}{\textbf{then}\addtocounter{indent}{1}}

% Indent recursively (\hspace is used instead of \>)
\renewcommand{\putindents}{\ifnum\value{thisindent}>0%
    \hspace{1.5em}\addtocounter{thisindent}{-1}\putindents%
\fi}

% Line number separation (hspace is added)
\makeatletter
\renewcommand{\liprint}{\protected@xdef\@lilabel{\thecodelinenumber}%
    \ifnumberedline\thecodelinenumber\fi\'\hspace{0.25em}\Indent%
}
\makeatother

\begin{document}

    \begin{codebox}
    \Procname{\textbf{procedure} $\proc{Euclidian}(a,b)$}
    \li $x \gets a$
    \li $y \gets b$
    \li \While $x \not= y$ \Do
    \li     \If $x < y$ \Then
    \li         $x \gets x - y$
    \li     \Else
    \li         $y \gets y - x$
            \End
        \End
    \li \Return $x$
    \end{codebox}   

\end{document}

编辑2 @egreg 提出的补丁修复了垂直对齐问题,但我还有一个问题。在第一个 MWE 中,标记线通过增加间隔使行号左对齐。但是,它无法处理多位行号。您有什么建议?

答案1

尽管algpseudocode带有和的虚假空白noend纠正垂直对齐,可以使用固定宽度的框来更改行号的水平对齐:

在此处输入图片描述

\documentclass{article}

\usepackage[noend]{algpseudocode}

\usepackage{etoolbox}
\makeatletter
\patchcmd{\ALG@doentity}{\item[]\nointerlineskip}{}{}{}
\makeatother

\setlength{\parindent}{0pt}
\newcommand{\Def}[3]{\textbf{#1}\ \textsc{#2}\ifthenelse{\equal{#3}{}}{}{(#3)}}
\algrenewcommand{\alglinenumber}[1]{\makebox[1.5em][l]{\footnotesize#1}}
\algrenewcommand{\Return}[1]{\State \textbf{return} #1}

\makeatletter
\newcommand{\@procedure}[1][\relax]{%
  \def\procedurearg{#1}%
  \textbf{procedure}
  \textsc{\procedurename}%
  \ifx\procedurearg\relax\else
    (#1)%
  \fi
  \par
  \begin{algorithmic}[1]
}
\newenvironment{procedure}[1]
  {\par
   \setlength{\parindent}{0pt}% Remove paragraph indent
   \def\procedurename{#1}%
   \@procedure
  }
  {\end{algorithmic}}
\makeatother

\begin{document}

\begin{procedure}{Euclidian}[$a,b$]
  \State $x \gets a$
  \State $y \gets b$
  \While{$x \not= y$}
    \If{$x < y$}
      \State $x \gets x - y$
    \Else
      \State $y \gets y - x$
    \EndIf
  \EndWhile
  \Return{$x$}
\end{procedure}

\end{document}

为了方便起见,我将过程algorithmic混合包装到单一procedure环境中。

相关内容