我正在使用该algorithmic
软件包(或者甚至algorithm2e
可以使用)。是否可以使用花括号将算法中的某些行分组,以便能够将解释放在右侧?
答案1
下面是一个使用臭名昭著的\tikzmark
宏的示例,应用于如何使用 LaTeX 伪代码环境排版 goto 和标签?。
用法:
- 用 标记水平位置:
\tikzmark{right}
。这里我使用了标题右节点的末尾procedure Euclid(a,b) as the
。因此括号的水平位置。 - 在支架顶部标记:
\tikzmark{top}
。 - 用 标记支架底部
\tikzmark{bottom}
。 - 称呼
\AddNote{<top node>}{<bottom node>}{<right node>}{<text>}
。
这些节点名称top
、bottom
和right
是任意的,因此如果您在同一算法中有多个位置想要放置此类注释,则可以使用不同的节点名称。只需将它们传递给宏即可\AddNote
。
笔记:
- 这确实需要两次运行。第一次确定位置,第二次进行绘图。
进一步增强:
- 该宏
\AddNote
可以接受节点文本和线条颜色选择的附加格式参数。目前,这被硬编码为使用red
和text width=2.5cm
。
参考:
\tikzmark
来自在正文旁边添加大括号。
以下是一些类似的应用程序\tikzmark
:
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand*{\AddNote}[4]{%
\begin{tikzpicture}[overlay, remember picture]
\draw [decoration={brace,amplitude=0.5em},decorate,ultra thick,red]
($(#3)!(#1.north)!($(#3)-(0,1)$)$) --
($(#3)!(#2.south)!($(#3)-(0,1)$)$)
node [align=center, text width=2.5cm, pos=0.5, anchor=west] {#4};
\end{tikzpicture}
}%
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\begin{document}
\algnewcommand{\algorithmicgoto}{\textbf{go to}}%
\algnewcommand{\Goto}[1]{\algorithmicgoto~\ref{#1}}%
\begin{algorithm}
\caption{Euclid’s algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\tikzmark{right}\Comment{The g.c.d. of a and b}
\State $r\gets a\bmod b$
\While{$r\not=0$} \tikzmark{top}\Comment{We have the answer if r is 0} \label{marker}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile \tikzmark{bottom}
\State \textbf{return} $b$\Comment{The gcd is b}
\State \Goto{marker}
\EndProcedure
\end{algorithmic}
\AddNote{top}{bottom}{right}{We loop here until $r=0$.}
\end{algorithm}
\end{document}
答案2
以下是执行此括号分组的更传统方法(使用 Peter 的示例):
\documentclass{article}
\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\begin{document}
\algnewcommand{\algorithmicgoto}{\textbf{go to}}%
\algnewcommand{\Goto}[1]{\algorithmicgoto~\ref{#1}}%
\begin{algorithm}
\caption{Euclid’s algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{The g.c.d. of a and b}
\State $r\gets a\bmod b$
\While{$r\not=0$} \Comment{We have the answer if r is 0}\label{marker}
\State $a\gets b$
\State $b\gets r$\hspace*{4em}%
\rlap{\smash{$\left.\begin{array}{@{}c@{}}\\{}\\{}\\{}\\{}\end{array}\color{red}\right\}%
\color{red}\begin{tabular}{l}We loop here\\until $r=0$.\end{tabular}$}}
\State $r\gets a\bmod b$
\EndWhile
\State \textbf{return} $b$\Comment{The gcd is b}
\State \Goto{marker}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
该方法类似于一组方程式,垂直对齐,单独标记,带有子方程式和单独的标签。其理念是在正确的位置(本例中为第 5 行)创建一个零高度对象(适当大小的\smash
ed array
),然后让 LaTeX 完成剩下的工作。