3

I have a problem writing big text comment in algorithmic. The second like starts with 0 padding from statement indexing. Is there any solution to force second comment line start on level of first? Here how it looks like. enter image description here

Inserting start of code till the problem line. Whole code is pretty big.

\begin{breakablealgorithm}
    \caption{Inverse}\label{alg:inverse}
    \begin{algorithmic}[1]
        \Require Матрица $Z\in \mathbb{Z}_2^{b \times b}$, $S$ - набор неиспользованных столбцов размера $d$, на первой итерации $S$ пуст.
        \Ensure $Z^{\dagger}$, требованиям из предыдущей главы, обновленный набор $S$.
        \State $p \gets$ \text{тривиальная перестановка для матрицы размера $b$}
        \State $d \gets$ Размер перестановки $p$.
        \State $ipiv$  \Comment{Перестановка для финального восстановления $Z^{\dagger}$,  изначально пуста. Новые элементы перестановки добавляются парами вида (индекс, индекс)}.
        \State $D$ \Comment{Массив из пар вида (индекс, Правда/Ложь), необходим для решение системы методов Гаусса в конце алгоритма.}
        \State $R \gets Z$
        \State В $R$ переставить столбцы и строки с индексами из $S$ в начало матрицы, обновить перестановку $p$, в перестановку $ipiv$ добавить пары с соответствующими значениями. 
        \State $rank \gets b$ \Comment{Предполагаем, что матрица $R$ полного ранга}
        \State \textbf{Цель:} найти разложение $Z = P^T R^T D R P$, где $P$ матрица перестановки, $R$ верхне-треугольная матрица размера $r \times b$ c единичной диагональю, $D$ матрица размера $r \times r$. При этом $D$ --- блочно-диагональная матрица, с блоками на диагонали размера $1 \times 1$ или $2 \times 2$. При этом блоки $2 \times 2$ имеют вид $\begin{array}{c|c} 0 & 1  \\ \hline 1 & 0 \end{array}$ или $\begin{array}{c|c} 0 & 1  \\ \hline 1 & 1 \end{array}$
        
        \State $i \gets 0$
        \While{$i < rank$}
            \State Рассмотрим i-тую строку матрицы $R$.
            \State $j \gets$ Индекс ненулевого элемента в i-ой строке начиная с i-того столбца 
            \If{$j \ge rank$}
                \If{$i < d$} \Comment{В случае, когда строка находится среди строк, которые должны быть выбраны, матрица либо содержит нули, либо неправильной структуры.}

4
  • 1
    Welcome! Could you please add a minimal example of code that shows the issue? There are several package for dealing with algorithms; you mention algorithmic, but we can't guess your input.
    – egreg
    Apr 21 at 12:58
  • 1
    @egreg Added part of code till problem line. breakablealgorithm is something I taken from stackexchange to make algorithm breakable between pages.
    – nezudem
    Apr 21 at 13:05
  • Welcome. // Can you please reduce and extend the code, so it compiles? I.e. documentclass and package(s) are mising, probably just one or two lines will be enough to show your problem, digesting russian text may or may not cause hickups in non-cyrillic setups etc. Thank you
    – MS-SPO
    Apr 21 at 13:36
  • 1
    @MS-SPO oops sorry, my bad. Got the answer already. Will do it next time.
    – nezudem
    Apr 21 at 13:52

1 Answer 1

5

You may use linegoal, defining \Longcomment in order to accommodate comments that don't fit in the line.

The \tpd trick is an old one that ensures even spacing between lines.

I believe this will also work with breakablealgorithm.

Please, note the treatment of multiletter variables such as “rank”.

\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}
\usepackage{amsmath,amssymb}
\usepackage{algorithm,algpseudocode}
\usepackage{linegoal}

\newlength{\commentwidth}
\newlength{\commentcharwidth}
\newcommand{\Longcomment}[1]{%
  \settowidth{\commentcharwidth}{$\triangleright$ }%
  \setlength{\commentwidth}{\linegoal}%
  \addtolength{\commentwidth}{-\commentcharwidth}%
  \Comment{\parbox[t]{\commentwidth}{#1\par\xdef\tpd{\the\prevdepth}}}%
  \par\nointerlineskip\prevdepth=\tpd
}

\begin{document}

\begin{algorithm}

\caption{Inverse}\label{alg:inverse}

\begin{algorithmic}[1]
  \Require Матрица $Z\in \mathbb{Z}_2^{b \times b}$, $S$ - набор неиспользованных 
           столбцов размера $d$, на первой итерации $S$ пуст.
  \Ensure $Z^{\dagger}$, требованиям из предыдущей главы, обновленный набор $S$.
  \State $p \gets$ \text{тривиальная перестановка для матрицы размера $b$}
  \State $d \gets$ Размер перестановки $p$.
  \State $\mathit{ipiv}$
         \Longcomment{Перестановка для финального восстановления $Z^{\dagger}$,
           изначально пуста. Новые элементы перестановки добавляются парами вида
           (индекс, индекс).}
  \State $D$
         \Longcomment{Массив из пар вида (индекс, Правда/Ложь), необходим для
           решение системы методов Гаусса в конце алгоритма.}
  \State $R \gets Z$
  \State В $R$ переставить столбцы и строки с индексами из $S$ в начало
         матрицы, обновить перестановку $p$, в перестановку $ipiv$ добавить
         пары с соответствующими значениями. 
  \State $\mathit{rank} \gets b$ \Comment{Предполагаем, что матрица $R$ полного ранга}
  \State \textbf{Цель:} найти разложение $Z = P^T R^T D R P$, где $P$ матрица
         перестановки, $R$ верхне-треугольная матрица размера $r \times b$ c
         единичной диагональю, $D$ матрица размера $r \times r$.
         При этом $D$ --- блочно-диагональная матрица, с блоками на диагонали
         размера $1 \times 1$ или $2 \times 2$. При этом блоки $2 \times 2$
         имеют вид $\begin{array}{c|c} 0 & 1  \\ \hline 1 & 0 \end{array}$
         или $\begin{array}{c|c} 0 & 1  \\ \hline 1 & 1 \end{array}$      
  \State $i \gets 0$
  \While{$i < \mathit{rank}$}
    \State Рассмотрим i-тую строку матрицы $R$.
    \State $j \gets$ Индекс ненулевого элемента в i-ой строке начиная с i-того столбца 
    \If{$j \ge \mathit{rank}$}
      \If{$i < d$}
        \Longcomment{В случае, когда строка находится среди строк, которые
          должны быть выбраны, матрица либо содержит нули, либо
          неправильной структуры.}
      \EndIf
    \EndIf
  \EndWhile
\end{algorithmic}

\end{algorithm}

\end{document}

enter image description here

0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .