我想创建一个如下所示的伪代码环境:
基本上,字体不会改变 - 它与周围文本的字体相同。它允许数学模式。并且它周围有一个框,该框垂直和水平地适合内容(具有一些预定义的边距),然后将整个框水平居中在页面上。
我怎样才能做到这一点?
答案1
您可以将该tabbing
环境与个人环境一起使用:
\documentclass[a4paper]{article}
\usepackage{amsmath}
\newenvironment{boxedcode}
{\setlength{\fboxsep}{1em}%
\begin{lrbox}{\boxedcodebox}
\begin{minipage}{\dimexpr\textwidth-2\fboxsep-2\fboxrule\relax}
\begin{tabbing}}
{\end{tabbing}
\end{minipage}
\end{lrbox}%
\fbox{\usebox{\boxedcodebox}}}
\newsavebox{\boxedcodebox}
\begin{document}
\begin{figure}
\centering
\begin{boxedcode}
Inputs: $s_{j}{k}$, \= $j=1,\dots,M-i$, $k=1,\dots,d$ as in \eqref{whatever}\\
\> and $h_1,\dots,h_M$ ($h_l=t_l-t_{l-1}$)\\[\baselineskip]
$A_\mathrm{prev}(k)\leftarrow 0$, $k=1,\dots,d$\\
for \= $j=1,\dots,M-i$\\
\> $B_\mathrm{next}\leftarrow 0$\\
\> for \= $k=1,\dots,d$\\
\> \> $A_\mathrm{next}(k)\leftarrow A_\mathrm{prev}(k)+s_j(k)*h_{i+j}$\\
\> \> $B_\mathrm{next}\leftarrow B_\mathrm{next}+A_\mathrm{next}(k)*A_\mathrm{next}(k)$\\
\> \> $A_\mathrm{prev}(k)\leftarrow A_\mathrm{next}(k)$\\
\> end\\
\> $m_j\leftarrow (B_\mathrm{next}-B_\mathrm{prev})/(2h_{i+j})$\\
\> $B_\mathrm{prev}\leftarrow B_\mathrm{next}$\\
end\\
return $m_1,\dots,m_{M-i}$
\end{boxedcode}
\caption{Calculation of discrete drift parameters}\label{algo:drift}
\end{figure}
\end{document}
正如 Martin Scharrer 指出的那样,可以通过加载包来简化环境的代码adjustbox
:
\usepackage{adjustbox}
\newenvironment{boxedcode}
{\setlength{\fboxsep}{1em}%
\begin{adjustbox}{minipage=\textwidth-2\fboxsep-2\fboxrule,fbox}
\begin{tabbing}}
{\end{tabbing}
\end{adjustbox}}
这样就避免了分配箱子的需要。
下面是一个允许分页符的版本(当然在环境中不应该设置它figure
):
\usepackage{mdframed}
\newenvironment{boxedcode}
{\setbox\boxedcodebox=\vbox\bgroup
\begin{tabbing}}
{\end{tabbing}\egroup
\begin{mdframed}[
leftmargin=\dimexpr(\textwidth-1em-\fboxrule-\wd\boxedcodebox)/2\relax,
rightmargin=\dimexpr(\textwidth-1em-\fboxrule-\wd\boxedcodebox)/2\relax,
innerleftmargin=1em,
innerrightmargin=1em,
innertopmargin=1em,
innerbottommargin=1em,
skipabove=\topsep,
]
\vskip-\baselineskip\unvbox\boxedcodebox
\end{mdframed}
}
\newsavebox{\boxedcodebox}
\newlength{\boxedcodewd}
环境应该始终以空行开头和结尾,并且不是放置在center
环境中,因为定心已经由设置的参数处理好了。
如果使用的类是book
键leftmargin
和,应该用和rightmargin
替换。innermargin
outermargin
请保留内部填充空间。
答案2
如果您不需要奇异的控制结构,您也可以查看算法包。它提供了一组自动对齐的语句。不过,可能需要进行一些调整。示例的精简版本:
\documentclass{article}
\pagestyle{empty}
\usepackage{algorithmic}
\renewcommand{\algorithmicrequire}{\textbf{Inputs:}}
\begin{document}
and each $A_\mathrm{next}(k)$ records a quantity of the form
\[
\sum_{\ell=i}^j \hat{\sigma}(t_{i-1},t_\ell)h_{\ell+1}.
\]
\centerline{\fbox{
\begin{minipage}{7cm}
\begin{algorithmic}
\REQUIRE $s_j(k), j=1,\ldots,M-i$ as in (3.101) and $h_1,\ldots,h_m$
\STATE $A_\mathrm{prev}(k)\gets0,\, k=1,\ldots,d$
\FOR{$j=1,\ldots,M-1$}
\STATE $B_\mathrm{next}(k)\gets0$
\FOR{$j=1,\ldots,d$}
\STATE $A_\mathrm{prev}(k)\gets A_\mathrm{next}(k)$
\ENDFOR
\ENDFOR
\RETURN $m_1,\ldots,m_{M-i}$
\end{algorithmic}
\end{minipage}}}
\end{document}
答案3
您可以使用该包float
创建自定义环境。请参阅wikibooks:自定义浮点数。
(1)导入包并创建环境,例如pseudocode
:
\usepackage{float} % Import of the package.
\floatstyle{boxed} % This creates the box around your environment.
\newfloat{pseudocode}{htb}{lop}[chapter] % Placing and numbering.
\floatname{pseudocode}{Pseudocode} % Name of the float displayed in the document.
(2)在您需要图形的位置,添加您创建的环境:
\begin{pseudocode}
\centering
% add anything you want here ...
\caption{My pseudocode!}
\label{code:mycode}
\end{pseudocode}
更新- 对齐确实不是一件容易的事。您可以使用带\fbox
边框的迷你页面。
\begin{center}
\fbox{
\begin{minipage}[htb]{0.5\textwidth} % width 50%
% add anything you want here ...
\end{minipage}
}
\end{center}