像 Knuth 一样在 LaTeX 中排版算法

像 Knuth 一样在 LaTeX 中排版算法

有没有类似 Donald Knuth 使用的 LaTeX 排版算法包计算机编程艺术

我知道algorithm2e包,但我正在寻找产生如下输出的东西:

1.[检查下限。] 如果X < lower_bound,转到 3。

2.[检查上限。] 如果X > upper_bound,转到 4。

...

我想我可以使用\newcommand和定义我自己的宏,但我希望它能更智能一些。

答案1

您可以使用listings支持排版文字代码的包。您需要先使用设置替换参数\lstset{literate=}。这将替换为例如:=$\gets$ 等。

\documentclass{article}
\usepackage{graphicx}
\usepackage{listings}
\begin{document}
\lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}
\begin{lstlisting}
var i:integer;
if (i<=0) i := 1;
if (i>=0) i := 0;
if (i<>0) i := 0;
\end{lstlisting}
\end{document}

设置有点繁琐,可以从命令提示符界面在listings包的第 48 页(仅)找到详细信息。texdoc listings

答案2

实际上,Donald Knuth 编写的宏计算机编程艺术可用在线的

可以以简单的方式针对 LaTeX 进行修改,例如:

% These macros are borrowed from TAOCPMAC.tex
\newcommand{\slug}{\hbox{\kern1.5pt\vrule width2.5pt height6pt depth1.5pt\kern1.5pt}}
\def\xskip{\hskip 7pt plus 3pt minus 4pt}
\newdimen\algindent
\newif\ifitempar \itempartrue % normally true unless briefly set false
\def\algindentset#1{\setbox0\hbox{{\bf #1.\kern.25em}}\algindent=\wd0\relax}
\def\algbegin #1 #2{\algindentset{#21}\alg #1 #2} % when steps all have 1 digit
\def\aalgbegin #1 #2{\algindentset{#211}\alg #1 #2} % when 10 or more steps
\def\alg#1(#2). {\medbreak % Usage: \algbegin Algorithm A (algname). This...
  \noindent{\bf#1}({\it#2\/}).\xskip\ignorespaces}
\def\algstep#1.{\ifitempar\smallskip\noindent\else\itempartrue
  \hskip-\parindent\fi
  \hbox to\algindent{\bf\hfil #1.\kern.25em}%
  \hangindent=\algindent\hangafter=1\ignorespaces}
% end of borrowed macros

% For Example, with less than 10 steps:
% \algbegin X (Multiplication). blah blah blah blah...
% \algstep X1. [{\it Do stuff\/}] blah blah blah
% \algstep X2. Terminate the algorithm.\quad\slug

相关内容