If EndIf 内の除算アルゴリズム

If EndIf 内の除算アルゴリズム

これは次の質問に対するフォローアップですLatex によるアルゴリズムのオプション

コードは次のとおりです:

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

このアルゴリズムを if-else 内で分割しようとすると、\algrestore{testcont}機能しません。何かアイデアはありますか?

答え1

\algsaveアルゴリズムを破る-方法に頼る代わりに\algrestore、 経由の「ページ分割アルゴリズム」を使用してアルゴリズムを破ることができます\vsplit。引用元:トピック別TeX(セクション27.5\vsplit、p 230):

ユーザーは、\vsplit操作を通じてページ区切り操作を利用できます。

\setbox1 = \vsplit2 to \dimen3

ボックスの1サイズの上部をボックスに割り当てます。この素材は実際にはボックスから削除されます。\dimen322

アルゴリズムを設定しました浮動小数点数を(ボックス レジスタ)algorithmに入力し、それを(上位 10 個のベースラインを含む) と残りを(残ったもの) に分割します。\algbox\algboxtop\algbox

さらに、「続き」のキャプションを可能にするために、\caption*(提供されている)を使用することができます。caption) といくつかの相互参照をまとめました。

ここに画像の説明を入力してください

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

関連情報