我是 LaTeX 新手,正在尝试为论文创建一个简短的伪代码部分。我目前面临的问题是许多行的行号(以及一般的垂直对齐)都关闭了。
这是我目前拥有的代码(我在 Linux 上使用 Texmaker 进行编译)。
\documentclass{article}
\usepackage{amsmath}
\usepackage[linesnumbered, ruled]{algorithm2e}
\usepackage[noend]{algpseudocode}
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother
\begin{document}
{\SetAlgoNoLine
\begin{algorithm}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\caption{Leak Detection}
\begin{algorithmic}[1]
\Require{Set $C$ of all observations of interest}
\Ensure{Set $leaks$ of all identified $CH_{4}$ leak polygons}
\State $ $
\ForEach{record $c_{i}$ in $C$}{
\State $\textit{movingAvg} \gets \textit{avg. $CH_{4}$ for past 2
min.}$
\State $\textit{movingSD} \gets \textit{SD of $CH_{4}$ for past 2
min.}$
\State $\textit{movingThreshold} \gets \max(1 SD > movingAvg, 10\% >
movingAvg)$
\If {$CH_{4} level of c_{i} > movingThreshold$}{
\State $\textit{flag $c_{i}$ as elevated}$
\State $\textit{buffer $c_{i}$ location with 20m radius}$
}
}
\State $leaks \gets \textit{merge of all intersecting $c_{i}$
buffers}$
\State $ $
\ForEach{Polygon $p \in leaks$}{
\State $\textit{mark centroid of p}$
}
\Return $leaks$
\end{algorithmic}
\end{algorithm}}
\end{document}
输出如下:
我不明白为什么 foreach 部分中的所有行都没有缩进,也不明白为什么行号没有整齐地排列在一起。
我试图让第 2-6 行在第一个 foreach 中缩进,让第 9 行在第二个 foreach 中缩进。最后的 return 语句不应该缩进,但它缩进了。我这里漏掉了什么?
答案1
你实际上混淆了algorithm2e
和algorithmicx
。由于您的算法的大部分都遵循algorithmicx
方法论(和宏),因此以下是您的设置的更新,可提供您想要的输出:
\documentclass{article}
\usepackage{amsmath,algorithm}
\usepackage[noend]{algpseudocode}
\makeatletter
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\newcommand{\algorithmicforeach}{\textbf{foreach}}
\newcommand{\var}{\texttt}
\algdef{SE}[FOREACH]{ForEach}{EndForEach}[1]{\algorithmicforeach\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicforeach}%
\algtext*{EndForEach}
\newcommand{\AlgBlankLine}{\par\medskip}
\begin{document}
\begin{algorithm}
\caption{Leak Detection}
\begin{algorithmic}[1]
\Require{Set $C$ of all observations of interest}
\Ensure{Set $\var{leaks}$ of all identified $CH_4$ leak polygons}
\AlgBlankLine
\ForEach{record $c_i$ in $C$}
\State $\var{movingAvg} \gets \text{avg.\ $CH_4$ for past 2 min.}$
\State $\var{movingSD} \gets \text{SD of $CH_4$ for past 2 min.}$
\State $\var{movingThreshold} \gets \max(1 SD > \var{movingAvg}, 10\% > \var{movingAvg})$
\If {$CH_4$ level of $c_i > \var{movingThreshold}$}
\State flag $c_i$ as elevated
\State buffer $c_i$ location with 20m radius
\EndIf
\EndForEach
\State $\var{leaks} \gets \text{merge of all intersecting $c_i$ buffers}$
\AlgBlankLine
\ForEach{Polygon $p \in \var{leaks}$}
\State mark centroid of~$p$
\EndForEach
\State \Return $\var{leaks}$
\end{algorithmic}
\end{algorithm}
\end{document}
以下是我建议的更改:
algorithm2e
使用一种\For{<condition>}{<body>}
方法,同时algorithmicx
使用\For{<condition>} <body> \EndFor
方法。algorithmicx
\ForEach
默认没有定义。\Return
下algorithmicx
没有设置新的\State
,因此必须手动添加。- 非标准块
\algtext*
需要去掉末端。 - 创建一个用于定义可动项的宏
\var
;您以后可以随时更改格式,但它可以避免被movingSD
视为数学“常数”m
、o
、v
、i
、和n
的乘法。g
S
D