以下最小工作示例几乎实现了我想要的功能,除了第 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
环境中。