如何排版数据结构?

如何排版数据结构?

我用algpseudocode它来排版我的算法。但是,我缺少对排版数据结构(例如结构、类或类似的东西)的支持。algpseudocode或者我可以同时使用其他一些包来做到这一点吗?

我想要排版的一个小例子:

struct {
    float x,y,z;
} Vec3f;

类似这样。它应该至少与algpseudocode包的视觉效果略有契合。后者只有命令式控制命令,如 for、while、if 和通用状态。但没有数据结构支持。上面的语法是 C,但我并不坚持这一点。伪代码就足够了。

答案1

如果您想排版 C 代码,Mico 之前的回答是完美的。但是,如果您想要一些在视觉上与包更相似的东西algpseudocodelistings也可以为您做到这一点;您可以利用提供的文学编程替换来listings让编码变得更容易。

前言。

\documentclass{article}
\usepackage{listings}
\usepackage{amssymb}

\lstdefinelanguage{algpseudocode}{
  keywordstyle=[1]{\keywordstyle},
  keywordstyle=[2]{\operatorstyle},
  keywordstyle=[3]{\typestyle},
  keywordstyle=[4]{\functionstyle},
  identifierstyle={\identifierstyle},
  keywords=[1]{%
    begin,end,%
    program,procedure,function,subroutine,%
    while,do,for,to,next,repeat,until,loop,continue,endwhile,endfor,endloop,%
    if,then,else,endif,%
    return},
  literate={-}{$-$}1 {^}{$^\wedge$}1
           {>}{{$>$\ }}1 {<}{{$<$\ }}1
           {>=}{{$\geqslant$\ }}1 {<=}{{$\leqslant$\ }}1 
           {:=}{{$\gets$\ }}1 {!=}{{$\ne$\ }}1 {<>}{{$\ne$\ }}1
           {->}{{$\;\to\;$}}1
           {&&}{{\keywordstyle and\ }}4 {{||}}{{\keywordstyle or\ }}3
           {;}{\hspace{0.2em};}2 {,}{\hspace{0.2em},}2,
}

\lstset{%
  language={algpseudocode},
  columns=fullflexible,
  numbers=left,
  numberstyle=\scriptsize,
}

以上内容旨在定义一种具有类似语法高亮的“语言” algpseudocode。我们定义了几种类型的“关键字”,以便以不同的方式高亮显示(针对实际语言关键字、数学基本操作、数据类型和过程/函数名称)。我们只定义了一个关键字列表;其他关键字我们将根据需要添加。

我们用稍后定义的不同宏来描述语法高亮。伪代码的其余特殊表示由某些字符组合的排版方式定义:例如,和都<>!=排版为数学符号\ne。这很容易定制,并允许您轻松编写以文学方式排版的代码。

辅助宏。

\newcommand\keywordstyle{\rmfamily\bfseries\upshape}
\newcommand\operatorstyle{\rmfamily\mdseries\upshape}
\newcommand\typestyle{\rmfamily\mdseries\upshape}
\newcommand\functionstyle{\rmfamily\mdseries\scshape}

\newcommand\identifierstyle{\rmfamily\mdseries\itshape}

\newcommand\addkeywords[1]{%
  \lstset{morekeywords=[1]{#1}}}

\newcommand\addoperators[1]{%
  \lstset{morekeywords=[2]{#1}}}

\newcommand\addtypes[1]{%
  \lstset{morekeywords=[3]{#1}}}

\newcommand\addfunctions[1]{%
  \lstset{morekeywords=[4]{#1}}}

这些宏修复了不同类型的关键字/标识符/其他东西的样式,还允许您轻松添加更多标识符。(如果您希望在代码中使用过程名称时对其进行特殊排版,则可以为它们定义第四类标识符,并使用类似的宏来构建此类过程名称的列表。)

示例文件。

1.简单伪代码:

示例伪代码

\begin{document}

\addfunctions{Euclidean}
\addoperators{mod}

\begin{lstlisting}
procedure Euclidean(a,b)
  r := a mod b
  while r != 0 do
    a := b
    b := r
    r := a mod b
  end while
  return b
end procedure 
\end{lstlisting}

\end{document}

2.一些伪C:

伪 C 代码示例

\begin{document}

\addtypes{struct,int,intnode}

\begin{lstlisting}
struct {
  int val;
  struct intnode* ptr;
} intnode;
\end{lstlisting}

\end{document}

答案2

您是否尝试过列表包?使用此包,你可以将代码排版为:

\documentclass{article}
\usepackage{listings}
\begin{document}
\lstset{language=C}
\begin{lstlisting}
struct {
    float x,y,z;
} Vec3f;
\end{lstlisting}
\end{document}

并得到:

在此处输入图片描述

相关内容