发布时间: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的书时,代码中的标记和代码末尾的解释,让读者能对代码有直观的理解,如下:
预备知识:
本文需要对listing包的使用有基本的了解。
所以依赖的包:
tizk、ifthen
实现思想:
\circlemark 自定义命令,画一个底色为黑色的圆,其中将显示白色的数字。这个数字是通过一个变量来实现的:变量可以在对代码标注时自动排序,而不需要人工干预
\makeremarks命令,在代码中,用该命令的对代码进行标记和解释,并对其进行排序。
\showremarks命令,在代码结束后,用该命令将\makeremarks中的注释提取出来,并以一个list的形式显示出来。
实现代码:
首先,创建两个变量,一个变量用于显示在代码中标记时的序号;一个用于在显示时使用的序号:
\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};}
第三步:定义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开始}`
}
\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开始}`
}
\end{lstlisting}
\showremarks
\end{document}
实现结果
总结
本示例介绍了如何在Latex中显示对程序语言代码的注记。这种显示方法是最基本的,还有许多不完善的地方,笔者将继续查找资料并添加其他新的功能。
参考资料:
http://www.miek.nl/blog/archives/2010/06/02/index.html
发表评论 取消回复