アルゴリズムで長い文をインデントする方法

アルゴリズムで長い文をインデントする方法

ここに画像の説明を入力してください

このアルゴリズム形式では、「j 番目を考慮して...」が改行されても全体を通して同じインデントになるようにします。

コードは次のとおりです。

\documentclass{article}
\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\makeatletter
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother
\begin{document}
\begin{algorithm}
\caption{hello}\label{euclid}
\begin{algorithmic}[1]
\Procedure{ASAPP}{}
\State $\textit{i} \gets \text{0}$, $\textit{j} \gets \text{0}$, $\textit{k} \gets \text{0}$
\While {i $\leq$ nom}
\While {j $\leq C_{i}$}
\State Considering the \textit{j}th edge of the \textit{i}th metabolite, \textit{x} and \textit{y} contains the vertices of the \textit{j}th edge
\State $\textit{k} \gets \text{\textit{j} + 1}$
\While { k $\leq C_{i}$}
\State Considering the \textit{k}th edge of the \textit{i}th metabolite, \textit{x1} and \textit{y1} contains the vertices of the \textit{k}th edge.
\EndWhile
\EndWhile
\EndWhile
\BState \emph{top}:
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}

答え1

使用できますtabularx行の終わりまで収まるボックスの幅を計算します。

ここに画像の説明を入力してください

\documentclass{article}

\usepackage{amsmath,algorithm,tabularx}
\usepackage[noend]{algpseudocode}

\makeatletter
\newcommand{\multiline}[1]{%
  \begin{tabularx}{\dimexpr\linewidth-\ALG@thistlm}[t]{@{}X@{}}
    #1
  \end{tabularx}
}
\makeatother

\begin{document}

\begin{algorithm}
  \caption{hello}
  \begin{algorithmic}[1]
    \Procedure{ASAPP}{}
      \State $i \gets 0$, $j \gets 0$, $k \gets 0$
      \While { $i \leq \text{nom}$ }
        \While {$j \leq C_i$ }
          \State \multiline{%
            Considering the $j$-th edge of the $i$-th metabolite,~$x$ and~$y$ 
            contains the vertices of the $j$-th edge}
          \State $k \gets j + 1$
          \While { $k \leq C_i$ }
            \State \multiline{%
              Considering the $k$-th edge of the $i$-th metabolite,~$x_1$ and~$y_1$ 
              contains the vertices of the $k$-th edge.}
          \EndWhile
        \EndWhile
      \EndWhile
    \EndProcedure
  \end{algorithmic}
\end{algorithm}

\end{document}

\multiline{<stuff>}は、その内容を-column内の optabularxに揃えて設定します。この列の幅は、通常の列の幅から現在のアルゴリズムの行インデントを引いた差です。[t]X\linewidth

答え2

手動で改行しても問題ない場合は、aが\Longunderstack[l]{}選択肢となる。

\documentclass{article}
\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\usepackage{stackengine}
\setstackEOL{\\}
\makeatletter
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother
\begin{document}
\begin{algorithm}
\caption{hello}\label{euclid}
\begin{algorithmic}[1]
\Procedure{ASAPP}{}
\State $\textit{i} \gets \text{0}$, $\textit{j} \gets \text{0}$, 
  $\textit{k} \gets \text{0}$
\While {i $\leq$ nom}
\While {j $\leq C_{i}$}
\State \Longunderstack[l]{Considering the \textit{j}th edge of the
   \textit{i}th metabolite, \textit{x} and \textit{y}\\ 
  contains the vertices of the \textit{j}th edge}
\State $\textit{k} \gets \text{\textit{j} + 1}$
\While { k $\leq C_{i}$}
\State \Longunderstack[l]{Considering the \textit{k}th edge of the 
   \textit{i}th metabolite, \textit{x1} and \textit{y1}\\ 
  contains the vertices of the \textit{k}th edge.}
\EndWhile
\EndWhile
\EndWhile
\BState \emph{top}:
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}

ここに画像の説明を入力してください

関連情報