算法,长行代码以零散的间距显示

算法,长行代码以零散的间距显示

我第一次使用 LaTeX,无法显示算法的伪代码。以下是我所得到的:

\usepackage{algorithm}
\usepackage[noend]{algpseudocode}

\begin{algorithm}
\caption{RSTM vector push\_back operation}\label{pushback}
\begin{algorithmic}[1]
\Procedure{push\_back}{$val$}\Comment{push $val$ onto end of vector}
\State \textit{BEGIN\_TRANSACTION}
\State $sh\_ptr<VectorItem> new\_val \gets new\,\, sh\_ptr<VectorItem>(new VectorItem(val))$
\State $sh\_ptr<VectorItem> desc \gets new\,\, sh\_ptr<VectorItem>(new VectorDesc(L_{desc} -> size + 1))$
\State $mem[size] \gets new\_val$
\State $L_{desc} \gets desc$
\State \textit{END\_TRANSACTION}
\EndProcedure
\end{algorithmic}
\end{algorithm}

我最终得到了这样的结果: 结果

正如您在第 3 行和第 4 行中看到的,有很多我不想要的额外空格。我很难修复它而不导致其他奇怪的事情发生。任何帮助都将不胜感激!

答案1

这两行很长,所以你需要换行,最好在合适的地方手动插入。一个基本问题是你在数学模式下排版所有内容,并错误地将小于和大于运算符用作尖括号。我建议引入以下宏。

\newcommand\id[1]{\mathit{#1}}
\newcommand\param[1]{\langle#1\rangle}
\newcommand\new{\mathit{new}\ }

\id{...}$\mathit{different}$用于标记标识符,以斜体显示。请注意和之间存在相当大的差异$different$

在此处输入图片描述

为了避免后者,请使用\mathit\mathrm\mathtt或...在数学模式下排版名称。

\param{...}旨在标记类型参数并将其参数括在尖括号中。作为一种(糟糕的)替代方法,您可以使用小于和大于运算符,但必须删除运算符的间距。

\newcommand\varparam[1]{{<}#1{>}}

自行决定是否喜欢\param{\id{VectorItem}}\varparam{\id{VectorItem}}

在此处输入图片描述

这是我对如何排版算法的建议。

在此处输入图片描述

\documentclass{article}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\newcommand\id[1]{\mathit{#1}}
\newcommand\param[1]{\langle#1\rangle}
\newcommand\new{\mathit{new}\ }
\begin{document}
\begin{algorithm}
\caption{RSTM vector push\_back operation}\label{pushback}
\begin{algorithmic}[1]
\Procedure{push\_back}{$val$}\Comment{push $val$ onto end of vector}
\State \textit{BEGIN\_TRANSACTION}
\State $\id{sh\_ptr}\param{\id{VectorItem}}\id{new\_val} \gets{}$\\
        \hfill$\new\id{sh\_ptr}\param{\id{VectorItem}}(\new\id{VectorItem}(\id{val}))$
\State $\id{sh\_ptr}\param{\id{VectorItem}}\id{desc} \gets{}$\\
        \hfill$\new\id{sh\_ptr}\param{\id{VectorItem}}(\new\id{VectorDesc}(L_{\id{desc}} \rightarrow \id{size} + 1))$
\State $\id{mem}[\id{size}] \gets \id{new\_val}$
\State $L_{\id{desc}} \gets \id{desc}$
\State \textit{END\_TRANSACTION}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}

答案2

第 3 行和第 4 行太长,而且跨行显示。默认为对齐,因此第一行被拉伸以适应行宽。添加\raggedright似乎有帮助:

\documentclass{article}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\begin{document}
\begin{algorithm}
\caption{RSTM vector push\_back operation}\label{pushback}
\begin{algorithmic}[1]
\raggedright
\Procedure{push\_back}{$val$}\Comment{push $val$ onto end of vector}
\State \textit{BEGIN\_TRANSACTION}
\State $sh\_ptr<VectorItem> new\_val \gets new\,\, sh\_ptr<VectorItem>(new VectorItem(val))$
\State $sh\_ptr<VectorItem> desc \gets new\,\, sh\_ptr<VectorItem>(new VectorDesc(L_{desc} -> size + 1))$
\State $mem[size] \gets new\_val$
\State $L_{desc} \gets desc$
\State \textit{END\_TRANSACTION}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}

结果

或者,\newline可以添加以手动断开过长的线 3 和 4。

相关内容