我第一次使用 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。