настройка алгоритмического пакета: метки прерывания и цикла

настройка алгоритмического пакета: метки прерывания и цикла

Я хотел бы добавить две настройки в алгоритмический пакет: ввести новую команду break и иметь возможность предоставлять метки LOOP, чтобы break {label}было понятно, к какому циклу он относится. Я попытался ввести команду break следующим образом:

\newcommand{\algorithmicbreak}{\textbf{break}}

но это не сработает, я получаю сообщение об ошибке неизвестной команды, когда я ввожу\BREAK

Однако с помощью этого хака я могу заставить это работать, но это очень неудобно:

\renewcommand{\algorithmicprint}{\textbf{break}}
% then use it as 
\PRINT

Я понятия не имею, как представить метки LOOP.

ОБНОВЛЕНИЕ: мой полный пример

    \begin{algorithm}
    \renewcommand{\algorithmicrequire}{\textbf{Input:}}
    \renewcommand{\algorithmicensure}{\textbf{Output:}}
    \renewcommand{\algorithmicprint}{\textbf{break}}
    \caption{\text{My-Algorithm}}
    \label{algo:blah}
    \begin{algorithmic}[1]
    \REQUIRE X
    \ENSURE Y
    % STEP 1
    \STATE \COMMENT{{\bf Step 1}} some something
    \LOOP % can't annotate the loop :(((
        % STEP 2
        \STATE \COMMENT{{\bf Step 2}} do something more
        \IF {$a = b$}
            \RETURN $c$
        \ELSE
            \LOOP % can't annotate the loop :(((
                % STEP 3
                \STATE \COMMENT{{\bf Step 3}} do some more
                \IF {$b = c$}
                    \STATE $y = x$
                    \PRINT % intending to break
                \ELSE
                    % STEP 4
                    \STATE \COMMENT{{\bf Step 4}} and yet some more
                \ENDIF
            \ENDLOOP
        \ENDIF
    \ENDLOOP
    \end{algorithmic}
    \end{algorithm}

решение1

Вот модификация, добавленная кalgorithmicчто позволяет вам \BREAKи иметь аннотированный цикл \ALOOP\ENDALOOP). Он основан на копии обычных комбинаций \LOOPи \ENDLOOPс добавленным параметром для аннотации. Конечно, возможны и другие модификации:

введите описание изображения здесь

\documentclass{article}
\usepackage{algorithm,algorithmic}% http://ctan.org/pkg/algorithms

% Algorithmic modifications
\makeatletter
\newcommand{\ALOOP}[1]{\ALC@it\algorithmicloop\ #1%
  \begin{ALC@loop}}
\newcommand{\ENDALOOP}{\end{ALC@loop}\ALC@it\algorithmicendloop}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\newcommand{\algorithmicbreak}{\textbf{break}}
\newcommand{\BREAK}{\STATE \algorithmicbreak}
\makeatother

\begin{document}
\begin{algorithm}
  \caption{My-Algorithm}\label{algo:blah}
  \begin{algorithmic}[1]
  \show\LOOP
    \REQUIRE X
    \ENSURE Y
    % STEP 1
    \STATE \COMMENT{\textbf{Step 1}} some something
    \ALOOP {outer} % Outer loop
        % STEP 2
        \STATE \COMMENT{\textbf{Step 2}} do something more
        \IF {$a = b$}
            \RETURN $c$
        \ELSE
            \ALOOP {inner} % Inner loop
                % STEP 3
                \STATE \COMMENT{\textbf{Step 3}} do some more
                \IF {$b = c$}
                    \STATE $y = x$
                    \BREAK % intending to break
                \ELSE
                    % STEP 4
                    \STATE \COMMENT{\textbf{Step 4}} and yet some more
                \ENDIF
            \ENDALOOP
        \ENDIF
    \ENDALOOP
  \end{algorithmic}
\end{algorithm}
\end{document}​

Также можно было бы модифицировать \BREAKего так, чтобы он принимал аргумент, если вы хотите аннотировать и его (например, выход из определенного цикла).

Для полноты я исправил ваше использование \bf. Таким образом, см.Имеет ли значение, использую ли я \textitили \it, \bfseriesили \bfи т. д.иБудут ли когда-нибудь возрождены в LaTeX двухбуквенные команды стилей шрифта ( \bf, \it, …)?

решение2

Все это гораздо проще, если вы используетепакет algoritmicx, он имеет гораздо больше функциональности и лучше работает с другими пакетами:

\documentclass[12pt]{report}
\usepackage[a4paper,tmargin=1.25in, bmargin=1.25in, lmargin=1.25in, rmargin=1.25in]{geometry}

\usepackage{algpseudocode}
\newcommand{\Break}{\State \textbf{break} }
\algblockdefx[Loop]{Loop}{EndLoop}[1][]{\textbf{Loop} #1}{\textbf{End Loop}}
\begin{document}

Here is an example:

\begin{algorithmic}[1]
\Require Integers $a >0$ and $b$
\Ensure $a\cdot b$
\State $i\leftarrow 0$
\State $c \leftarrow 0$
\Loop{1}
    \If{$i=a$}
        \Break Loop 1
    \EndIf
    \State $c \leftarrow c + b$
    \State $i \leftarrow i + 1$
\EndLoop
\State \textbf{return} $c$
\end{algorithmic}

\end{document}

Связанный контент