我用algpseudocode
它来排版我的算法。但是,我缺少对排版数据结构(例如结构、类或类似的东西)的支持。algpseudocode
或者我可以同时使用其他一些包来做到这一点吗?
我想要排版的一个小例子:
struct {
float x,y,z;
} Vec3f;
类似这样。它应该至少与algpseudocode
包的视觉效果略有契合。后者只有命令式控制命令,如 for、while、if 和通用状态。但没有数据结构支持。上面的语法是 C,但我并不坚持这一点。伪代码就足够了。
答案1
如果您想排版 C 代码,Mico 之前的回答是完美的。但是,如果您想要一些在视觉上与包更相似的东西algpseudocode
,listings
也可以为您做到这一点;您可以利用提供的文学编程替换来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:
\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}
并得到: