終了キーワードを使用せずに、アルゴリズム疑似コードに垂直線のインデントを正しく作成するにはどうすればよいですか?

終了キーワードを使用せずに、アルゴリズム疑似コードに垂直線のインデントを正しく作成するにはどうすればよいですか?

私はこれを見つけました答えそしてそれを適用したのですが、これが結果です。

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

これは私のコードです。

\documentclass[conference]{IEEEtran}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{dsfont}
\usepackage{algorithm}
\PassOptionsToPackage{noend}{algpseudocode}% comment out if want end's to show
\usepackage{algpseudocode}

\makeatletter
% start with some helper code
% This is the vertical rule that is inserted
\newcommand*{\algrule}[1][\algorithmicindent]{\makebox[#1][l]{\hspace*{.5em}\vrule height .75\baselineskip depth .25\baselineskip}}%

\newcount\ALG@printindent@tempcnta
\def\ALG@printindent{%
    \ifnum \theALG@nested>0% is there anything to print
    \ifx\ALG@text\ALG@x@notext% is this an end group without any text?
    % do nothing
    \addvspace{-3pt}% FUDGE for cases where no text is shown, to make the rules line up
    \else
    \unskip
    % draw a rule for each indent level
    \ALG@printindent@tempcnta=1
    \loop
    \algrule[\csname ALG@ind@\the\ALG@printindent@tempcnta\endcsname]%
    \advance \ALG@printindent@tempcnta 1
    \ifnum \ALG@printindent@tempcnta<\numexpr\theALG@nested+1\relax% can't do <=, so add one to RHS and use < instead
    \repeat
    \fi
    \fi
}%
\usepackage{etoolbox}
% the following line injects our new indent handling code in place of the default spacing
\patchcmd{\ALG@doentity}{\noindent\hskip\ALG@tlm}{\ALG@printindent}{}{\errmessage{failed to patch}}
\makeatother
% end vertical rule patch for algorithmicx
\makeatother


\begin{document}

\IEEEpeerreviewmaketitle

    \begin{algorithm}
        \caption{Arbitrary Algorithm}\label{IS2OSLS}
        \begin{algorithmic}[1]
            \Require A matrix $\mathbf{A}$ of size $m\times n$.
            \Ensure Something.
            \For{$i$ in $m$}
                \For{$j$ in $n$}
                    \If{$i=j$}
                        \State Select a random action
                    \Else
                        \If{$i=j+1$}
                            \State Stay silent 
                        \Else 
                            \State Break
                        \EndIf
                    \EndIf
                \EndFor
            \EndFor
        \end{algorithmic}
    \end{algorithm}
\end{document}

キーワードの最初の文字の直後から垂直線が始まるようにしたいのですが、つまり、キーワードの場合、for垂直線は の後から始まります。f上の図では、垂直線は の後でoはなく の後から始まりますf。また、示されているように、キーワードのない疑似コードも必要ですend

ありがとう。

編集

垂直線を少し左に移動するには、\hspace*{.5em}に変更します。これは解決しました。しかし、アルゴリズムの最後で線が重なるのはなぜですか? (キーワードを追加すれば問題は解決します。)\hspace*{.1em}end

答え1

重複の原因となっている命令\addvspaceは削除してください。また、「終了」タグが省略されたときに不要な垂直スペースを回避する別のパッチも追加しました。algpseudocode と noend による偽の空白

ルールを左に移動するには、\hspace{.5em}発見したとおり を実行します。例では を使用しました.2em

次のコードでは必要なパッケージのみを残しました。

\documentclass[conference]{IEEEtran}

\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\usepackage{etoolbox}

\makeatletter
% start with some helper code
% This is the vertical rule that is inserted
\newcommand*{\algrule}[1][\algorithmicindent]{%
  \makebox[#1][l]{%
    \hspace*{.2em}% <------------- This is where the rule starts from
    \vrule height .75\baselineskip depth .25\baselineskip
  }
}

\newcount\ALG@printindent@tempcnta
\def\ALG@printindent{%
    \ifnum \theALG@nested>0% is there anything to print
    \ifx\ALG@text\ALG@x@notext% is this an end group without any text?
    % do nothing
    \else
    \unskip
    % draw a rule for each indent level
    \ALG@printindent@tempcnta=1
    \loop
    \algrule[\csname ALG@ind@\the\ALG@printindent@tempcnta\endcsname]%
    \advance \ALG@printindent@tempcnta 1
    \ifnum \ALG@printindent@tempcnta<\numexpr\theALG@nested+1\relax
    \repeat
    \fi
    \fi
}
% the following line injects our new indent handling code in place of the default spacing
\patchcmd{\ALG@doentity}{\noindent\hskip\ALG@tlm}{\ALG@printindent}{}{\errmessage{failed to patch}}
\patchcmd{\ALG@doentity}{\item[]\nointerlineskip}{}{}{} % no spurious vertical space
% end vertical rule patch for algorithmicx
\makeatother

\begin{document}

\IEEEpeerreviewmaketitle

\begin{algorithm}
\caption{Arbitrary Algorithm}\label{IS2OSLS}

\begin{algorithmic}[1]
  \Require A matrix $\mathbf{A}$ of size $m\times n$.
  \Ensure Something.
  \For{$i$ in $m$}
    \For{$j$ in $n$}
      \If{$i=j$}
        \State Select a random action
      \Else
        \If{$i=j+1$}
          \State Stay silent 
        \Else 
          \State Break
        \EndIf
      \EndIf
    \EndFor
  \EndFor
\end{algorithmic}

\end{algorithm}

\end{document}

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

関連情報