我正在使用 algorithm2e 包,并注意到它有一个很棒的功能,即可以在代码“块”内连接垂直线(参见algorithmicx 中使用“noend”选项的垂直循环/块线例如)。我试图添加类似的垂直线来连接不一定是 if/else/while 等块中的代码,而只是为了跟踪缩进。
以下是可重现的示例:
\documentclass{article}
\usepackage[vlined]{algorithm2e}
\begin{document}
\DontPrintSemicolon
\begin{algorithm}[H]
\SetAlgoLined
\KwData{Example keyword}
\KwResult{Example result}
/* \textit{Create first function}\;
function 1 = function(input, output)\{\;
\Indp/* \textit{Create inner function}\;
function 2 = function(input, output)\{\;
\Indp/* \textit{Perform main task}\;
mainTask(function1, function2)\;
\Indm\})\;
\Indm\}\;
\caption{Psuedocode for interactive scatterplot matrix}
\end{algorithm}
\end{document}
我正在尝试在缩进处添加垂直线。我的目标最终产品(我叠加了绿色线条)的示例如下所示:
如果您能就如何在这个最小工作示例中实现这些类型的线条提出任何建议,我们将不胜感激!
答案1
在下文中,algorithm2e
需要定义一个块来添加垂直线。这需要一个关键字。由于每个函数的第一行都没有关键字,因此我使用\SetKwBlock{arg1}{arg2}{arg3}
为每个第一行定义一个关键字。arg1
保存关键字,arg2
保存第一行的文本,并且arg3
有一个空格。请注意,每个关键字后面的文本都括在括号中以提供嵌套。
代码中提供了额外的注释。
\documentclass{article}
\usepackage[lined]{algorithm2e} %Changed vlined to lined
\begin{document}
\DontPrintSemicolon
\begin{algorithm}[H]
%\SetAlgoLined May be removed as unnecessary
\SetInd{0.2em}{1.3em} %Moved vertical bar to the left, default is 0.5 and 1.0
\KwData{Example keyword}
\KwResult{Example result}
/* \textit{Create first function} \;
\SetKwBlock{Fna}{\textnormal{function 1 = function(input, output)\{ }}{}
\Fna{
/* \textit{Create inner function} \;
\SetKwBlock{Fnb}{\textnormal{function 2 = function(input, output)\{ }}{}
\Fnb{
/* \textit{Perform main task} \;
mainTask(function1, function2) \;
}\}\; %Removed unmatch parenthesis
}\}\;
\caption{Psuedocode for interactive scatterplot matrix}
\end{algorithm}
\end{document}
答案2
这里有一个替代解决方案,它使用内部\algocf@group
宏来创建新的块作用域。定义函数的代码也被移到了一个新的宏中,\Func
以提供更清晰的算法定义。它的第一个参数是参数列表,第二个参数是函数主体。
\documentclass{article}
\usepackage[vlined]{algorithm2e}
\makeatletter
\newcommand\Func[2]{%
function(#1)\{%
\algocf@group{#2}%
\}\;%
}
\makeatother
\SetInd{0.15em}{1em}
\DontPrintSemicolon
\begin{document}
\begin{algorithm}[H]
\SetAlgoLined
\KwData{Example keyword}
\KwResult{Example result}
/* \textit{Create first function}\;
function 1 = \Func{input, output}{
/* \textit{Create inner function}\;
function 2 = \Func{input, output}{
/* \textit{Perform main task}\;
mainTask(function1, function2)\;
}
}
\caption{Psuedocode for interactive scatterplot matrix}
\end{algorithm}
\end{document}