slides 中遇到的东西
[
心情: Cool ]
为了论文答辩,用 latex+beamer 做了一个 slides, 后来发现想在生成的 pdf 文件中加入一个时钟,主要是方便自己在讲的时候把握时间,也是,做了一学期,说的却不超过8分钟…闲话就算了..
室友 zz 在网上一顿狂搜,发现用 javascript 可以实现,于是采用 eforms 宏包,加了这样一段代码在 tex 文件中
| 代码: |
| \begin{insDLJS}{showtime}{Show time} sec=0 min=0 function tClock() { sec=sec+1 if(sec==60){sec=0;min=min+1;} minStr=min secStr=sec if(sec<10) secStr=”0″+sec for (i=1;i<=50;i++) this.getField(”time”+i).value=minStr+”:”+secStr } var timeout =app.setInterval(”tClock()”,1000); \end{insDLJS} |
并在导言区定义了
| 代码: |
| \newcommand{\timemark}[1]{\begin{textblock}{0.7}[0,0] (11.3,15.53)\textField[\BC{0.91 0.91 1}\BG{0.91 0.911} \textSize{6.4}\textColor{0 0 0 rg}]{time#1}{0.8cm} {5.5bp}\end{textblock}} |
这样就会在 slides 底部生成一个小时钟,从打开开始计时,按照分钟记。
但是同时需要在每一个 frame 中硬性的插入 \timemark{1} \timemark{2}这样的标签。
我是想直接插入在 \begin{frame} \frametitle{xxx}那行的下面,于是首先想使用 sed 的 a\ 命令来处理,同时前一天在 gnu.emacs.help 中看到了自动顺序编号的办法,就是使用 regexp的 \# 实现的,可是在 sed 中,虽然正常的插入了,但是却没有 \#计数的这个,郁闷死了,忽然想到直接在 emacs 中处理。
找了半天没有在匹配行后面追加的命令,于是想到了一个有点 dirty 的办法,用 Regex 将一行替换成两行不就行了么?但是不懂怎样吧回车硬编码进去,在 #ppmm 中问了 破破 ,他告诉我是 <C-q><C-j> 。
于是就有了下面这个有点诡异的操作:
| 代码: |
| M-x replace-regexp ^\\begin{frame}.* <RET>\&<C-q><C-j> \\timemark{\,(+ 1 \#)}<RET> |
刷刷刷,自动加上去了。后来又考虑了一下,借助于 \& 也完全可以在匹配行之前插入一个新行。
解释一下, M-x 是执行一个命令,这个命令名字叫 replace-regexp 就是按照 正则表达式替换,替换的源字串为 ^\\begin{frame}.* 就是以 \begin{frame}开头的那些行,把它替换成该行(\&表示被匹配的完整的源字串),跟上一个回车(C-q C-j) 然后下一行是 \timemark{n}, n 从一开始计数,没匹配一次加一(\,(+ 1 \#), 其中 \# 表示计数,它前面的表示从 1 开始,裸的\#是从 0 开始的。
顺便提一下 emacs 的 re-builder 就是一个构建正则表达式的模式,对于个文本,会在下面再打开一个貌似模式行的东西,输入匹配模式,就会将源文件匹配处高亮显示,在 echo buffer 中显示匹配次数,实在是很不错的一个东西。在测试 regexp 的时候非常的有用。

