行号对齐

行号对齐

我是 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

你实际上混淆了algorithm2ealgorithmicx。由于您的算法的大部分都遵循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默认没有定义。
  • \Returnalgorithmicx没有设置新的\State,因此必须手动添加。
  • 非标准块\algtext*需要去掉末端
  • 创建一个用于定义可动项的宏\var;您以后可以随时更改格式,但它可以避免被movingSD视为数学“常数” movi、和n的乘法。gSD

相关内容