我的算法中有一个 for 循环,我无法让 latex 正确缩进其中的伪代码。目前情况很乱,它甚至不会将 for 循环中的代码放在单独的行上。
\documentclass[a4paper,12pt,times,numbered,print,index]{Classes/PhDThesisPSnPDF}
\RequirePackage[left=37mm,right=30mm,top=35mm,bottom=30mm]{geometry}
\RequirePackage{libertine}
\RequirePackage[small,bf]{caption}
\RequirePackage[labelsep=space,tableposition=top]{caption}
\usepackage{subfig}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{braket}
\usepackage{algorithm}% http://ctan.org/pkg/algorithms
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{algorithm}% http://ctan.org/pkg/algorithms
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\begin{document}
\begin{algorithm}
\caption{Generate transition matrix for one-dimensional quantum walk}\label{tran_mat_1d_qw}
\begin{algorithmic}[1]
\Procedure{generateTransitionMatrix}{$steps$}
\State $numElements \gets steps * 4 + 2$
\State $transitionMat \gets numElements \times numElements$ MATRIX
\BlankLine
\State $col \gets 0$
\For {$i = 1 \to (steps * 2) - 1$}
\State row \gets i * 2$
\STATE\hspace{\algorithmicindent} transitionMat[row, col] \gets $1$
\STATE\hspace{\algorithmicindent} transitionMat[row, col + 1] \gets $1$
\STATE\hspace{\algorithmicindent} transitionMat[row + 5, col] \gets $1$
\STATE\hspace{\algorithmicindent} transitionMat[row + 5, col + 1] \gets $-1$
\ENDFOR
\end{algorithmic}
\end{algorithm}
\end{document}
答案1
我不知道如何\BlankLines
定义,所以我删除了它。如果您想要一个未编号的空行,请使用\Statex
。
您的代码存在许多问题。
\gets
必须置于数学模式中,即它需要位于一对美元符号内。当在数学模式之外时,会产生错误missing $ inserted
。在 for 循环的第一个部分中,
\State
您忘记了开头$
,而只有行末的那个。宏区分大小写,这
\State
意味着不是与 相同\STATE
。algorithmicx
包定义前者,因此全部更改\STATE
为\State
。同样,\ENDFOR
应该是(阅读/ 的\EndFor
文档)。algorithmicx
algpseudocode
这些错误会产生
Undefined control sequence
误差。您必须
\Procedure
用 来结束 。这样\EndProcedure
会产生错误。algorithmicx
Some blocks are not closed!!!
其他的建议:
当书写单词(而不是变量,例如
x
)时,使用\text{the word(s)}
或\mathrm{the word(s)}
,以罗马字体排版它们。您使用
\times
一个地方,而*
其他地方则\times
一致使用。关于你的前言:你加载了
caption
两次,使用了不同的参数,为什么?将所有参数添加到对的一次调用中caption
。你还加载了algorithm
和algpseudocode
两次,这是毫无意义的。最后,惯例是在序言中使用
\usepackage
和 而不是\RequirePackage
,尽管它们的作用相同。例如,参见https://tex.stackexchange.com/a/19933/586
在下面的代码中我删除了未使用的包。
\documentclass{article}
\usepackage{algorithm}% http://ctan.org/pkg/algorithms
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\begin{document}
\begin{algorithm}
\caption{Generate transition matrix for one-dimensional quantum walk}\label{tran_mat_1d_qw}
\begin{algorithmic}[1]
\Procedure{generateTransitionMatrix}{$\mathrm{steps}$}
\State $\mathrm{numElements} \gets \mathrm{steps} \times 4 + 2$
\State $\mathrm{transitionMat} \gets \mathrm{numElements} \times \mathrm{numElements}$ MATRIX
\State $\mathrm{col} \gets 0$
\For {$i = 1 \to (\mathrm{steps} \times 2) - 1$}
\State $\mathrm{row} \gets i \times 2$
\State\hspace{\algorithmicindent} $\mathrm{transitionMat[row, col] } \gets 1$
\State\hspace{\algorithmicindent} $\mathrm{transitionMat[row, col + 1]} \gets 1$
\State\hspace{\algorithmicindent} $\mathrm{transitionMat[row + 5, col] } \gets 1$
\State\hspace{\algorithmicindent} $\mathrm{transitionMat[row + 5, col + 1]} \gets -1$
\EndFor
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}