Microsoft Academic Search vs. Google Scholar (1)

本文在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

在上一篇文章, 我妄图从全局的角度分析一个我不甚了解的系统, 下场可想而知. 吸取教训, 靠谱的 approach 是: 从我自己的体验出发, 加上对我周围的用户的观察,写一篇不一味追求大而全的文章.

就我的观察, Microsoft Academic Search (MAS) 目前的主要用户群并非是已经在学术圈里的研究人员, 而是那些仍处在本科阶段, 即将进入学术圈的大学生. 我认为MAS的许多功能, 都是在为对学术研究有兴趣的学生们提供辅助, 帮助他们探索这个"神秘而陌生"的圈子. 而Google Scholar (GS) 的主要用户群是已经在学术界做研究的研究生和学者, 它可以作为一个强大的辅助研究工具, 帮助研究人员更好得检索文献. 下面, 我会提出若干证据来支持我的观点.

首先谈谈MAS提供的功能. 根据MAS的帮助页面, 除了搜索外, MAS提供以下功能:

  • Call for Papers(CFP)
  • Exploring scholars' cooperating network
  • Embedding publications in your own web page
  • View paper referencing information
  • Visualization of publication trends of domains in computer science
  • Academic Map
  • Organization Comparison
  • Ranking of authors, publications, journals, organizations, conferences and keywords

给这些功能分个类的话, Exploring scholars' cooperating network, Academic Map, Organization Comparisons算是一类. Exploring scholars' cooperating network能根据从文献中共同作者学习的数据, 用图形显示出和学者关系紧密的人; 可以根据引用的关系, 找出谁引用某名学者的文章较多, 也可以找出两名学者间的关系路径. Academic Map, Organization Comparisons都是对研究机构的分析, 可以在地图上查看在某地区的研究机构, 地图上还会用不同颜色和大小的标记来现实不同规模的研究机构. 也可以在两个研究机构间比较, 分别列出在两个机构工作的学者,列出两个机构发表的文章的公共关键词和各自的关键词. 总之, 它们都能让新手熟悉圈子里有哪些人, 哪些机构.

Call for Papers(CFP), Visualization of publication trends of domains in computer science, Ranking算是一类. 对研究还不甚熟悉的同学, CFP可以帮助他们了解领域内有哪些会议, 提醒他们记得按时提交paper. Ranking 是对作者, 文献, 期刊, 研究机构, 会议和关键词的排名. 对作者, 文献, 研究机构和关键词的排名依据是被引用次数; 对期刊和会议的排名依据不明. 在排名时可以选择领域, 子领域和时间段(近5年, 近10年和不限时间). Visualization publication trends是根据领域的文献多少绘制的图形, 可以绘制文献的绝对数量图和相对数量(百分比)图. 对研究新手来说, 这也是帮助他们了解所研究领域的一条捷径.

View paper referencing information自成一类, 它能帮用户在找到论文时还能看到引用它的文章的上下文, 有点儿类似Blog系统里的Callback功能, 可以让用户在选择文献阅读时有了更多的参考.

而Embedding publications in your own web page和其他的都不是一类. 这个功能可以生成代码, 将某位学者的publication列表嵌入网页中, 不仅可以显示自己的publication, 还可以在有新发表作品时更新. 我认为这个功能可以为那些不擅长制作自己的个人主页的学者带来方便.

虽然MAS提供了这么多附加功能, 但在搜索上, 它却做得比一般的搜索引擎都要弱. 虽然MAS提供了限制搜索结果领域的功能, 但MAS作为学术搜索引擎, 高级搜索却并不高级. 这个我在后文还会和Google Scholar做对比分析.

再看看Google Scholar(GS)的功能. GS除了搜索外, 提供了以下这些功能:

  • Email Alert
  • Local library links
  • Google Scholar Citations
  • Search within citing articles

这几个功能各有特色, 下面简要介绍一下:

Email Alert可以将符合某搜索条件的最新搜索结果发送到用户的邮箱, 很多商业数据库也有类似的功能, 这可以帮助用户掌握最新的学术动态.

Local library links可以让你在校园网中使用SG搜索时, 可以显示搜索结果在学校图书馆已购买的电子资源中对应的链接. 这个功能对于学校中的研究人员十分方便, 省去了记下文献名称并重新在本地图书馆搜索的时间. 而且它也提高了学校所购置的电子资源的利用率. 西北大学(Northwestern University)就是参与这个 Library Support Program 计划的高校之一, 这里有它们的故事. 我采访过在University of Texas 读Master的学长, 她也表示这是GS中她最喜欢的功能之一. 据我所知, 高校图书馆每年获得的经费中, 很大一部分都被用于购置各种商业数据库. 而这些数据库往往没有一个统一的搜索入口, 想要跨库检索十分麻烦. GS的这个功能无疑能让这些钱花得更值.

Google Scholar Citations 是几周前刚推出的功能. 根据帮助页面的说法, 这个功能目前仍在小范围测试中, 现在只有少数人有profile页面(比如那位十分传奇的物理学家 Richard Feynman, 插一句题外话, 偷偷感谢某位送我《别闹了,费曼先生》的老师), 测试结束后将开放给公众使用. 这个功能和MAS的作者页面有些类似, 能够显示作者的个人信息, publication列表, 引文统计, H-index, 还有"同事(colleagues)"列表. 开放之后, 用户可以建立自己的页面(profile), 添加或删除publication列表中的条目, 可以选择是否公开自己的页面. 这项服务最终将变成什么样, 还得拭目以待.

Search within citing articles能让用户在某篇论文的引文中搜索, 可以算是搜索功能的扩展. 这和MAS的View paper referencing information不大相同—-MAS是让你看到引用的上下文, GS是让你在引文的全文中搜索.

从上面的介绍可以看出, MAS的特色功能大多都是为那些将入或初入学术界的新人准备的, 它们能引导新人熟悉这个学术圈子. 而除了最新的这个Google Scholar Citations, Google的功能大都是围绕搜索结果展开的(我认为这个更新很可能是因为MS的MAS有对应的功能, 因此Google才更新的). 我认为之所以如此, 是因为GS本来就是一个搜索引擎, 自然会以搜索功能为核心组织附加功能, 其目的就是为了增强搜索功能, 改进搜索体验. 通过这几年的运营, 由于其搜索功能的强大, GS在学术搜索领域的用户认知度也越来越高. 我在对几位Master在读/已毕业的学长的访谈中发现, 他们都在学术研究中经常使用GS, 而很少有人使用MAS, 有人甚至是第一次听说这个搜索引擎.

可是半个月前由MSRA的renren帐号发布的一条状态"有些同学要飞跃重洋,到世界一流学校做研究,学校要怎么选择呢?如何综合考虑地点/气候、学科/牛人…微软学术搜索推出了一个新功能,可以在地图上显示学校/研究所的论文发布情况,还可深入挖掘学校有哪些学科牛人,该牛人都有啥学术贡献。一揽子解决套瓷前的信息准备问题。"却得到了广泛的转载. 虽然由于renren不提供公共主页中的状态转发数统计, 但我在我的新鲜事列表中看到了不少转发该状态的好友, 他们大多都是准备出国读研的同学. 这也符合我之前的推断.

再说说另一个理由, 虽然都是学术搜索引擎, 但MAS和GS的高级搜索功能不是一个档次的. MAS的高级搜索虽然支持根据文章的领域, 作者, 会议, 期刊, 机构, 年份, DOI等域的值来检索, 但它只支持查找关键词的AND操作, 不支持OR和NOT操作. 这使得它接受搜索表达式的表达能力有限, 例如若是想要查找"由作者A或作者B发表的文章"便无能为力了. 但GS的高级搜索支持用"with all of the words", "with the exact phrase", "with at least one of the words", "without the words", "where my words occur"来修饰关键词搜索, 支持根据作者, 发表的期刊或会议, 发表的年代来检索, 也可以将搜索结果限制在7个预先划定的领域中. 关键是, 所有的域都支持用AND, OR和NOT连接关键词. 显然, GS的高级搜索功能比MAS的强大许多.

作为学术搜索引擎, 用户对搜索结果的限制往往比普通用户多, 因此高级搜索功能的缺失使MAS在和GS的竞争中少了些许底气.

最后说说MAS搜索结果质量的问题. 虽然MAS的数据库大小仍然在扩张, 直接将它的数据库索引的论文数量和GS的做比较不太合理, 但数据库的不够完整会导致对学者, 学术机构的ranking不够准确. 如前所述, MAS的许多排名都是基于引文数来决定的, 学者的H-index, G-index和引文数也有直接的关系. 不能较完整地统计引文数就会导致这些排名不够准确, 也就使得这些独有的功能失去了意义.

我试着在MAS和GS里选取了一些论文来测试, 发现对于我测试的所有文献, MAS统计的引文数均明显少于GS. 测试的数据如下:

Publication

MAS

GS

Emergence
of scaling in random networks (2007)
2362 9241
Neural
Networks and Physical Systems with Emergent Collective
Computational Abilities (2006)
1294 9241
Compressed
sensing (2006)
1080 2938
Algebra
and Geometry (2006)
939 可检索, 无引文数
Pattern
Recognition and Machine Learning (2007)
881 4559
Fast
Pattern Matching in Strings (1977)
684 2035
A note
on two problems in connexion with graphs (1959)
137+53+35 7874+1+39

其中, 前5篇为MAS上排在Computer Science近五年引用数最高的前5名, Fast Pattern Matching in Strings 是提出 KMP 算法的经典文章, A note on two problems in connexion with graphs 是提出 Dijkstra 算法的经典文章. 这组测试既选择了最新的文章, 也选择了经典的文章, 在年份上的跨度达到了48年. 从结果中可以看到, 对于测试的几乎所有文章, MAS统计的引文数量都明显少于GS. 这说明MAS的数据库覆盖的面不够广, 或者是在抽取引用文献并统计引用基数的算法不如GS完善.

而且, MAS中排在Computer Science近五年引用数最高的Emergence of scaling in random networks在1999年就发表在Science上了, 而MAS的页面中显示它在2007年才被发表. 这也说明MAS的数据库中有不准确的地方.

从这个小小的测试中就可以看出, MAS数据库内容的质量不如GS. 不过MAS仍然在迅速的发展着, 希望它能早日完善数据库内容, 提高搜索结果的质量.

综上所述, Google Scholar作为稳坐搜索引擎头把交椅的Google旗下的产品, 搜索功能和搜索结果质量都不是盖的. 而MS Academic Search作为挑战者, 虽然提供了许多独具特色的功能, 但在搜索的核心功能上仍无法和Google Scholar竞争, 且数据库覆盖不完整也在一定程度上影响了这些特色功能的可信程度. MAS若想要从已经有广泛群众基础的GS手上争取用户, 搜索的功夫还要再多多修炼才行. 否则那些富有创意的功能就都沦为了"花拳绣腿", 实在可惜.

今天就先分析到这, 下次我将从User Interface (UI)和User Experience (UE)的角度继续比较这两个学术搜索引擎的区别. 敬请期待.

Wednesday, July 27th, 2011 at 04:27

复活节闲扯:一场激动人心的数学公开挑战赛

本文发表于果壳网 - guokr.com, 转载请注明出处. 商业使用请联系果壳网.

最速降线问题

“想象一个小球,仅受重力,从点 A 出发沿着一条没有摩擦的斜坡滚至点 B。怎样设计这条斜坡,才能让小球在最短的时间内到达点 B?”

/gkimage/56/rx/2j/56rx2j.png

这个在数学史上被称为“最速降线”的知名问题,最早是由著名的意大利科学家伽利略(Galileo Galilei)于 1630 年提出来的。他在研究后认为最速降线应该是圆弧,但可惜的是这个答案并不是正确的。时间又过了 60 多年,1696 年 6 月,来自瑞士巴塞尔(Barsel,这座城市不仅是数学世家伯努利的故乡,也是欧拉的故乡,有一个由欧拉解决的著名数论问题就是以这座城市命名的)的约翰・伯努利(Johann Bernoulli)在《教师学报》(Acta Eruditorum)上又重新提出这个问题,并向全欧洲的数学家提出公开挑战。这个别出心裁却又十分容易理解的问题吸引了当时全欧洲的数学家,而最后给出了正确解答的人也都是数学史上赫赫有名的巨人。这也让这次挑战成为了数学史上最激动人心的一场公开挑战。

数学家之间公开挑战的传统要追溯到 16 世纪在意大利的博洛尼亚(Bologna)。16 世纪初的博洛尼亚曾是欧洲数学思想的大熔炉,全欧洲的学生都会来到博洛尼亚大学。他们甚至还“发明”了一项新的观赏运动——数学比赛。这听起来有些匪夷所思,但在当时确实有大批的观众从各地涌来,围观数学家们互相之间用数学斗法。其中最有名的一次,是在塔塔里亚(Tartaglia)和费奥(Fior)间上演的,是一场关于求出一元三次方程通解的世纪智力大战。

言归正传,在约翰・伯努利发出挑战后的半年里,他收到的唯一一份答案来自《教师学报》的主编,他的老师莱布尼茨(Gottfriend Wilhelm Leibniz)。在莱布尼茨的要求下,他将接受答案的最后期限推迟到 1697 年的复活节,以便有更多的数学家能参与到这场挑战中来。

我们都知道,过两点的直线段是两点间的最短路径。但使质点的运动时间最短的运动轨迹,却不是那么的显而易见。这个问题和以往人们见过的那些求极值的问题是有本质区别的。借助微积分,人们可以求出一个函数的极值;但最速降线问题要求的并不是某个传统函数的极值点,而是要在一簇曲线(过 A、B 两点的所有曲线)中,求出能让质点运动时间最短的那条。这是一个以函数(小球的运动轨迹)为自变量,以实数(小球运动的时间)为函数值的函数,也就是所谓的泛函。我们要求的就是这样一个泛函的极值。正如后文将要介绍的那样,这类问题形成了一个全新的数学分支——变分学。

1697 年的复活节很快就到了,约翰・伯努利一共收到了五份正确答案。这五份答案分别来自他自己,他的老师莱布尼茨,他的哥哥雅各布・伯努利(Jakob Bernoulli),他的学生洛必达(Guillaume Francois Antonie de L'Hospital),还有一位来自英国的匿名数学家。最后这份答案虽然没有署名,但显然出自赫赫有名的牛顿(Issac Newton)之手。虽然五人的解法各不相同,但他们的答案全都一样——最速降线就是摆线。

同一个答案

/gkimage/ms/gs/wq/msgswq.png

所谓摆线(cycloid),就是当圆沿一条直线运动时,圆周上一定点所形成的轨迹。其实当时的数学家对这种曲线并不陌生,帕斯卡和惠更斯都曾研究过这一重要的曲线。但大部分人都没有想到,这条线同时也是人们苦苦追寻的最速降线。

而我们大家对摆线也不陌生。还记得小时候玩过的那种能够画出各种漂亮曲线的玩具吗?一块塑料板上开着几个圆形的大洞,还有几块较小的圆形塑料片,不同半径处留有一些孔。把这些看似普通的小圆片放进大圆孔中,再将圆珠笔插在小孔里并带动小圆片沿着大圆的圆周运动,就能在纸上留下各种美丽的曲线。这些曲线也都是摆线,只不过是另一种被称为“内摆线”(hypocycloid)的摆线。它们是由给定圆在另一个圆内运动时,圆周上一定点形成的轨迹。

/gkimage/9k/to/wn/9ktown.png

不同的解法

让我们回到众人给出的最速降线的解法上。莱布尼茨、牛顿、洛比达都是用他们擅长的微积分来解决这个问题的。伯努利兄弟的解法就值得特别地说一说了。

约翰的解法应该是最漂亮的解法了。他利用了费马原理(Fermat's principle),将小球的运动类比成光线的运动。费马原理又叫做“最短光时”原理,说的是光线在传播时总会选择光程极短的那条路径。那么,“最速降线”就是在光速随高度下降而增加的介质里光线传播的路径。用这样的类比思想,约翰成功地算出了这条曲线就是前面提到的摆线。

这种解法出人意料地用到了费马原理,实在是太巧妙了!在物理学中,费马原理被认为是“最小作用量原理”(principle of least action)在几何光学中的特例。 而最小作用量原理则是物理学定律普遍遵循的规律,甚至被称为“物理定律的定律”。

/gkimage/5n/wn/ln/5nwnln.png

不知你想过没有,当我们将一个小球抛出后,它为什么会沿着所谓的抛物线运动?你可能会说,因为小球只受重力作用,根据牛顿第一定律,它在水平方向上速度恒定不变;而根据牛顿第二定律,它在竖直方向上做匀变速运动。这两个运动合起来就使得小球的运动轨迹成了一条抛物线。

这确实不错,但现在让我们换一个角度来考虑这个问题。从整体的角度考虑,小球在被抛出后,为什么不沿着其他的路径运动,却总是沿着抛物线运动呢?同样,我们在考察了连接小球起点和终点的所有曲线后,会发现只有在沿着抛物线运动时,小球的动能和势能的差在运动过程中对时间的积分(这就是所谓的“作用量”)才是最小的。注意,在这里我们同样是在一簇曲线中,求出一条曲线使得某个量达到极值。这种在一簇曲线中,求出某条曲线使得函数取到极值的思想就是变分的核心思想。也就是说,我们又是在用变分求泛函的极值。

再回过头来看看约翰・伯努利的哥哥——雅各布・伯努利的解法。虽然雅各布的解法相对于约翰的解法来说更复杂更麻烦,但他的解法更具有一般性,体现了变分的思想。约翰的学生,伟大的数学家欧拉吸收了这一思想,并从 1726 年开始发表相关的论文,最终于 1744 年首先给出了这类问题的解法,并创立了变分学这一新的数学分支。投资者用它来计算最大利润,工程师用它来计算最小损耗,建筑师用它来优化架构。它成为了微积分理论中最强大的工具之一。

扩展阅读

Tuesday, April 26th, 2011 at 09:03

Happy birthday to my blog!

aifreedom.com, 5岁生日快乐.

4月10日是我注册 aifreedom.com 的域名的日子, 续费的时候我却没有意识到它的5岁生日就要到了. 如果不是 Google Calendar 的短信, 恐怕我已经忘记这个日子了.

久未更新, 去年的日志现在还在首页. 还记得去年因为答应过 Layla, 半夜起来更新博客(应该是这篇). 时间越用越紧, ToDo List 却越来越长. Google Reader 也少用了, 获取信息的途径变成了 twitter. 不得不说, 我的生活变得快餐化了, 变得没有耐心整理. 在 yanyang 做的读者调查里, 我坦白地承认, 说我现在很难有耐心认认真真地读完一篇几千字的博文. 读人家写的东西尚且如此, 更别说自己去写了.

仔细梳理一下, 脑子里是有很多东西可以写的. 比如跟 Baiger 提起过, 说我想在考完 GRE 之后整理一下那些典故十分有趣的英文单词. 比如十分想整理, 却只写了一篇的 Linux Tricks 系列. 比如我想重写的 Emacs guide for beginners, 因为我发现之前写的那些教程无法让 Emacs 的学习曲线变得平缓一些. Emacs 往往让初学者在第一天就对它失去耐心. LaTeX 也是如此, 数量庞大的(功能也同样强大)的宏包库总是让初学者无所适从. 而且有的包的 tutorial 就是一本大几百页的大部头(比如我现在用来画图的TikZ). 因此, 我计划写一个"LaTeX宏包小记"的系列, 介绍一些我使用过, 且十分实用的宏包. 我想分享我在做操作系统课程设计中了解到的 Linux 驱动开发基础只是, 我还想分享我在计算机组成原理课程设计中完成的支持类MIPS指令系统的处理器. 这个blog里, 开了头却没能结尾的系列太多了. 以至于有很多读者来信我都没有好意思回复, 在此为我的失礼表示歉意.

想要提高写作水平, 大量的阅读是必不可少的. 但写作的能力, 是不能完全靠阅读来提高的. 最近不少同学在考 AW, 想起暑假准备 AW 的时候, 我写每天一篇 Isuue, 一篇 Arguement. 前后大概写了10天, 总共写了大概20篇, 去考试那天还是觉得心里发虚. 不过好在人品比较好, 抽的题目是 Issue 高频第一和 Argument 高频第一. 但也就是过了半年而已, 现在让我去重考一次, 我恐怕连进场的勇气也没有了.

写blog也是一样, 许久不写之后, 每每想要动笔却不知道该从何说起. 看着上一篇更新的发表日期是那么遥远, 就没有勇气写下新的日志. 但如果不尽快开始, 就永远不可能开始了.

Wish a new start for the next 5 year.

Wednesday, April 13th, 2011 at 23:54

[xkcd]Probability

My normal approach is useless here, too.

My normal approach is useless here, too. | 图片来自 xkcd, 在CC by-nc 2.5协议下分享, link

不知订阅我的blog的读者是否都订阅了xkcd, 这个网站的作者制作了一系列很 Geek 的漫画, 但和我之前介绍的那个Geek系列漫画又有很多的不同之处. 比如今天我分享的这幅, 就给人完全不同的感觉.

Tuesday, April 5th, 2011 at 01:32

在地址栏输入一个字母后的网址

本文在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

好友的日志里看到了一份他的网址列表, 随手整理了一下自己的. "These websites best describe me."
  • a is for aifreedom.com // 没有什么悬念
  • b is for bit.ly // bitly 的统计功能是我的最爱
  • c is for ctex.org // 一个很不错的中文 TeX 论坛
  • d is for douban.com // 豆瓣的 API 很给力
  • e is for e.hust.edu.cn // 学校内部网
  • f is for fanfou.com/home // 重新开饭的饭否
  • g is for gmail.com // 同样没有悬念
  • h is for hub.hust.edu.cn // 蛋疼的选课+查看成绩的网站
  • i is for ibmur.hust.edu.cn // IBM Mainframe 课程网站, 现在是4:31AM, 刚刚做完 S/390 汇编实验
  • j is for NULL
  • k is for kmgtp.org // HUDBT, 不明白为何换了这么个域名
  • l is for lib.hust.edu.cn // 学校图书馆
  • m is for mail.qq.com // QQ邮箱很不错, 但群邮件不能转发, 一直想写个自动抓取群邮件的脚本
  • n is for newegg.com // 新蛋
  • o is for ocw.mit.edu // MIT 的公开课, 推荐 SICP(6.001), 线性代数(18.06)
  • p is for poj.org // 依然没有悬念
  • q is for quwan.com // 东西比淘宝贵, 服务比淘宝好, 但有时候快递很不给力的购物网站
  • r is for renren.com // SNS, 还是 SNS
  • s is for shop35478243.taobao.com // 情理之中, 意料之外. 请做茶包的同学给我来杯茶吧~
  • t is for taobao.com // 除了购物, 更多的时候是查价工具
  • u is for NULL
  • v is for verycd.com // 当资料在 HUDBT 里找不到时, 电骡还是更给力一些. 但绝不推荐 VeryCD 出的 EasyMule.
  • w is for web.qq.com // Linux 平台里最好用的 QQ
  • x is for xiami.com // 知名音乐分享网站
  • y is for youku.com // 知名视频分享网站
  • z is for zitian.cn // 我的域名注册商
Friday, January 14th, 2011 at 04:45

解决 Evince 中查看 PDF 文档中文字体乱码

本文及所附代码, 文件在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

解决在 Linux 里的中文 PDF 乱码问题的文章已经有很多了, 这篇日志只是一篇笔记式的日志, 整理了网上流传的各式"解决方案".

首先, Gnome 下的 Evince 和 KDE 下的 KPDF 用来渲染 PDF 文档的后端程序都是 xpdf. 要让 xpdf 支持中文文档, 需要安装 xpdf-chinese-simplified 和 xpdf-chinese-traditional.

其次, 需要让 xpdf 能识别出 PDF 文档内容的正确编码, 需要 poppler 的支持. 在 Ubuntu 的源里, 有一个叫做 poppler-data 的包, 装上它才能让 xpdf 正确地识别出代码.

最后, 对于没有内嵌中文字体的文档(比如 China-Pub 上的一些试阅图书), 系统默认的配置文件(/etc/fonts/conf.avail/49-sansserif.conf)里的值为 sans-serif. 但默认的 sans-serif 字体是不支持中文的, 需要给它手动指定一个支持中文的字体. 在我的电脑上, 我将 Windows 里的宋体安装了过来, 因此我将上面的配置文件中

<edit name="family" mode="append_last">
    <string>sans-serif</string>
</edit>

改成了

<edit name="family" mode="append_last">
    <string>SimSun</string>
</edit>

Linux 里安装字体的方法见这篇关于 XeLaTeX 的日志.

如果没有安装其他的字体, 可以在终端中输入 fc-list :lang=zh-cn 命令查看已经安装的中文字体.

我认为经过以上的步骤, 就能解决 Evince 下中文 PDF 的乱码问题. 但我同时根据网上各种解决方案, 安装了很多其他的包. 包括 cmap-adobe-* 包(根据描述是将字符编码映射到 CID 字体的表), ttf-arphic-* 包(一堆中文 TTF 字体). 而且根据 apt-log 的结果, 我安装这些包的时间都在2010年9月, 记忆也不甚准确.

有任何疑问或指正请在日志后留言, 感谢各位在这篇日志后留言的老师.

Thursday, January 13th, 2011 at 00:54

LaTeX 宏包小记 (2): listings

本文及所附代码, 文件在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

新年第一篇 post, 祝所有的读者新年快乐(只是不知道这么久都没有更新, 是否还有读者). 去年一年严格地说只写了2篇日志, 新年赶紧补上一篇吧.

这个 \LaTeX 宏包的介绍系列我会坚持把它写下去. 很高兴地看到周围有更多的同学和老师(对, 最新见到几位听说/用过 \LaTeX 的老师了), 这让我有更大的兴趣和信心继续介绍和普及 \LaTeX 的知识了.

再次警告: \LaTeX 是一个较难上手的软件, 而且在熟悉后可能会使你成为一个完美主义者并再也不愿意使用 Microsoft Word.

言归正传, 为 \LaTeX 实现代码高亮的宏包不可谓不多, listings 是我比较熟悉和常用的一个. 这里稍稍总结一下 listings 常用的参数, 更多的配置选项可以在它的手册里查到.

Getting started

listings 可以在 CTAN 下载, 如果访问 CTAN 服务器的的速度太慢, 也可以在 CTeX 提供的 CTAN 镜像下载. CTAN 和 CRAN 的镜像可以分别在这里这里查看. texlive 的各个版本里(至少是2008之后的各个版本里)都有这个宏包. 它的中文字体配置可以参见这篇日志. 如果你使用 texlive. 你可以首先试试编译下面的代码来检验你的 listings 包是否安装成功了:

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[language=C, label=lst:helloworld, caption=Helloworld, numbers=left, basicstyle=\ttfamily]
int main()
{
    printf("Hello world!\n");
    return 0;
}
\end{lstlisting}
\end{document}

如果编译成功了, 那么你应该能看到如下图所示的文档.

helloworld formatted by listings

第一眼看到这段代码我就觉得她有哪儿不对劲, 不过直到 yangyi 教主提醒我才发现它是用的 serif 字体排的代码, 难怪蛋疼.. 加上 basicstyle=\ttfamily 之后, \LaTeX 就会用等宽字体排版了. 但由于LaTeX自带的Computer Modern Typewriter等宽字体没有粗体, 会造成看不出代码高亮的效果(因为默认的代码高亮效果是粗体). 但如果使用 XeLaTeX 并调用 Consolas 或者 Courier 之类带粗体的等宽字体, 就能得到很好的效果.

Options

listings 包提供了 \lstset 命令, 可以用来设置排版出的代码效果的各种选项. 命令的格式是

\lstset{key=value}

下面的代码是我常用的 listings 设置, 从中你可以看出来它的格式是 key = value.

\lstset{numbers=none,
  numberstyle=\scriptsize,
  frame=none,
  flexiblecolumns=false,
  language=Python,
  basicstyle=\ttfamily\small,
  breaklines=true,
  extendedchars=true,
  escapechar=\%,
  texcl=true,
  showstringspaces=true,
  keywordstyle=\bfseries,
  tabsize=4}

常用的设置我都在下面做了简要介绍, 更多的设置请查阅手册.

Language

这应该是最重要的参数了, 它决定了有哪些关键词需要高亮. listings 支持的语言有很多, C/C++, Python, Ruby, Lisp 等许多语言. 详细的支持语言及其标准名称见 lisitngs 文档 第12页 Table 1.

如果想输入等宽的纯文本文件, 可以使用 "language=".

Line Numbers

listings 能显示代码的行号, 相关的 key 有 numbers, numberstyle, stepnumber, numbersep, firstnumber, lastnumber.

numbers 的值可以是 left, right, none, 分别代表了将行号放在代码的左边, 右边和不显示.

numberstyle 的值设置了行号的样式, 可以是 \tiny 等设置字体大小的命令或是设置字体风更的命令.

stepnumber 的值设置了每多少行显示一次行号.

其它的参数我很少用到, 就不一一介绍了. 还是 RTFM(Read The Fucking Manual) 吧.

Frame

这个命令能让代码周围显示边框. 它的值可以是 none|leftline|topline|bottomline|lines|single|shadowbox 中的任意一个(默认为none, 即没有边框).

Escaping to LaTeX

这个选项能让 listings 里的部分代码被 LaTeX 解析而不是原封不动地显示出来. 这个设置对我来说主要有两个用处, 一个是在注释里写上公式, 另一个是它能让 listings 中的中文能正确地排版.

texcl, 设置为 true 后能让代码中的注释按照设置的注释格式显示, 并被 LaTeX 解析后显示. 设置它之后就能在代码里正确显示中文了.

escapechar, 设置了代码中, 被哪个字符包围的部分由 LaTeX 解析后显示在文档里. 比如: escapechar=\% 能让被"%"包围的代码 escape.

escapeinside, 设置两个字符(可以是不同的字符), 被它们包围的字符会 escape, 如 escapeinside=''

为了避免出现错误, 在这个转义(escaping)的区域中, 不要使用任何 listings 的命令, 所有的环境(environment)都必须闭合, $符号必须成对出现.

Floating

这个选项能让 listing 成为浮动对象. 它的值可以是 tbph 的排列组合, 具体含义见The not so Short Introduction to LaTeX(en | cn) 2.12 Floating Bodies 章节. 它可以避免代码块被其他文字打断.

Labels and Captions

使用 label 可以设置标签供文档的其他部分引用, 使用 caption 可以设置 listing 的标题, 这个可以像前面的例子中那样设置. 同时, 你也可以注意到另一种设置 listings 配置的方法.

lstinputlisting, 最后的命令

lstinputlisting 这个命令在排版实验报告和作业文档时特别有用. 它可以将硬盘上的一个文件作为输入, 导入文档中. 这样, 当你修改了程序后, 只需重新编译 tex 文件即可更新文档. 享受过这项的功能的方便后, 我每次看到有人在写大作业报告时, 因为对代码做了细小改动而不得不重新排版报告时, 我都会不由自主地会心一笑.

Sunday, January 2nd, 2011 at 01:28

apt-log: 找回误删的软件包

本文在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

今天想在 Linux 里装上 PPLive 看 WDC 的比赛, 装了几个依赖的 lib 还是不能用. 嫌麻烦不折腾了, 就顺手把刚装的几个 lib 包删掉. 正删着发现不对劲了, 怎么把 gnome-do, workrave, emacs, AUCTeX 都删了?! 想也没想, 就把终端关了. 这时候才想起来关了终端也没用, apt-get 是 root 的进程. 找到 pid, 果断 kill.

但删除已经进行到一半被退出, 也不知道到底删了多少去了. 用 sudo dpkg --configure -a 恢复更新的进程. 果然满目疮痍, 连 nautilus 都没了.. 只有找 apt 的日志来恢复了.

在我的系统里, apt 的日志存在 /var/log/apt/ 目录里. 因为是刚刚删完的, cat /var/log/apt/history.log 里最后一条就是刚删掉的包, 把它们重新装一遍就好了.

顺便, 我还找到了一个给 apt 的 log 提供按日期, 安装包名字等查找的脚本 "apt-log", 可以在它的 Download 页面下载.

使用方法很简单, 看一下它给出的例子就很清楚了. 比如, 按照时间来查找:

  1. apt-log 2010 就会显示出你2010年有更新日志的月份.
  2. apt-log 2010-11 会显示有更新的天. 依次查找, 可以找到每次更新的时间, 也就可以看到每次更新的日志.

apt-log还有一些参数, 比如:

  • apt-log --changes 2010-11-10 显示2010-11-10这一天做的所有修改.
  • apt-log --history kde.* 显示所有kde包的修改历史.
  • apt-log --status gnome.* 显示所有gnome包的状态.

更多的example, 见apt-log作者给出的example/doc.

Wednesday, November 10th, 2010 at 11:35

LaTeX 宏包小记 (1): 用 prosper 制作幻灯片

本文及所附代码, 文件在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

在这个 Blog 里, 我已经写过几篇配置 LaTeX 的文章了, 包括 CJK 宏包字体的配置texlive 2008 的配置. 现在计划开始写一个新的系列, 介绍 LaTeX 里林林总总的宏包(Macro Packages)们.

这个系列的文章不是为对 LaTeX 一无所知的新手写的, 因为我不擅长写入门教程. 但如果你确实需要一本 LaTeX 入门教程, 我极力推荐 "The Not So Short Introduction to LaTeX 2ε". 在 ctex.org 可以找到它的中文版, "一本不太简短的 LaTeX 2ε 介绍".

虽说这个系列不是为新手写的, 但它们也不是为那些已经能闭着眼睛就可以用 LaTeX 排出想要的任何效果的高手写的. 这些文章可以看作是我的学习笔记, 而我希望能在 Blog 里同更多和我一样正在努力成为 LaTeX 高手的朋友们分享. 在这些日志里, 我记录下了使用过的一些有趣和/或有用的宏包. 但实话实说, 这些文章都相当没有技术含量. 在我自己看来, 都如白开水一般平淡无味.

在开始正文前, 先废话几句. TeX 和 LaTeX 这两个词究竟该怎么读? Knuth 说 "TeX" 来自希腊单词 "texnologia"(technology) 的第一个音节, 发音为 "Tech", 就是英文单词 "technology" 的第一个音节. 而 "LaTeX" 的发音是 "Lay-tech" 或 "Lah-tech". TeX 的伟大不仅仅体现在 Knuth 大神那近乎完美的编码, 更体现在 Knuth 大神为它留下的强大的可扩展能力. LaTeX 就是基于 TeX 开发的一个宏包, 它的出现让 TeX 更平易近人, 使普通人也能轻松地完成高质量的排版.

LaTeX 最常见的用途是用来为学术论文进行排版, 因为它可以清晰地体现文章的逻辑结构, 也可以让作者方便地排版数学公式, 更可以很容易地生成像脚注, 交叉引用, 目录和引用文献这样的复杂结构. 但今天要介绍的宏包 prosper 却是用来生成幻灯片的. 使用 LaTeX 生成幻灯片的优势在于它有 METAFONT, tikz 等这样强大的绘图工具的支持, 在演示逻辑性很强的过程时(比如, 演示最短路的算法时)会相当方便. 但缺点是因为生成的文件是 pdf, 很难有丰富的动画效果.

但我这次使用它却只是"闲得蛋疼". 这学期的英文写作课上, 我要代表小组做一个 presentation. 在写幻灯片时, 我放弃了 WPS, 转而尝试了一下完全不熟悉的 prosper.

首先, 文档类型要声明为 prosper, 即 \documentclass{prosper}. 在这里可以声明一些参数, 比如是否生成黑白的幻灯片, 使用何种主题等等. 在导言部分可以用 \title, \subtitle, \author, \institution 等命令定义幻灯片的标题, 作者等信息. 然后就可以 \begin{document}, \maketitle 了. 日志的最后有我这次 presentation 的幻灯片和源文件, 不知道我这段话说了什么没关系, 可以参照那个源文件的结构.

每一页幻灯片都是一个 slide 环境, 就是被 \begin{slide}{title} 和 \end{slide} 包围着的一段文字. 在幻灯片里, 可以随意书写文字, 但为了体现演讲的逻辑性, 应该多使用 itemize 和 enumerate 环境.

为了使幻灯片里的条目可以随着演讲者的要求, 一条一条地出现在屏幕上, 在 PowerPoint 里可以使用动画. 但在这里只能让第一张幻灯片上写着第一条, 第二张第二条, 如此产生它们是一条一条出现的伪动画效果了. 当然, 不需要你自己人肉完成这项工作, 但你得告诉 LaTeX 到哪里是第一条, 到那里是第二条.

需要这样效果的部分要用 \overlay{n}{...} 包围起来, 参数 n 是希望分成的页数. 在内容里, 用 \FromSlide{m} 告诉 LaTeX, 我后面的内容从第 m 张幻灯片才开始显示. 比如在下面的这张幻灯片里, 我想让第一级 itemize 每一个 item 依次出现. 于是我在第一个 item 之前加上了 \FromSlide{1}, 在第二个 item 之前加上了 \FromSlide{2}. 效果就是生成的 pdf 里会出现两张幻灯片, 第一张只有第一条, 而第二张上有两条. 类似的标签还有 \UntilSlide{m} 和 \OnlySlide{m}, 它们表达的含义也很明显.

\overlays{2}{
  \begin{slide}{Demerit in First Draft}
    \begin{itemize}
      \FromSlide{1}
    \item Third Supporting Paragraph
      \begin{itemize}
      \item Mere abstract statements
      \item No example supporting the statement of reliability
      \item The only example is for exception
      \end{itemize}
      \FromSlide{2}
    \item Conclusive Paragraph
      \begin{itemize}
      \item Metaphor
      \item But draw it out more
      \item How is the car like comfortable old clothes?
      \end{itemize}
    \end{itemize}
  \end{slide}}

prosper 自带了一些幻灯片的样式, 但它们大多数都让用惯了 PowerPoint 的人不敢恭维. 我用的这个 fyma 算是里面比较清新的一种了. 样式文件可以在 prosper 的安装文件夹里找到, 那些叫做 "PPRxxxx.sty" 的文件都是样式文件了. 想使用哪种样式需要在 documentclass 的选项里声明. 想自定义样式的可以去查一下 prosper 的手册. texlive 2008 里, prosper 的安装路径是 /usr/local/texlive/2008/texmf-dist/tex/latex/prosper

最后, prosper 不支持 pdfLaTeX, 当然也就不支持 xeLaTeX. 所以想要用它生成 pdf 的幻灯片需要使用 "latex slide.tex && dvipdf slide.dvi" 命令. 而且这带来的问题就是如果要生成带中文的幻灯片需要配置 CJK 宏包. 关于 CJK 宏包的设置和中文字体的按照, 可以参见这里.

下面是源文件和编译好的 pdf.

Read more...

Friday, May 28th, 2010 at 02:28

[2010]雪中华中科技大学

本文在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

2010年的第一场雪后, 用5800在校园里随手照了一些照片. 好像很多人不知道华中科技大学(HUST)是何方神圣, 这帖也算是给我的学校做做 SEO 吧.

眼镜湖, 得名于有两个湖紧紧挨在一起, 像眼镜一样. 这是湖上的醉晚亭, 每年秋天都会在这里举行民族音乐会. "醉晚亭"也是校学生会网站的名字. "有时间, 醉晚一下". 可惜这一年半来我也只醉晚过一次..

眼镜湖边的垂柳

世界名人文化园

湖边的长椅上堆着棉垫一般的积雪

青年园中的一种类似银柳的树, 还请各位老师告诉我这个植物叫什么

南三门边的雪人一家

西操泥马神兽, "坐落在西操的神兽,虽未亲临现场,就在网络上膜拜下吧"

Monday, January 11th, 2010 at 19:02