
알고리즘 패키지에 두 가지 사용자 정의를 추가하고 싶습니다. 새로운 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
or \it
, \bfseries
또는 \bf
등을 사용하는 것이 중요합니까?그리고LaTeX에서 두 글자 글꼴 스타일 명령( \bf
, \it
, …)이 부활할 예정입니까?
답변2
다음을 사용하면 이 모든 것이 훨씬 쉬워집니다.알고리즘믹x 패키지, 훨씬 더 많은 기능을 갖고 있으며 다른 패키지와 더 잘 작동합니다.
\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}