如何在clrscode软件包中使用安全的条件?

如何在clrscode软件包中使用安全的条件?

clrscode可以产生一些非常漂亮的算法文本,但是如果您的clrscode条件嵌套有条件,那么看起来很丑陋。 \Then\If

这不仅不是很紧凑(需要以两列格式的纸!),如果您尝试将其放置在大多数主流编程语言中\Then,则\If与大多数\Then主流编程语言相反。

为了清楚起见,你需要这样做

\li \If $a = b$
\li   \Then foo

但是我真的很想做

\li \If $a = b$ \Then foo

或者

\li \If $a = b$ \Then
\li   foo

此外,我希望能够将\Else语句与前面的语句对齐\If(不是前面的\Then!),这似乎也不是可能的。

有什么指点吗?

答案1

clrscodelrbox将算法设置为使用(使用环境)的固定框( ),并使用以下更新和(我认为)对齐minipage算法。tabbing\Then\Else\Until

在此处输入图片描述

\documentclass{article}
\usepackage{clrscode}% http://www.cs.dartmouth.edu/~thc/clrscode/
\begin{document}
\begin{codebox}
  \Procname{$\proc{Hash-Insert}(T,k)$}
  \li $i \gets 0$
  \li \Repeat
  \li   $j \gets h(k,i)$
  \li   \If $T[j] == \const{nil}$
  \li   \Then
          $T[j] \gets k$
  \li     \Return $j$
  \li   \Else
          $i \gets i+1$
        \End
  \li \Until $i == m$
  \li \Error ``hash table overflow''
\end{codebox}

% Updates to \Then and \Else
\renewcommand{\Then}{%
  \textbf{then}\stepcounter{indent} }
\renewcommand{\Else}{%
  \kill\addtocounter{indent}{-1}%
  \liprint\textbf{else}\>\>\stepcounter{indent}}
\renewcommand{\Until}{%
  \addtocounter{indent}{-1}%
  \kill\liprint\textbf{until} }

\begin{codebox}
  \Procname{$\proc{Hash-Insert}(T,k)$}
  \li $i \gets 0$
  \li \Repeat
  \li   $j \gets h(k,i)$
  \li   \If $T[j] == \const{nil}$ \Then
  \li     $T[j] \gets k$
  \li     \Return $j$
  \li   \Else $i \gets i+1$
        \End
  \li \Until $i == m$
  \li \Error ``hash table overflow''
\end{codebox}

\end{document}

当然,根据某些澄清,可以从输入方面进行更多更正。

还,clrscode3e存在是一个“第三版”的更新clrscode(用于第 1 版和第 2 版算法导论)此更新,如clrscode3e文档包含大量根据用户反馈做出的改进。具体到\If-\Then排版if语句,第 8 页):

在本书的前两个版本中,关键字然后出现在伪代码中,但是 - 再次注意读者的请求,使我们的伪代码更像C,C ++和Java,我们消除了关键字然后在第三版\Then但是,该命令仍然存在,以便缩进在如果条款评估真的

从这clrscode.sty是所有关键字的形式定义:

% All of our favorite keywords.
\newcommand{\For}{\textbf{for} }
\newcommand{\To}{\textbf{to} }
\newcommand{\By}{\textbf{by} }
\newcommand{\Downto}{\textbf{downto} }
\newcommand{\While}{\textbf{while} }
\newcommand{\Repeat}{\textbf{repeat}\>\>\addtocounter{indent}{1}}
\newcommand{\Until}{\kill\addtocounter{indent}{-1}\liprint\>\>\textbf{until}\hspace*{-0.7em}\'}
\newcommand{\If}{\textbf{if} }
\newcommand{\Then}{\>\textbf{then}\>\addtocounter{indent}{1}}
\newcommand{\Else}{\kill\addtocounter{indent}{-1}\liprint\>\textbf{else}\>\addtocounter{indent}{1}}
\newcommand{\End}{\addtocounter{indent}{-1}}
\newcommand{\ElseIf}{\kill\addtocounter{indent}{-1}\liprint\textbf{elseif} }
\newcommand{\ElseNoIf}{\kill\addtocounter{indent}{-1}\liprint\textbf{else} \addtocounter{indent}{1}}
\newcommand{\Do}{\>\>\textbf{do}\hspace*{-0.7em}\'\addtocounter{indent}{1}}
\newcommand{\Return}{\textbf{return} }
\newcommand{\Comment}{$\hspace*{-0.075em}\rhd$ }
\newcommand{\RComment}{\`\Comment}
\newcommand{\Goto}{\textbf{goto} }
\newcommand{\Error}{\textbf{error} } % optionally followed by string argument

相关内容