发布时间:2012-11-21 15:50:28
文章类别:小技巧
原文地址:http://blog.sina.com.cn/s/blog_5e16f1770102fcmu.html

QQ群:91940767/145316219/141877998/80300084/194770436
淘宝店:http://latexstudio.taobao.com
技巧续篇:http://latexstudio.net/
常见数学公式问题集下载

摘要:

在看Manning的书时,代码中的标记和代码末尾的解释,让读者能对代码有直观的理解,如下:

LaTeX技巧643:listings代码注释标记实现-作者:孙波翔(Sunny)

本文参考了一些Latex书的源码,给出了一个在Latex中显示这些标记和解释的方法。但与Manning出版的书籍相比,其显示的内容还很粗糙,请大家见谅。笔者将在日后不断完善。

预备知识:

本文需要对listing包的使用有基本的了解。

所以依赖的包:

tizk、ifthen

实现思想:

\circlemark 自定义命令,画一个底色为黑色的圆,其中将显示白色的数字。这个数字是通过一个变量来实现的:变量可以在对代码标注时自动排序,而不需要人工干预

\makeremarks命令,在代码中,用该命令的对代码进行标记和解释,并对其进行排序。

\showremarks命令,在代码结束后,用该命令将\makeremarks中的注释提取出来,并以一个list的形式显示出来。

实现代码:

首先,创建两个变量,一个变量用于显示在代码中标记时的序号;一个用于在显示时使用的序号:

\newcounter{coderemarks} \\创建变量

\setcounter{coderemarks}{1} \\设置变量初值为1

\newcounter{codevar} \\创建变量

\setcounter{codevar}{1} \\设置变量初值为1

第二步:绘制圆形标记:文本底色为白色,圆圈填充色为黑色

\newcommand{\circlemark}[1]{%

\tikz\node[text=white,font=\sffamily\bfseries,inner sep=0.2mm,draw,circle,fill=black]{#1};}

第三步:定义makeremark命令,调用上一步的circlemark命令,将变量coderemarks作为文本,填充至标记中,并添加注释,但并不是在这里就显示注释,而是在调用showremarks命令时再显示。最后递增coderemarks变量。

\newcommand{\makeremark}[1]{%

\circlemark{\arabic{coderemarks}}%

\global \expandafter\def \csname codebox\the\value{coderemarks}\endcsname{#1}%

\stepcounter{coderemarks}}

第四步:定义showremarks命令。以一个列表的形式,将代码中所有的标记列出来,并将注释也显示出来。最后,将coderemarks和codevalue都至为1,也就是初值。这里codevalue的作用是一次显示出代码中用makeremark命令标记出的注记。详细请看下面的代码。

\newcommand{\showremarks}{%

\begin{list}{\circlemark{\arabic{codevar}}} %

{} %

\whiledo{\value{codevar} < \value{coderemarks}}{ %

\item \expandafter\csname codebox\the\value{codevar}\endcsname %

\stepcounter{codevar}} %

\end{list} %

\setcounter{coderemarks}{1}%

\setcounter{codevar}{1}%

}

第五步:测试代码。在代码中,使用逃逸符号将\makeremark命令及其中的文本包裹起来。并在listing环境结束后用/showremarks命令将注记列出来。本例中,使用\lstset{escapeinside=``}命令重新定义了逃逸符号为``,也就是主键盘区最左上角的那个按键。如下:

\begin{lstlisting}

#include `\makeremark{导入库文件}`

`\makeremark{注释,位于\lstinline||之间;}`

int main() { `\makeremark{主函数,所有C语言可执行程序以main开始}`

printf("Hello, world") `\makeremark{调用库函数打印字符串到屏幕。}`

}

\end{lstlisting}

\showremarks

完整示例:

如下:

\documentclass[12pt,a4paper,UTF8]{ctexbook}

\usepackage{tikz}

\usepackage{listings}

\usepackage{ifthen}

\newcounter{coderemarks}

\setcounter{coderemarks}{1}

\newcounter{codevar}

\setcounter{codevar}{1}

\newcommand{\circlemark}[1]{%

\tikz\node[text=white,font=\sffamily\bfseries,inner sep=0.2mm,draw,circle,fill=black]{#1};}

%

\newcommand{\makeremark}[1]{%

\circlemark{\arabic{coderemarks}}%

\global \expandafter\def \csname codebox\the\value{coderemarks}\endcsname{#1}%

\stepcounter{coderemarks}}

%

\newcommand{\showremarks}{%

\begin{list}{\circlemark{\arabic{codevar}}} %

{} %

\whiledo{\value{codevar} < \value{coderemarks}}{ %

\item \expandafter\csname codebox\the\value{codevar}\endcsname %

\stepcounter{codevar}} %

\end{list} %

\setcounter{coderemarks}{1}%

\setcounter{codevar}{1}%

}

\lstset{escapeinside=``}

\lstset{language= C}

\begin{document}

\begin{lstlisting}

#include `\makeremark{导入库文件}`

`\makeremark{注释,位于\lstinline||之间;}`

int main() { `\makeremark{主函数,所有C语言可执行程序以main开始}`

printf("Hello, world") `\makeremark{调用库函数打印字符串到屏幕。}`

}

\end{lstlisting}

\showremarks

\end{document}

实现结果

LaTeX技巧643:listings代码注释标记实现-作者:孙波翔(Sunny)



总结

本示例介绍了如何在Latex中显示对程序语言代码的注记。这种显示方法是最基本的,还有许多不完善的地方,笔者将继续查找资料并添加其他新的功能。

参考资料:

http://www.miek.nl/blog/archives/2010/06/02/index.html


点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部