我在用算法编写大文本注释时遇到了问题。第二个注释行从语句索引开始,填充 0。有什么解决方案可以强制第二行注释行从第一级开始吗?如下所示。
插入代码开头直到问题行。整个代码相当大。
\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{В случае, когда строка находится среди строк, которые должны быть выбраны, матрица либо содержит нули, либо неправильной структуры.}
答案1
您可以使用linegoal
、定义\Longcomment
来容纳不适合该行的注释。
这个\tpd
技巧很古老,可以确保行距均匀。
我相信这也将起作用breakablealgorithm
。
请注意“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}