Anpassen des Algorithmuspakets: Break- und Loop-Beschriftungen

Anpassen des Algorithmuspakets: Break- und Loop-Beschriftungen

Ich möchte dem Algorithmikpaket zwei Anpassungen hinzufügen: einen neuen Break-Befehl einführen und die Möglichkeit haben, der Schleife Beschriftungen zuzuweisen, damit break {label}klar ist, auf welche Schleife sich bezieht. Ich habe versucht, den Break-Befehl folgendermaßen einzuführen:

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

aber das funktioniert nicht, ich bekomme den unbekannten Befehlsfehler, wenn ich tippe\BREAK

Mit diesem Hack kann ich es allerdings zum Laufen bringen, allerdings ist es sehr unschön:

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

Ich weiß nicht, wie ich die LOOP-Labels vorstellen soll.

UPDATE: mein vollständiges Beispiel

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

Antwort1

Hier ist eine Änderung hinzugefügt zualgorithmicDamit können Sie eine kommentierte Schleife (und ) \BREAKverwenden . Sie basiert auf einer Kopie der regulären und -Kombinationen mit einem zusätzlichen Parameter für die Kommentierung. Natürlich sind auch weitere Modifikationen möglich:\ALOOP\ENDALOOP\LOOP\ENDLOOP

Bildbeschreibung hier eingeben

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

Es wäre auch möglich, die Änderung so vorzunehmen \BREAK, dass ein Argument übernommen wird, wenn Sie das ebenfalls mit Anmerkungen versehen möchten (beispielsweise um aus einer bestimmten Schleife auszubrechen).

Der Vollständigkeit halber habe ich Ihre Verwendung von korrigiert \bf. Siehe daherIst es wichtig, ob ich \textitoder \it, \bfseriesoder \bfusw. verwende?UndWerden zweistellige Schriftstilbefehle ( \bf,, \it…) jemals in LaTeX wiederbelebt?

Antwort2

Dies alles ist viel einfacher, wenn Sie diealgorithmicx-Paket, es hat viel mehr Funktionen und funktioniert besser mit anderen Paketen:

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

verwandte Informationen