算法如图所示,且没有斜体和粗体格式?

算法如图所示,且没有斜体和粗体格式?

我想在我的 latex 文档中包含一个算法,但不想像 algorithmicx 包默认的那样,将大部分内容以斜体显示,将所有关键字以粗体显示。我喜欢这种简单的风格:

在此处输入图片描述

(第 3 页部分截图)http://research.microsoft.com/pubs/68869/naacl2k-proc-rev.pdf

我唯一想添加到此样式中的是行号。有人能帮我吗,如何获取屏幕截图和行号的格式?谢谢 :-)

因此,以下是我目前所拥有的:

\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage{algpascal}
\begin{document}


\alglanguage{pascal}
\begin{algorithm}
\caption{Paull's algorithm}
\begin{algorithmic}[1]
\State Assign an ordering $A_{1}, ..., A_{n}$ to the nonterminals of the grammar.
\For{i = 1}{n}
\Begin
    \For{j = 1}{i-1}
    \Begin
    \State for each production of the form $A_{i} \rightarrow A_{j} \alpha$
    \End

\End

\end{algorithmic}
\end{algorithm}
\end{document}

最终结果如下 在此处输入图片描述

基于此我希望做出以下改变:

  • do 和 begin 应在同一行
  • 结束应与其关联部分垂直对齐(参见该文章的第一个屏幕截图)。
  • 最好以图形形式集成,或者至少没有黑色边框,并在算法下方带有标题
  • 应关闭关键字的粗体格式

答案1

这就是您想要实现的目标吗?

在此处输入图片描述

这是 MWE:

\documentclass{article}
\usepackage[plain]{algorithm}
\usepackage{algpascal}

\begin{document}

\algrenewcommand\textkeyword{\textrm}
\algdef{SE}{For}{End}[2]{%
  \textkeyword{for} \(#1\) \textkeyword{to} \(#2\) \textkeyword{do begin}}{%
  \textkeyword{end}}

\begin{algorithm}
\begin{algorithmic}[1]
\State Assign an ordering $A_{1}, ..., A_{n}$ to the nonterminals of the grammar.
\For{i = 1}{n}
    \For{j = 1}{i-1}
    \State for each production of the form $A_{i} \rightarrow A_{j} \alpha$
    \End
\End
\end{algorithmic}
\caption{Paull's algorithm}
\end{algorithm}

\end{document}  

解释

  1. 为了满足您的前两个请求,我通过添加以下行重新定义了语句for的行为:end

    \algdef{SE}{For}{End}[2]{%
      \textkeyword{for} \(#1\) \textkeyword{to} \(#2\) \textkeyword{do begin}}{%
      \textkeyword{end}}
    
  2. 为了满足您的上一个请求,只需添加以下行:

    \algrenewcommand\textkeyword{\textrm}
    

    将关键字的字体重新定义为 而\textrm不是\textbf

  3. 关于您的第三个请求,有两种方法。

    • 如果您希望算法表现得像算法一样,只需使用如上 MWE 中的algorithm选项加载包即可:plain

      \usepackage[plain]{algorithm}
      
    • 如果您希望算法表现为图形,则无需加载包algorithm,只需将algorithmic环境插入其中figure,即替换行

      \begin{algorithm}
      \begin{algorithmic}[1]
      ...
      \end{algorithmic}
      \caption{Paull's algorithm}
      \end{algorithm}
      

      \begin{figure}
      \begin{algorithmic}[1]
      ...
      \end{algorithmic}
      \caption{Paull's algorithm}
      \end{figure}
      

      你将拥有

    在此处输入图片描述

附录

这是图中算法的完整实现:

\documentclass{article}
\usepackage[plain]{algorithm}
\usepackage{algpascal}

\begin{document}

\algrenewcommand\textkeyword{\textrm}
\algdef{SE}{For}{End}[2]{%
  \textkeyword{for} \(#1\) \textkeyword{to} \(#2\) \textkeyword{do begin}}{%
  \textkeyword{end}}
\algdef{SE}{ForEach}{End}[1]{%
  \textkeyword{for each} #1 \textkeyword{do begin}}{%
  \textkeyword{end}}

\begin{algorithm}
\begin{algorithmic}[1]
\State Assign an ordering $A_{1}, \dots, A_{n}$ to the nonterminals of the grammar.
\For{i := 1}{n}
    \For{j := 1}{i-1}
        \ForEach{production of the form $A_{i} \rightarrow A_{j} \alpha$}
            \State remove $A_{i} \rightarrow A_{j} \alpha$ from the grammar
            \ForEach{production of the form $A_{j} \rightarrow \beta$}
                \State add $A_{i} \rightarrow \beta\alpha$ to the grammar
            \End
        \End
    \End
    \State transform the $A_{i}$-productions to eliminate direct left recursion
\End
\end{algorithmic}
\caption{Paull's algorithm}
\end{algorithm}

\end{document}  

在此处输入图片描述

需要定义一个新的命令\ForEach

\algdef{SE}{ForEach}{End}[1]{%
  \textkeyword{for each} #1 \textkeyword{do begin}}{%
  \textkeyword{end}}

请注意,我已经将\ForEach其定义为采用一个“文本”参数,因为在我看来这是定义它的最佳方式。

如果你希望它采用“数学”参数,则将其定义为

\algdef{SE}{ForEach}{End}[1]{%
  \textkeyword{for each} \(#1\) \textkeyword{do begin}}{%
  \textkeyword{end}}

并按如下方式使用它(amsmath命令需要\text):

\ForEach{\text{production of the form }A_{i} \rightarrow A_{j} \alpha}

相关内容