将 algorithm 中的注释与 algorithm2e 包对齐

将 algorithm 中的注释与 algorithm2e 包对齐

我正在使用 algorithm2e 包。当使用这样的注释时

\documentclass[11pt,a4paper,twoside,openright]{book}
\usepackage[algochapter,linesnumbered,ruled,lined,boxed]{algorithm2e}
\begin{document}
\begin{algorithm}
    \tcp{not aligned comment}
    \If(\tcp*[h]{comment next to if}){constraint}{ 
         c  \tcp*[l]{bla}
         $d = \min \{c,e\}$ \tcp*[l]{minimum}
    }      

\end{algorithm}
\end{document}

结果是

// not aligned comment
if constraint then // comment next to if 
   c; // bla
   d = min{c,e}; // minimum
end

我希望大家的意见保持一致,即

// not aligned comment
if constraint then       // comment next to if
   c;                    // bla
   d = min{c,e};         // minimum
end

我只找到了 algorithmicx 包的答案:Algpseudocode(algorithmicx)包注释

答案1

这会将它们刷新到右侧,填充到最长的注释,这样就可以对齐//了。需要运行几次才能进行测量。我添加了一些$以避免在尝试 MWE 时产生的错误。

在此处输入图片描述

\documentclass{article}
\usepackage{algorithm2e}

\makeatletter
\newdimen\commentwd
\let\oldtcp\tcp
\def\tcp*[#1]#2{% only support one style for simplicity
\setbox0\hbox{#2}%
\ifdim\wd\z@>\commentwd\global\commentwd\wd\z@\fi
\oldtcp*[r]{\leavevmode\hbox to \commentwd{\box0\hfill}}}

\let\oldalgorithm\algorithm
\def\algorithm{\oldalgorithm
\global\commentwd\z@
\expandafter\ifx\csname commentwd@\romannumeral\csname c@\algocf@float\endcsname\endcsname\relax\else
\global\commentwd\csname commentwd@\romannumeral\csname c@\algocf@float\endcsname\endcsname
\fi
}
\let\oldendalgorithm\endalgorithm
\def\endalgorithm{\oldendalgorithm
\immediate\write\@auxout{\gdef\expandafter\string\csname commentwd@\romannumeral\csname c@\algocf@float\endcsname\endcsname{%
\the\commentwd}}}

\begin{document}
\begin{algorithm}
    c  \tcp*[l]{bla}
    $d = \min \{c,e\}$ \tcp*[l]{minimum}
\end{algorithm}
\end{document}

答案2

这是我使用 algorithm2e 的解决方案。想法是使用右对齐注释 ( \tcp*[r]),并将它们放在固定长度的框中\commentWidth。重要内容被包裹在“对齐注释”宏中,\atcp以方便使用。

\documentclass[11pt,a4paper,twoside,openright]{book}
\usepackage[algochapter,linesnumbered,ruled,lined,boxed]{algorithm2e}
\begin{document}

\newlength{\commentWidth}
\setlength{\commentWidth}{7cm}
\newcommand{\atcp}[1]{\tcp*[r]{\makebox[\commentWidth]{#1\hfill}}}

\begin{algorithm}
    \tcp{not aligned comment}
    \If(\tcp*[h]{comment next to if}){constraint}{ 
         c  \atcp{bla}
         $d = \min \{c,e\}$ \atcp{minimum}
    }      

\end{algorithm}
\end{document}

其结果是:

尼玛

但是,我不知道如何在 if 样式块后对齐注释。

相关内容