
Я хотел бы добавить две настройки в алгоритмический пакет: ввести новую команду 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}