Algoritmo de división dentro de If EndIf

Algoritmo de división dentro de If EndIf

Esta es una pregunta de seguimiento paraOpción en el algoritmo con Latex.

Este es el código:

\begin{document}
\begin{algorithm}
  \caption{My algorithme}
  \begin{algorithmic}[1]
    \Donnees: My data
    \Statex% Blank line
    \Debut
      \LState $r\gets a\bmod b$
      \While{$r\not=0$}\Comment{We have the answer if r is 0}
        \LState $a\gets b$
        \LState $b\gets r$
        \LState $r\gets a\bmod b$
        \If {condition}
          \LState instruction
          \algstore{testcont} 
  \end{algorithmic}
\end{algorithm}

\begin{algorithm}[H]
  \caption{\textit{second Part}
  \begin{algorithmic}[1]
          \algrestore{testcont}  
        \EndIf
      \EndWhile\label{euclidendwhile}
      \LState \textbf{Retour} $b$\Comment{The gcd is b}
    \Fin
  \end{algorithmic}
\end{algorithm}

\end{document}

Cuando intento dividir este algoritmo dentro de if--else, ¡ \algrestore{testcont}no funciona! ¿Tienes una idea por favor?

Respuesta1

En lugar de confiar en el método \algsave- \algrestorepara romper un algoritmo, podemos romperlo usando el "algoritmo de salto de página" a través de \vsplit. Citando deTeX por tema(sección27,5\vsplit, pág. 230):

La operación de salto de página está disponible para el usuario a través de la \vsplitoperación.

\setbox1 = \vsplit2 to \dimen3

asigna al cuadro 1la parte superior del tamaño \dimen3del cuadro 2. Este material en realidad se sacó de la caja 2.

Configuramos el algoritmoafuerael algorithmflotador en \algbox(un registro de caja) y luego divídalo en \algboxtop(que contiene las 10 líneas de base principales) y el resto en \algbox(lo que quede).

Además, para permitir un título "continuo", podemos usar \caption*(proporcionado porcaption) junto con algunas referencias cruzadas.

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{algorithm,algpseudocode,caption}

\makeatletter
\renewcommand{\ALG@name}{Algorithme}% Algorithm in French
\newcommand{\algorithmname}{\ALG@name}
\algnewcommand{\Debut}{\Statex \textbf{D\'ebut}\pushindent}
\algnewcommand{\Fin}{\Statex \textbf{Fin}\popindent}

% This is the vertical rule that is inserted
\def\therule{\makebox[\algorithmicindent][l]{\hspace*{.5em}\vrule height .75\baselineskip depth .25\baselineskip}}%

\newtoks\therules% Contains rules
\therules={}% Start with empty token list
\def\appendto#1#2{\expandafter#1\expandafter{\the#1#2}}% Append to token list
\def\gobblefirst#1{% Remove (first) from token list
  #1\expandafter\expandafter\expandafter{\expandafter\@gobble\the#1}}%
\def\LState{\State\unskip\the\therules}% New line-state
\def\pushindent{\appendto\therules\therule}%
\def\popindent{\gobblefirst\therules}%
\def\printindent{\unskip\the\therules}%
\def\printandpush{\printindent\pushindent}%
\def\popandprint{\popindent\printindent}%

%      ***      DECLARED LOOPS      ***
% (from algpseudocode.sty)
\algdef{SE}[WHILE]{While}{EndWhile}[1]
  {\printandpush\textbf{Tant que} #1}
  {\popandprint\textbf{Fin Tant que}}%
\algdef{SE}[FOR]{For}{EndFor}[1]
  {\printandpush\algorithmicfor\ #1\ \algorithmicdo}
  {\popandprint\algorithmicend\ \algorithmicfor}%
\algdef{S}[FOR]{ForAll}[1]
  {\printindent\algorithmicforall\ #1\ \algorithmicdo}%
\algdef{SE}[LOOP]{Loop}{EndLoop}
  {\printandpush\algorithmicloop}
  {\popandprint\algorithmicend\ \algorithmicloop}%
\algdef{SE}[REPEAT]{Repeat}{Until}
  {\printandpush\algorithmicrepeat}[1]
  {\popandprint\algorithmicuntil\ #1}%
\algdef{SE}[IF]{If}{EndIf}[1]
  {\printandpush\algorithmicif\ #1\ \algorithmicthen}
  {\popandprint\algorithmicend\ \algorithmicif}%
\algdef{C}[IF]{IF}{ElsIf}[1]
  {\popandprint\pushindent\algorithmicelse\ \algorithmicif\ #1\ \algorithmicthen}%
\algdef{Ce}[ELSE]{IF}{Else}{EndIf}
  {\popandprint\pushindent\algorithmicelse}%
\algdef{SE}[PROCEDURE]{Procedure}{EndProcedure}[2]
   {\printandpush\algorithmicprocedure\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
   {\popandprint\algorithmicend\ \algorithmicprocedure}%
\algdef{SE}[FUNCTION]{Function}{EndFunction}[2]
   {\printandpush\algorithmicfunction\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
   {\popandprint\algorithmicend\ \algorithmicfunction}%
\newcommand{\Donnees}{\State \textbf{Input}}
\makeatother

\newsavebox{\algbox}
\newsavebox{\algboxtop}
%\newsavebox{\algboxbottom}

\begin{document}


\setbox\algbox=\vbox{%
\begin{algorithmic}[1]
  \Donnees\strut: My data
  \Statex% Blank line
  \Debut
    \LState $r \gets a \bmod b$
    \While{$r \neq 0$}\Comment{We have the answer if~$r$ is~$0$}
      \LState $a \gets b$
      \LState $b \gets r$
      \LState $r \gets a \bmod b$
      \If {condition}
        \LState instruction
      \EndIf
    \EndWhile\label{euclidendwhile}
    \LState \textbf{Retour} $b$\Comment{The gcd is $b$}
  \Fin\strut
\end{algorithmic}
}
% Break algorithm into 2 parts: Top in \algoboxtop, bottom in \algbox
\global\setbox\algboxtop = \vsplit\algbox to 10\baselineskip%


\begin{algorithm}[H]
  \caption{My algorithme}\label{alg:first}
  % Capture entire algorithm inside \algbox (a \vbox)
  \usebox{\algboxtop}% Set top box
\end{algorithm}

\begin{algorithm}[H]
  % http://tex.stackexchange.com/a/33076/5764
  \caption*{\textbf{\algorithmname~\ref{alg:first}}\ My algorithme (continued)}
  \usebox{\algbox}
\end{algorithm}

\end{document}

información relacionada