我偶然发现了这个问题的解决方案:如何在算法中突出显示我的代码部分?
并将其合并到以下 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}
- 解决方案是插入一条额外的线(图中第 6 行)
- 解决方案是将框绘制到边界之外(参见右边界)
就缺陷 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 行似乎是渲染突出显示区域所必需的。
\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}