笔记:

笔记:

我正在使用该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>}

这些节点名称topbottomright是任意的,因此如果您在同一算法中有多个位置想要放置此类注释,则可以使用不同的节点名称。只需将它们传递给宏即可\AddNote

笔记:

  • 这确实需要两次运行。第一次确定位置,第二次进行绘图。

进一步增强:

  • 该宏\AddNote可以接受节点文本和线条颜色选择的附加格式参数。目前,这被硬编码为使用redtext width=2.5cm

参考:

以下是一些类似的应用程序\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 行)创建一个零高度对象(适当大小的\smashed array),然后让 LaTeX 完成剩下的工作。

相关内容