Personalización del paquete algorítmico: etiquetas de interrupción y bucle.

Personalización del paquete algorítmico: etiquetas de interrupción y bucle.

Me gustaría agregar dos personalizaciones al paquete algorítmico: introducir un nuevo comando de interrupción y tener la posibilidad de proporcionar etiquetas al BUCLE para que break {label}quede claro a qué bucle se refiere. Intenté introducir el comando break de esta manera:

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

pero esto no funciona, aparece el error de comando desconocido cuando escribo\BREAK

Sin embargo, con este truco puedo hacerlo funcionar, pero es muy desagradable:

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

Las etiquetas LOOP no tengo idea de cómo introducirlas.

ACTUALIZACIÓN: mi ejemplo completo

    \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}

Respuesta1

Aquí hay una modificación agregada aalgorithmicque le permite \BREAKtener un bucle anotado \ALOOP(y \ENDALOOP). Se basa en una copia de las combinaciones regulares \LOOPy \ENDLOOP, con un parámetro agregado para anotaciones. Por supuesto, son posibles más modificaciones:

ingrese la descripción de la imagen aquí

\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}​

También sería posible modificarlo \BREAKpara tomar un argumento si desea anotarlo también (como salir de un bucle específico, por ejemplo).

Para completar, he corregido el uso de \bf. Como tal, ver¿Importa si uso \textito \it, \bfserieso \bf, etc.?y¿Los comandos de estilo de fuente de dos letras ( \bf,, \it...) alguna vez resucitarán en LaTeX?

Respuesta2

Todo esto es mucho más fácil si utilizas elpaquete algoritmicx, tiene mucha más funcionalidad y funciona mejor con otros paquetes:

\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}

información relacionada