
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
- \algrestore
para 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
\vsplit
operación.\setbox1 = \vsplit2 to \dimen3
asigna al cuadro
1
la parte superior del tamaño\dimen3
del cuadro2
. Este material en realidad se sacó de la caja2
.
Configuramos el algoritmoafuerael algorithm
flotador 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.
\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}