用于编写常规字体伪代码的环境

用于编写常规字体伪代码的环境

我想创建一个如下所示的伪代码环境:

来源 cl.ly/3O2W203g3j1I3T080x37

基本上,字体不会改变 - 它与周围文本的字体相同。它允许数学模式。并且它周围有一个框,该框垂直和水平地适合内容(具有一些预定义的边距),然后将整个框水平居中在页面上。

我怎样才能做到这一点?

答案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环境中,因为定心已经由设置的参数处理好了。

如果使用的类是bookleftmargin和,应该用和rightmargin替换。innermarginoutermargin

请保留内部填充空间。

答案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}

相关内容