我想在我的 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}
解释
为了满足您的前两个请求,我通过添加以下行重新定义了语句
for
的行为:end
\algdef{SE}{For}{End}[2]{% \textkeyword{for} \(#1\) \textkeyword{to} \(#2\) \textkeyword{do begin}}{% \textkeyword{end}}
为了满足您的上一个请求,只需添加以下行:
\algrenewcommand\textkeyword{\textrm}
将关键字的字体重新定义为 而
\textrm
不是\textbf
。关于您的第三个请求,有两种方法。
如果您希望算法表现得像算法一样,只需使用如上 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}