突出显示 algorithm2e 环境的多行

突出显示 algorithm2e 环境的多行

我偶然发现了这个问题的解决方案:如何在算法中突出显示我的代码部分?
并将其合并到以下 MWE 中,该 MWE 显示出两个缺陷:

\documentclass{article}
\usepackage[linesnumbered,lined,ruled,commentsnumbered]{algorithm2e}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{fit,calc}
\newcommand*{\tikzmk}[1]{\tikz[remember picture,overlay,] \node (#1) {};\ignorespaces}
%define a boxing command, argument = colour of box
\newcommand{\boxit}[1]{\tikz[remember picture,overlay]{\node[yshift=3pt,fill=#1,opacity=.25,fit={(A)($(B)+(.95\linewidth,.8\baselineskip)$)}] {};}\ignorespaces}

\begin{document}
\begin{algorithm}[h]
 \caption{MWE}
 a $\leftarrow$ b \;
 \If{$x > 0$}{
    \tikzmk{A}\If{$x > 0$}{
        a $\leftarrow b$ \;
    }\tikzmk{B}\boxit{cyan}
 }
\end{algorithm}
\end{document}

在此处输入图片描述

  1. 解决方案是插入一条额外的线(图中第 6 行)
  2. 解决方案是将框绘制到边界之外(参见右边界)

就缺陷 2 而言,我增强了 boxit 命令,使其也能将当前缩进级别作为参数,即

\documentclass{article}
\usepackage[linesnumbered,lined,ruled,commentsnumbered]{algorithm2e}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{fit,calc}
\newcommand*{\tikzmk}[1]{\tikz[remember picture,overlay,] \node (#1) {};\ignorespaces}
%define a boxing command, argument = colour of box
\newcommand{\boxit}[2]{\tikz[remember picture,overlay]{\node[yshift=3pt,fill=#1,opacity=.25,fit={(A)($(B)+(\dimexpr\algowidth-#2\algoskipindent,.8\baselineskip)$)}] {};}\ignorespaces}

\begin{document}
\begin{algorithm}[h]
 \caption{MWE}
 a $\leftarrow$ b \;
 \If{$x > 0$}{
    \tikzmk{A}\If{$x > 0$}{
        a $\leftarrow b$ \;
    }\tikzmk{B}\boxit{cyan}{2}
 }
\end{algorithm}
\end{document}

在此处输入图片描述

这对我来说没问题,但我无法通过附加行消除缺陷 1,有什么建议吗?

答案1

当第二次复制该algorithm块时,您的代码似乎提供了一些剩余的问题。

因此,这里有一种使用包来实现的方法tcolorbox。您可以为设置更多选项tcolorbox,例如删除黑弧等。第 3 行似乎是渲染突出显示区域所必需的。

有无 tcolorbox 算法相同

\documentclass{article}
\usepackage[linesnumbered,lined,ruled,commentsnumbered]{algorithm2e}
\usepackage{tcolorbox}% <<<

\begin{document}

    \begin{algorithm}[h]
        \caption{MWE with tcolorbox}
        a $\leftarrow$ b \;

        \If{$x > 0$}{
        \begin{tcolorbox}% <<<
            \If{$x > 0$}{
                a $\leftarrow$ b ;
            }
        \end{tcolorbox}% <<<
        }
    \end{algorithm}


    \begin{algorithm}[h]
        \caption{MWE with tcolorbox}
        a $\leftarrow$ b;

        \If{$x > 0$}{
            \If{$x > 0$}{
                a $\leftarrow$ b;
            }
        }
    \end{algorithm}
\end{document}

答案2

如果您只需要突出显示某些行,那么可以使用包xcolor和的替代方法soul,其中定义了一个具有一些限制的soul突出显示命令:\hl{}

高亮代码

\documentclass{article}
\usepackage[linesnumbered,lined,ruled,commentsnumbered]{algorithm2e}
\usepackage{xcolor, soul}% <<<
\sethlcolor{yellow}% <<<

\begin{document}
Here is \hl{some text.}

    \begin{algorithm}[h]
        \caption{MWE with color}
        a $\leftarrow$ b \;

        \If{$x > 0$}{
            \If{$x > 0$}{% can't be included in \hl{}
                \hl{a $\leftarrow$ b ;}% <<<
            }
        }
    \end{algorithm}


    \begin{algorithm}[h]
        \caption{MWE with tcolorbox}
        a $\leftarrow$ b;

        \If{$x > 0$}{
            \If{$x > 0$}{
                a $\leftarrow$ b;
            }
        }
    \end{algorithm}
\end{document}

相关内容