# algorithm2e vertical line indentation

I really like the vertical line feature of algorithm2e, but I ran into trouble with it when I try to indent an if statement. I used the following code.

\documentclass{article}
\usepackage{amssymb,amsthm,fullpage,amsmath}
\usepackage[ruled,vlined,boxed]{algorithm2e}

\begin{document}

\begin{algorithm}[H]
\caption{\bf Generic Line Search Algorithm}

{\bf Inputs:} Starting point $x_0$, initial step size parameter $\alpha_0$. \\
\For{$k = 0,1,2,\dots$}{
\nl {\bf Gradient approximation $g(x_k)$:}\\ \Indp
Compute an approximation $g(x_k)$ of $\nabla \phi(x_k)$. \\ \Indm
\nl {\bf Construct a search direction $d_k$:}\\ \Indp
Construct a search direction $d_k$, e.g., $d_k = - g(x_k)$.\\ \Indm
\nl {\bf Compute step size $\alpha_k$ and update the iterate:} \\ \Indp
\eIf{sufficient decrease condition is satisfied}{
$x_{k+1} = x_k - \alpha_k d_k$ and $\alpha_{k+1} \gets \tau^{-1} \alpha_k$
}{
$x_{k+1} = x_k$ and $\alpha_{k+1} \gets \tau \alpha_k$
}
}
\end{algorithm}

\end{document}


The texts were indented but the vertical lines in the if statement were not, as shown in the picture. Does anyone know how to indent the vertical lines?

• Similar to tex.stackexchange.com/q/299679. It seems this is a known and not solved problem that \vlined and \Indp do not work properly together. I will try to investigate this. May 18, 2020 at 6:42

Try this:

• \skiptext (before vline space) and \skiprule (after vline space) are additionally updated inside indent adjusting command.
• No change to algorithm input.
\documentclass{article}
%\usepackage{amssymb,amsthm,fullpage,amsmath}
\usepackage[ruled,vlined,boxed]{algorithm2e}

\makeatletter
\renewcommand{\Indentp}{%
\renewcommand{\Indpp}{\Indentp{0.5em}}%
\renewcommand{\Indmm}{\Indentp{-0.5em}}%
\makeatother

\begin{document}
\begin{algorithm}[H]
\caption{\bfseries OP's example}

\textbf{Inputs:} Starting point $x_0$, initial step size parameter $\alpha_0$. \\
\For{$k = 0,1,2,\dots$}{
\nl \textbf{Gradient approximation $g(x_k)$:}\\ \Indp
Compute an approximation $g(x_k)$ of $\nabla \phi(x_k)$. \\ \Indm
\nl \textbf{Construct a search direction $d_k$:}\\ \Indp
Construct a search direction $d_k$, e.g., $d_k = - g(x_k)$.\\ \Indm
\nl \textbf{Compute step size $\alpha_k$ and update the iterate:} \\ \Indp
\eIf{sufficient decrease condition is satisfied}{
$x_{k+1} = x_k - \alpha_k d_k$ and $\alpha_{k+1} \gets \tau^{-1} \alpha_k$
}{
$x_{k+1} = x_k$ and $\alpha_{k+1} \gets \tau \alpha_k$
}
}
\end{algorithm}

\begin{algorithm}
\caption{More tests}
\nl test \\
\eIf{sufficient decrease condition is satisfied}{
if clause
}{
else clause
}
\nl test \\ \Indp\Indp
\eIf{sufficient decrease condition is satisfied}{
if clause
}{
else clause
} \Indm
\nl test \\
\eIf{sufficient decrease condition is satisfied}{
if clause
}{
else clause
}
\end{algorithm}
\end{document}


Notes:

• \Indp (or \Indm) increases (or reduces) indentation by \algoskipindent (aka "step").
• This might not be the perfect solution, since I have not fully understand the algorithm2e internals \algocf@Vline and \algocf@Vsline.
• Thank you. I am not an advanced user of Latex, but it seems like you just debugged the package. Could you elaborate what \skiptext, \skiprule, and \algoskipindent are, or if there is a good read on this? May 18, 2020 at 20:00
• @LiyuanCao Added some notes to my answer. Hope that helps. May 19, 2020 at 1:18

As said in the comments using vertical lines with \indp and \indm is a little buggy. The alternative is to turn the Compute step size into a block and thus allow the algorithm2e package to handle the indentation on its own in a better way.

This is done using \SetKwBlock{Begin}{begin}{end} macro:

\SetKwBlock{NewBlock}{Compute step size $\alpha_k$ and update the iterate:}{}


This would indent the if nicely, however, it would also add a vertical line for the new Compute step size block. To remove that vertical line we add \SetAlgoNoLine and \SetAlgoVlined.

MWE:

\documentclass{article}
\usepackage{amssymb,amsthm,fullpage,amsmath}
\usepackage[ruled,vlined,boxed]{algorithm2e}

\begin{document}

\begin{algorithm}[H]
\DontPrintSemicolon
\SetKwBlock{NewBlock}{Compute step size $\alpha_k$ and update the iterate:}{}
\caption{\bf Generic Line Search Algorithm}

\KwIn{Starting point $x_0$, initial step size parameter $\alpha_0$.}\;
\For{$k = 0,1,2,\dots$}{
\nl {\bf Gradient approximation $g(x_k)$:}\;
\Indp Compute an approximation $g(x_k)$ of $\nabla \phi(x_k)$.\;

\Indm \nl {\bf Construct a search direction $d_k$:}\;
\Indp Construct a search direction $d_k$, e.g., $d_k = - g(x_k)$.\;

\Indm\nl\SetAlgoNoLine\NewBlock{ \SetAlgoVlined\eIf{sufficient decrease condition is satisfied}{
$x_{k+1} = x_k - \alpha_k d_k$ and $\alpha_{k+1} \gets \tau^{-1} \alpha_k$\;
}{
$x_{k+1} = x_k$ and $\alpha_{k+1} \gets \tau \alpha_k$\;
}
}
}
\end{algorithm}

\end{document}


And the outcome: Notice the following improvements from OP's MWE:

1. At the end of each line \; is used (no need for \\). In order not to print semicolons we use DontPrintSemicolon.
2. We use algorithm2e built-in \KwIn macro.
• This is how I wanted to solve this problem originally, but I was not familiar with keyword blocks enough. One question: what is the benefit of using \; instead of \\? May 18, 2020 at 20:02
• The package documentation stresses that you must not forget to end each line with \;. It does so in a couple of places, and I think that has to do with the way the package identifies an end of line. May 19, 2020 at 6:39