Как можно набрать алгоритм со столбцами, как в CLRS (Введение в алгоритмы)?

Как можно набрать алгоритм со столбцами, как в CLRS (Введение в алгоритмы)?

В Введение в алгоритмы, Томас Кормен, есть некоторые алгоритмы, как на этом изображении. С одним столбцом для кода, одним для стоимости и одним для времени.

Я много искал, но так и не нашел, как это сделать.

введите описание изображения здесь

решение1

Вот что бы я сделал, если бы не использовал clrscode.

\documentclass[11pt]{article}

\usepackage[noend]{algorithmic}

\newcommand{\TITLE}[1]{\item[#1]}
\renewcommand{\algorithmiccomment}[1]{$/\!/$ \parbox[t]{4.5cm}{\raggedright #1}}
% ugly hack for for/while
\newbox\fixbox
\renewcommand{\algorithmicdo}{\setbox\fixbox\hbox{\ {} }\hskip-\wd\fixbox}
% end of hack
\newcommand{\algcost}[2]{\strut\hfill\makebox[1.5cm][l]{#1}\makebox[4cm][l]{#2}}

\begin{document}
\begin{algorithmic}[1]
  \TITLE{\textsc{Insertion-Sort}$(A)$}
    \algcost{\textit{cost}}{\textit{times}}
  \FOR{$j=2$ \TO $A.\mathit{length}$
    \algcost{$c_1$}{$n$}}
  \STATE $\mathit{key} = A[j]$
    \algcost{$c_2$}{$n-1$}
  \STATE \COMMENT{Insert $A[j]$ to the sorted sequence $A[1..j-1]$}
    \algcost{$0$}{$n-1$}
  \STATE $i = j-1$
    \algcost{$c_4$}{$n-1$}
  \WHILE{$i>0$ \AND $A[i]>key$
    \algcost{$c_5$}{$\sum_{j=2}^{n} t_j$}}
  \STATE $A[i+1]= A[i]$
    \algcost{$c_6$}{$\sum_{j=2}^{n} (t_j-1)$}
  \STATE $i = i-1$
    \algcost{$c_7$}{$\sum_{j=2}^{n} (t_j-1)$}
  \ENDWHILE
  \STATE $A[i+1] = \mathit{key}$
    \algcost{$c_8$}{$n-1$}
  \ENDFOR
\end{algorithmic}
\end{document}

Обратите внимание на несколько вещей:

  1. Есть три значения ширины (в сантиметрах), которые, возможно, придется подкорректировать.

  2. Стоимость операторов forи whileнаходится внутри скобок, и между ними и закрывающей скобкой не должно быть пробела. Это немного хрупко. То же самое для ifи всех других операторов блока.

  3. Стоимость строки 3 отображается рядом с первой из двух строк, а не со второй (как в оригинале). Так было проще, но, думаю, мне тоже так больше нравится.

Этот ответ идет по противоположному пути по сравнению с ответом Jubobs, который использует пакет clrscode. Если вы предпочитаете использовать clrscode, я уверен, вы найдете способ правильного использования |>для табуляции дополнительных столбцов, хотя это не очень хорошо документировано. Кроме того, это может быть предпочтительнее и по другим причинам, если вы хотите, чтобы ваши алгоритмы выглядели точно так же, как в книге.


результат

решение2

(Только частичный ответ)

Кормен использовал свойclrscodeупаковкадля второго издания CLRS, а его «усиленная» версия, называемаяclrscode3e, для третьего издания, из которогоСортировка вставкойАлгоритм на вашем скриншоте взят. Для получения более подробной информации см.этот.

Код для набора алгоритма (нобезстолбцы «стоимость» и «время») можно найти на странице 6clrscode3eдокументация. В последнем не упоминается, как набирать столбцы. Кроме того, исходный код пакета, похоже, не предоставляет никакого (недокументированного) механизма для этого.

Однако среда Кормена codeboxоснована на tabbingсреде; возможно, там есть что-то, что можно сделать, но я не настолько хорошо с этим знаком tabbing...

введите описание изображения здесь

\documentclass{article}

\usepackage{clrscode3e}

\begin{document}

\begin{codebox}
\Procname{$\proc{Insertion-Sort}(A)$}
\li \For $j \gets 2$ \To $\attrib{A}{length}$
\li     \Do
            $\id{key} \gets A[j]$
\li         \Comment Insert $A[j]$ into the sorted sequence
                $A[1 \twodots j-1]$.
\li         $i \gets j-1$
\li         \While $i > 0$ and $A[i] > \id{key}$
\li             \Do
                    $A[i + 1] = A[i]$
\li                 $i \gets i-1$
                \End
\li         $A[i+1] \gets \id{key}$
        \End
\end{codebox}

\end{document}

решение3

Существует пакет CLRS, кодовое название "clrscode3e", описание пакета, а также сам .styфайл доступны на сайте:http://www.cs.dartmouth.edu/~thc/clrscode/, вы можете легко скачать .styфайл, а также прочитать описание.

\documentclass{article}

\usepackage{clrscode3e}

\begin{document}

\begin{codebox}
\Procname{$\proc{Insertion-Sort}(A)$}
\li \For $j \gets 2$ \To $\attrib{A}{length}$
\li     \Do
            $\id{key} \gets A[j]$
\li         \Comment Insert $A[j]$ into the sorted sequence
                $A[1 \twodots j-1]$.
\li         $i \gets j-1$
\li         \While $i > 0$ and $A[i] > \id{key}$
\li             \Do
                    $A[i + 1] = A[i]$
\li                 $i \gets i-1$
                \End
\li         $A[i+1] \gets \id{key}$
        \End
\end{codebox}
\end{document}

Связанный контент