如何对齐算法代码中的注释?

如何对齐算法代码中的注释?

我将在另一个专栏“算法包”中对齐评论。(类似问题:算法包中注释的右对齐错误),但我愿意成为这样的结果:

在此处输入图片描述

\usepackage{algorithm,algorithmic}
\renewcommand{\algorithmiccomment}[1]{\bgroup\hfill//~#1\egroup}

[...]

\begin{algorithm}
\caption{$function(n : \mathbb{N}_0) : \mathbb{N}_0$}
\label{algo1}
\begin{algorithmic}[1]
   \REQUIRE $n \in \mathbb{N}_0$
   \STATE $result \leftarrow 0 : \mathbb{N}_0$
   \STATE $temp \leftarrow 1 : \mathbb{N}_0$
   \FOR[$n$ Durchläufe]{$i \leftarrow 0$ \TO $n-1$}
     \FOR{$j \leftarrow i$ \TO $i$}
       \STATE $temp \leftarrow temp \cdot 2$ \COMMENT{Multiplikation}
     \ENDFOR
     \STATE $result \leftarrow result + temp$ \COMMENT{Addition}
     \STATE $temp \leftarrow 1$
   \ENDFOR
   \RETURN $result$
\end{algorithmic}
\end{algorithm}

答案1

这是一个algorithmicx执行:

在此处输入图片描述

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{algorithm,algcompatible,amssymb,amsmath}
\renewcommand{\COMMENT}[2][.5\linewidth]{%
  \leavevmode\hfill\makebox[#1][l]{//~#2}}
\algnewcommand\algorithmicto{\textbf{to}}
\algnewcommand\RETURN{\State \textbf{return} }
\begin{document}

\begin{algorithm}
  \caption{$\text{function}(n : \mathbb{N}_0) : \mathbb{N}_0$}\label{algo1}
  \begin{algorithmic}[1]
    \REQUIRE $n \in \mathbb{N}_0$
    \STATE $\text{result} \leftarrow 0 : \mathbb{N}_0$
    \STATE $\text{temp} \leftarrow 1 : \mathbb{N}_0$
    \FOR{$i \leftarrow 0$ \algorithmicto{} $n-1$} \COMMENT{$n$ Durchläufe}
      \FOR{$j \leftarrow i$ \algorithmicto{} $i$}
        \STATE $\text{temp} \leftarrow \text{temp} \cdot 2$ \COMMENT{Multiplikation}
      \ENDFOR
      \STATE $\text{result} \leftarrow \text{result} + \text{temp}$ \COMMENT{Addition}
      \STATE $\text{temp} \leftarrow 1$
    \ENDFOR
    \RETURN $\text{result}$
  \end{algorithmic}
\end{algorithm}
\end{document}

\COMMENT[<len>]{<stuff>}重新格式化以将注释放在宽度为(默认值为)<stuff>的框中,与右侧对齐。您可以根据自己的喜好进行调整。<len>.5\linewidth


algorithmic实现方式有些不同:

\usepackage{letltxmacro}

\newlength{\commentindent}
\setlength{\commentindent}{.5\textwidth}
\makeatletter
\renewcommand{\algorithmiccomment}[1]{\unskip\hfill\makebox[\commentindent][l]{//~#1}\par}
\LetLtxMacro{\oldalgorithmic}{\algorithmic}
\renewcommand{\algorithmic}[1][0]{%
  \oldalgorithmic[#1]%
  \renewcommand{\ALC@com}[1]{%
    \ifnum\pdfstrcmp{##1}{default}=0\else\algorithmiccomment{##1}\fi}%
}
\makeatother

它使用 e-TeX(用于字符串比较),但可以更改。实现差异的原因主要是因为循环的处理方式algorithmic- 注释作为循环结构的可选参数插入。因此,很难在实现中允许长度参数的另一个可选参数,如上所示algorithmicx。解决方法是定义一个长度\commentindent,以与可选参数处理事物类似的方式处理此问题。

以下是完整的实现,具有相同的输出:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{algorithm,algorithmic,amssymb,amsmath,letltxmacro}
\newlength{\commentindent}
\setlength{\commentindent}{.5\textwidth}
\makeatletter
\renewcommand{\algorithmiccomment}[1]{\unskip\hfill\makebox[\commentindent][l]{//~#1}\par}
\LetLtxMacro{\oldalgorithmic}{\algorithmic}
\renewcommand{\algorithmic}[1][0]{%
  \oldalgorithmic[#1]%
  \renewcommand{\ALC@com}[1]{%
    \ifnum\pdfstrcmp{##1}{default}=0\else\algorithmiccomment{##1}\fi}%
}
\makeatother

\begin{document}

\begin{algorithm}
  \caption{$\text{function}(n : \mathbb{N}_0) : \mathbb{N}_0$}\label{algo1}
  \begin{algorithmic}[1]
    \REQUIRE $n \in \mathbb{N}_0$
    \STATE $\text{result} \leftarrow 0 : \mathbb{N}_0$
    \STATE $\text{temp} \leftarrow 1 : \mathbb{N}_0$
    \FOR[$n$ Durchläufe]{$i \leftarrow 0$ \TO $n-1$}
      \FOR{$j \leftarrow i$ \TO $i$}
        \STATE $\text{temp} \leftarrow \text{temp} \cdot 2$ \COMMENT{Multiplikation}
      \ENDFOR
      \STATE $\text{result} \leftarrow \text{result} + \text{temp}$ \COMMENT{Addition}
      \STATE $\text{temp} \leftarrow 1$
    \ENDFOR
    \RETURN $\text{result}$
  \end{algorithmic}
\end{algorithm}
\end{document}

相关内容