
私は[1]に示されているフロー図にdo-whileループを使用して複数のループ文を記述しようとしています。しかし、インデントの管理が難しいようです。この問題について誰か助けてくれませんか?
\documentclass{article}
\usepackage{algorithmicx}
\usepackage{algpseudocode}
\algdef{SE}[DOWHILE]{Do}{doWhile}{\algorithmicdo}[1]{\algorithmicwhile\ #1}%
\begin{document}
\begin{algorithmic}
\Do
\State a,b,c,d,e,m,n
\doWhile{$!f$} % <--- use \doWhile for the "while" at the end
$g$
\Do
\State abc
\doWhile{$!h$}
$i$
\Do
\State Pv
\doWhile{$!j$}
$r s t $
% \doWhile{$!$}
% \State l
\end{algorithmic}
\end{document}
問題はインデントです。
答え1
プログラム テキスト内の空白は通常、プログラミング言語では無視されますが、一般的な慣習では、プログラムを読みやすくするためにインデントが使用されます。この目的を達成するには、通常、インデントはプログラムの構造を反映する一貫したスタイルに従う必要があります。
あなたがお持ちのコードでは、プログラムの構造を追うことができません。残念ながら、algorithmicx
パッケージ(その文書) も構造に従わず、期待どおりにコードをインデントしません。
特に、私には(そしてalgorithmicx
また)以下がわかりません:
とは何か
$g$
。抽象的な文であれば、適切にインデントして と書く必要があります。および\State $g$
についても同様です。$i$
$r s t$
なぜ、下の行が真下ではなく右に
$g$
インデントされることを期待するのでしょうか。これは、 が、その本体が下の行まで続く何らかの形式のブロック ステートメント (例: ) を表す場合にのみ説明できます。$g$
$g$
while
得られた結果 (不足している\State
マクロと\medskip
垂直スペースを追加するためのマクロを追加した後) は、プログラムの構造を反映していますalgorithmicx
。
一方、ブロック ヘッダーの後に任意のインデントを導入したい場合は、この目的のために新しいタイプのブロックを定義できます ( という名前を付けました\Arbitrary{header} ... \endArbitrary
)。
\documentclass{article}
\usepackage{algorithmicx}
\usepackage{algpseudocode}
\algdef{SE}[DOWHILE]{Do}{doWhile}{\algorithmicdo}[1]{\algorithmicwhile\ #1}%
\algblockdefx[ARBITRARY]{Arbitrary}{endArbitrary}[1]{#1}
\begin{document}
\begin{algorithmic}
\Do
\State a,b,c,d,e,m,n
\doWhile{$!f$} % <--- use \doWhile for the "while" at the end
\medskip
\Arbitrary{$g$}
\medskip
\Do
\State abc
\doWhile{$!h$}
\medskip
\State $i$
\Do
\State Pv
\doWhile{$!j$}
\medskip
\State $r s t $
\endArbitrary
\end{algorithmic}
\end{document}
結果は次のようになります:
答え2
以下は、私が LaTex で書いたネストされた Do-While ベースの疑似コードです。誰かがこれをチェックし、将来同じ問題に遭遇する可能性のある他の人に使用できます。
\documentclass[11pt]{article}
\usepackage[fleqn]{amsmath}
\usepackage[ruled,vlined]{algorithm2e}
\PassOptionsToPackage{noend}{algpseudocode}
\usepackage{algpseudocode}
%%%%%%%%%%%%%%%%%%
%% DoWhile algorithm macro definition
\makeatletter
\newcommand*{\algrule}[1][\algorithmicindent]{\makebox[#1][l]{\hspace*{.5em}\vrule height .75\baselineskip depth .25\baselineskip}}
\newcount\ALG@printindent@tempcnta
\def\ALG@printindent{%
\ifnum \theALG@nested>0% is there anything to print
\ifx\ALG@text\ALG@x@notext% is this an end group without any text?
% do nothing
\addvspace{-3pt}% FUDGE for cases where no text is shown, to make the rules line up
\else
\unskip
% draw a rule for each indent level
\ALG@printindent@tempcnta=1
\loop
\algrule[\csname ALG@ind@\the\ALG@printindent@tempcnta\endcsname]%
\advance \ALG@printindent@tempcnta 1
\ifnum \ALG@printindent@tempcnta<\numexpr\theALG@nested+1\relax% can't do <=, so add one to RHS and use < instead
\repeat
\fi
\fi
}
\usepackage{etoolbox}
% the following line injects our new indent handling code in place of the default spacing
\patchcmd{\ALG@doentity}{\noindent\hskip\ALG@tlm}{\ALG@printindent}{}{\errmessage{failed to patch}}
\makeatother
% end vertical rule patch for algorithmicx
\algdef{SE}[DOWHILE]{Do}{doWhile}{\algorithmicdo}[1]{\algorithmicwhile\ #1}%
\begin{algorithm}%\captionsetup{labelfont={sc,bf}, labelsep=newline}
\caption{Workspace boundary determination}
\label{alg:PoEG}
\begin{algorithmic}
\State Input $z_0,~z_f,~n,~m$
\State \quad \quad ~ $\Delta_z = \dfrac{z_0-z_f}{n}, \textit{tol}$
\State \quad \quad ~ $\varepsilon_f= 2\pi~, \Delta\varepsilon = \dfrac{\varepsilon_f}{m}$
\State \quad \quad ~ $k_{\textup{max}}, \Delta\alpha_0, i = j=1$
\medskip
\State Output $\boldsymbol{\theta}, \boldsymbol{\psi}, \boldsymbol{z} $
\medskip
\State initialize ~$z \gets z_0,~ \psi=\theta =\gets \emptyset$
\Do
\Do
\Do
\Do
\State $\Delta\psi = \psi + \Delta\alpha c\varepsilon$
\State $\Delta\theta = \theta + \Delta\alpha s\varepsilon $
\State $\psi = \psi +\Delta\varepsilon$
\State $\theta = \psi + \Delta\varepsilon$
\State Compute $\boldsymbol{J}_{dh}$
\State $k = cond(\boldsymbol{J}_{dh})$
\doWhile{$k<k_{max}$}
\State $\psi = \psi -\Delta\varepsilon$
\State $\theta = \psi - \Delta\varepsilon$
\State $\Delta\alpha = \Delta\alpha/2$
\doWhile{$\Delta\alpha > tol $}
\State $\psi(i,j) = \psi $
\State $\theta(i,j) = \theta $
\State $ j =j+1$
\State $\Delta\alpha = \Delta\alpha_0$
\State $\varepsilon = \varepsilon + \Delta\varepsilon$
\doWhile{$\varepsilon < 2\pi$}
\State $ \theta =0$
\State $\psi =0$
\State $\varepsilon =0$
\State $\Delta\alpha=\Delta\alpha_0$
\State $i=i+1$
\State $z_i=z+\Delta_z$
\doWhile{$z<z_f$} \\ % <--- use \doWhile for the "while" at the end
plot$(\boldsymbol{\psi},\boldsymbol{\theta},\boldsymbol{z})$\\ \medskip Note: $s$ and $c$ stands for sine and cosine, respectively.
%\endArbitrary
\end{algorithmic}
\end{algorithm}
\end{document}