algorithmicx

algorithmicx

我已经定义了自己的语言,其语法与 Pascal 非常接近。例如,我想输入以下程序。许多人使用软件包algorithmicxalgorithm2e打印程序,但似乎我们必须使用其语法的特定关键字,如procedure, end while

我只想在需要的时候缩进空格,并在需要的时候加粗一些单词(抱歉,我不能大胆的字母如下图所示)。我必须 texttt为每一行使用 吗?此外,使用verbatim,我无法大胆的字...

此外,由于程序不大,我需要将其放在页面左侧,并在右侧留出一些解释文本的空间。所以我想我需要将它们放在一起,然后使用multicols

有人可以帮忙吗?

program test                                      some text here
var
  i : integer;                                    ... 
  b : boolean;
begin
   i := 1;                                        ...
   b := true;
   while i < 15 do
      i := i  + 1;
      b := not b                                  some text here
   od
end

编辑1:按照@Werner 的tabbing解决方案,我将代码做成了一个小页面:

\begin{minipage}[t]{0.48\linewidth}%
\begin{tabbing}
Werner's solution
\end{tabbing}
\end{minipage}\hfill
\begin{minipage}[t]{0.48\linewidth}
a paragraph
\end{minipage}

实际上,正如代码所示,我希望文本成为代码右侧另一个独立的小页面。然后我有两个问题:

  1. 0.48\linewidth而不是 是否合理0.5\linewidth0.48\linewidth是一种常规选择?

  2. 是否可以在代码周围制作一个框架,并使用\caption\label作为参考(我更喜欢图形)?

答案1

algorithmicx

algorithmicx你可以在使用该包时定义自己的关键字。3.1.10 更改命令名称包装文档\algnewcommand讨论了/的用法\algrenewcommand,您可以使用它来创建新命令/更改现有格式。以下两张图片直接取自软件包文档:

Algorithmicx \algnewcommand

Algorithmicx \algrenew命令


algorithm2e

algorithm2e您还可以使用该包定义自己的关键字。10 定义自己的语言关键字包装文档详细讨论了这一点。具体来说,你可以使用如下命令

  • \SetKwInput以及\SetKwOutput算法输入/输出定义
  • \SetKw为了关键词定义
  • \SetKwBlock为了堵塞定义
  • \SetKwFunction为了功能/程序定义
  • \SetKwComment为了评论定义
  • \SetKwIf为了if 语句定义
  • \SetKwSwitch为了多条件选择定义
  • \SetKwFor为了for 循环定义
  • \SetKwRepeat为了重复/尽管定义

listings

然后是listings允许进行同样多修改的包。关键字定义通过样式和/或语言指定。阅读非常详细的包装文档了解更多信息。


tabbing

以上内容使用了包中的一些丰富的编程指令,可能需要大量阅读。在特殊情况下,如果您“只想编写几行代码并以自己的方式格式化内容”,则可以使用环境tabbing。这要么是由 LaTeX 提供(默认)或tabbing包裹。 这tabbing包装文档给出了一些使用它的动力,但这取决于你。

典型的tabbing环境类似于

\begin{tabbing}
  <space> \= <space> \= <space> \= <space> \= \kill
  no indent \> \> more text \\
  \> one indent \> \\
  ....
  ....
\end{tabbing}

制表符停止位由 指示,并\=使用 跳转到\>。最好在第一行留出空白(通过\hspace{<space>}\quad或),因为提供了第一行(而不是)以防止排版第一行。这可确保实际的制表符排版从第一行开始。\qquad\phantom{<stuff>}\kill\\[-\baselineskip]

这样做的好处是,您可以按照自己想要的方式格式化代码,而无需任何特殊包“干扰”您的风格或其他偏好。根据您的示例,以下是我要做的事情(不使用\multicol):

\documentclass{article}
\usepackage{calc}% For length calculations
\begin{document}

\newlength{\mylen}%
\setlength{\mylen}{\linewidth-2\fboxsep-2\fboxrule}%

\fbox{\begin{minipage}{\mylen}
  \begin{tabbing}
    \quad \= \quad \= \quad \= \hspace{5cm} \= \kill
    \textbf{program} test \> \> \> \> \texttt{some text here} \\
    \textbf{var} \\
    \> $i$ : \textbf{integer}; \> \> \> \texttt{...} \\
    \> $b$ : \textbf{boolean}; \\
    \textbf{begin} \\
    \> $i:=1$; \> \> \> \texttt{...} \\
    \> $b:=\texttt{true}$; \\
    \> \textbf{while} $i<15$ \textbf{do} \\
    \> \> $i:=i+1$; \\
    \> \> $b:=\textbf{not}\ b$; \> \> \texttt{some text here} \\
    \> \textbf{od} \\
    \textbf{end}
  \end{tabbing}
\end{minipage}}

\end{document}

LaTeX 制表符示例


verbatim

verbatim环境是一个段落制作环境,它使 LaTeX 能够准确打印您输入的内容。它将 LaTeX 变成一台打字机,回车符和空格具有与打字机相同的效果。输出看起来与输入文件中的样子完全一样。典型的排版verbatim类似于

\begin{verbatim}
  <stuff> 
\end{verbatim}

或者

\begin{verbatim*}
  <stuff>
\end{verbatim*}

verbatim和之间的区别在于verbatim*后者将空格打印为“可视”空格,即短而粗的“u”。verbatim使用以下方法也可以进行内联

\verb char literal_text char

或者

\verb*char literal_text char

\verb其含义与之前无星号和有星号版本类似。或\verb*和之间不得有空格char(此处显示空格只是为了清楚起见)。 此处char表示\verb分隔符,应在开头和结尾处匹配。char可以是除空格(或表格*中的\verb)之外的任何内容。

答案2

minted包使用 Pygments Python 模块作为后端,在 LaTeX 中生成高亮(甚至彩色)的代码。

你可以通过编写新的 Pygment 模块来获得你自己的语言的支持。请参阅这篇博文例如。

要在代码右侧写注释,您可能需要使用minipage

答案3

我最近发现algpseudocodex 包裹很好地结合了 的特点algorithmicx和 的精益布局algorithm2e

相关内容