6
3
2014
7

照镜子为什么是左右颠倒,而不是上下颠倒?

这是个虽然简单但是很有意思的问题,以前我竟然未曾想过。后来看到「宇宙的心弦」上对这个问题的回答写得太模糊(什么叫「镜子里头脚的位置没变」?「位置没变」的定义是什么?),所以这里写一个尽可能精确描述的回答。首先,我们讨论最容易引起问题的那种情景,即人站立时正面照镜子。

首先定义几个概念。

左右。以你为原点,你的左手方向为左,右手方向为右。(你知道哪只手是左手吧?)

上下。站在地球表面,在空中静止释放一物体,由于重力,它会运动起来。其运动方向为下,反之为上。

前后。这个有点奇特。你面前站了一个人,背心对着你的时候,这是那人的面。面对着你的时候,你看到那人的面。我们的问题隐含了作为观察者的你,去看外界的像,而不是考察你自己,对吧?

让我们再定义一下坐标系。

右为 x 轴正方向,上为 y 轴正方向,由你(观察者)的后背指向你的胸前为 z 轴正方向。

作为观察者,这里有一个很明白的变换:你所认为「正」的像,其坐标要绕 y 轴旋转 180°,才能与你观察时使用的坐标系一致。让我解释得更清楚一些——

拿鼠标指针选中你,按一下Ctrl-D(如果你不是 Inkscape 用户,那就按一下Ctrl-C再按一下Ctrl-V)。现在有了你的一个像。但是你看不到它,因为它和你重合了。让我们把这个像向 z 轴正方向平衡一段距离,比如 2m,你再看看?哟,它怎么背对着你呀?不行,再原地转身 180°,这样才能看到正面不是?

忽略掉平移,让我们把这个变换记作 \(T_1\),有

$$ T_1 = \begin{bmatrix} \cos{\pi} & 0 & \sin{\pi} \\ 0 & 1 & 0 \\ -\sin{\pi} & 0 & \cos{\pi} \end{bmatrix} = \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{bmatrix} $$

我们再来考察一下镜子做了什么。

想像镜子前有一个坐标系的三根轴,就是我们刚刚定义的那个。其中 z 轴正方向指向镜面。于是乎,镜子里的 x 轴与外边的 x 轴是平行且方向一致的。y 轴也是这样。但是 z 轴的位置没有改变,方向却反了过来,箭头对箭头了。所以,这种放置法,使得像与物体的 z 轴反了,\(z\) 变成了 \(-z\)。还是忽略掉平移,让我们把这个变换记作 \(T_2\)

$$ T_2 = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{bmatrix} $$

所以,最终作为观察者的你,看到的镜中的自己经历的变换是:

$$ T_1 T_2 = \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{bmatrix} = \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} $$

即最终的像的坐标中的 \(x\) 变成了 \(-x\),即左右颠倒。

让我们再考虑另一种情况试试。如果把镜子放在头顶上,看过去会是什么感觉呢?

这时候,y 轴一头扎进了镜子,于是,我们的第三个变换 \(T_3\) 为:

$$ T_3 = \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} $$

乘一下,结果是:

$$ T_1 T_3 = \begin{bmatrix} -1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & -1 \\ \end{bmatrix} $$

咦?这不是上下、左右、前后都颠倒了吗?找面位于天花板的镜子试试看。上下的确颠倒了不是么?再伸出左手试试,左右也和在面前的镜子里一样,也是颠倒的。可,前后感觉并没有颠倒啊?这是因为观察者和被观察对象位于同一垂直线上,感觉不一样了。仔细想想,天花板镜子里的像的前后确实与面前的镜子晨那个的前后是对着的,不是么?而我们定义后者没有颠倒,那么前者当然相对于后者是颠倒过了嘛。

个人拙见 =w=

Category: 未分类 | Tags: 物理
3
13
2014
1

我的浏览器A到Z

Re: 的确挺好玩的~

那个 frecency 懒得去研究是干什么用的,大概是频度之类的?frecency 即是火狐地址栏著名的 frecency 算法的值。

A
标题:工作台 - Chito
URL:http://lilydjwg.is-programmer.com/admin
访问次数:1828
frecency:3564600
最后访问日期:2014-03-13 21:26:42

B
标题:搜索结果 (页 1) / Arch Linux 中文论坛
URL:https://bbs.archlinuxcn.org/search.php?action=show_new
访问次数:1550
frecency:3100000
最后访问日期:2014-03-13 21:47:33

C
标题:Twitter / Interactions
URL:https://twitter.com/i/connect
访问次数:673
frecency:1063004
最后访问日期:2014-03-13 20:30:28

D
标题:豆瓣
URL:http://www.douban.com/
访问次数:290
frecency:212507
最后访问日期:2014-02-26 21:34:39

E
标题:所有消息 - SegmentFault
URL:http://segmentfault.com/user/events
访问次数:298
frecency:539380
最后访问日期:2014-03-13 21:44:30

F
标题:Index of /ftp/python
URL:http://python.org/ftp/python/
访问次数:7
frecency:2614
最后访问日期:2014-02-19 23:45:13

G
标题:Gmail
URL:https://mail.google.com/mail/
访问次数:396
frecency:449053
最后访问日期:2014-02-28 20:26:26

H
标题:工作台 - Chito
URL:http://lilydjwg.is-programmer.com/admin
访问次数:1828
frecency:3564600
最后访问日期:2014-03-13 21:26:42

I
标题:依云's Blog
URL:http://lilydjwg.is-programmer.com/
访问次数:100
frecency:126258
最后访问日期:2014-03-09 23:28:52

J
标题:jQAPI - Alternative jQuery Documentation Browser
URL:file:///home/lilydjwg/%E6%96%87%E6%A1%A3/%E7%BD%91%E9%A1%B5/Javascript/jqapi_2013-01-21/index.html
访问次数:5
frecency:1446
最后访问日期:2013-12-18 02:25:01

K
标题:The Linux Kernel Archives
URL:http://kernel.org/
访问次数:41
frecency:33347
最后访问日期:2014-03-02 21:47:12

L
标题:Lua 5.2 Reference Manual - contents
URL:file:///usr/share/doc/lua/contents.html#index
访问次数:24
frecency:14682
最后访问日期:2014-03-05 21:47:52

M
标题:Google 地图
URL:https://maps.google.com/
访问次数:83
frecency:52035
最后访问日期:2014-03-12 19:30:50

N
标题:None
URL:http://lilydjwg.is-programmer.com/admin/posts/new
访问次数:24
frecency:33600
最后访问日期:2014-03-13 22:08:35

O
标题:查看版面 - Vim和Emacs • Ubuntu中文论坛
URL:http://forum.ubuntu.org.cn/viewforum.php?f=68
访问次数:236
frecency:166138
最后访问日期:2014-03-02 22:26:47

P
标题:Python Module Index — Python v3.3.0 documentation
URL:file:///home/lilydjwg/%E6%96%87%E6%A1%A3/%E7%BC%96%E7%A8%8B/Python/python/py-modindex.html
访问次数:124
frecency:169744
最后访问日期:2014-03-10 23:10:46

Q
标题:Qt 4.8:
URL:jar:file:///home/.ecryptfs/lilydjwg/public/%E6%96%87%E6%A1%A3/%E7%BC%96%E7%A8%8B/qt4-doc/qt4-doc.zip!/index.html
访问次数:9
frecency:5198
最后访问日期:2014-03-06 22:05:35

R
标题:InoReader • 轻便快捷的 RSS 阅读器
URL:https://www.inoreader.com/
访问次数:155
frecency:177119
最后访问日期:2014-03-12 22:41:51

S
标题:SegmentFault
URL:http://segmentfault.com/
访问次数:1486
frecency:411473
最后访问日期:2014-03-13 20:47:13

T
标题:Google 翻译
URL:http://translate.google.cn/?hl=zh-CN
访问次数:138
frecency:145314
最后访问日期:2014-03-11 23:50:21

U
标题:Pinboard: public bookmarks for vayn
URL:http://pinboard.in/u:vayn
访问次数:13
frecency:5589
最后访问日期:2014-02-16 18:42:04

V
标题:查看版面 - Vim和Emacs • Ubuntu中文论坛
URL:http://forum.ubuntu.org.cn/viewforum.php?f=68
访问次数:236
frecency:166138
最后访问日期:2014-03-02 22:26:47

W
标题:新浪微博-随时随地分享身边的新鲜事儿
URL:http://weibo.com/
访问次数:78
frecency:117933
最后访问日期:2014-02-27 22:51:10

X
标题:None
URL:http://localhost/xcache/
访问次数:6
frecency:6688
最后访问日期:2014-03-02 22:50:15

Y
标题:soimort/you-get
URL:https://github.com/soimort/you-get
访问次数:24
frecency:19374
最后访问日期:2014-03-07 21:13:24

Z
标题:消息 - 知乎
URL:http://www.zhihu.com/notifications
访问次数:528
frecency:823165
最后访问日期:2014-03-09 16:53:10


附:从 URL 生成这些数据的代码。当然,还有后期处理,是用 Vim 简单地做了几次正则替换。

#!/usr/bin/env python3

import os
import sys
import sqlite3
from time import strftime, localtime

places = os.path.expanduser('~/.mozilla/firefox/profile/places.sqlite')

def main():
  db = sqlite3.connect(places)
  sql = '''select title, visit_count, frecency, last_visit_date
           from moz_places where url = ? limit 1'''
  c = db.cursor()

  for url in sys.stdin:
    url = url.strip()
    c.execute(sql, (url,))
    title, visit_count, frecency, last_visit_date = c.fetchall()[0]
    print('''\
标题:%s
URL:%s
访问次数:%d
frecency:%d
最后访问日期:%s
''' % (title, url, visit_count, frecency,
       strftime('%Y-%m-%d %H:%M:%S', localtime(last_visit_date//1000000))))

if __name__ == '__main__':
  main()

又附:上边的代码忘记写是哪个字母了 -_-||| 已经补上,用了个 Vim 宏来完成。话说好久没用 Vim 宏了呢~

Category: 未分类 | Tags: 程序员 火狐 浏览器
2
21
2014
10

编程语言的特色

Tcl:一切皆字符串。
Python:一切皆对象,真的!整数、函数、类、方法、模块、代码、函数调用栈等等都是对象!
Lisp:好一碗美味的括号汤!
Lua:在与不在之间——nil。
Zsh 脚本:Perl 根本不算什么!
Haskell:=纯粹+庸懒+晦涩
Erlang:你不是一个人在战斗,不是一个人!
 

Category: 未分类 | Tags: 随思
11
25
2013
9

被冻结的时间

那天中午,照例在网上闲逛时,却得知,那条时间线将永远停留在那时候,永远不会再流动了。不会再有新的消息,也不再会作出回应。

也并不是所有这样的事件都会如此高调地宣告它的发生。

有时,只是突然想起,有个人,很久很久都没有出现过了。

然后发现,询问的消息如石沉大海,有去无回。

甚至都没有办法去搜寻,因为我所知道的信息是那么不完整。

网络世界中,人与人,就像由虚拟的线联系起来。

那些带来温暖和慰藉的线,经常都是那样的纤细。

或者在某个不被注意的瞬间消逝,或者在最后的告别之后断掉。

Mark Pilgram 主动 410 时我只是唏嘘。

当有朋友对我说永别时,我惊讶、不敢置信,亦无限惋惜。

而那些悄然丢失的联系,只能埋藏起来,等待下一次被发掘。虽然明知那几乎不可能。

那些被冻结的时间,那些不会有回应的消息,那些永远的失去。

Category: 未分类 | Tags:
4
13
2013
2

[转] 程序员妻子自述:那些程序员教给我的

来源:伯乐在线

声明:没有找到原文授权说明。文章所有权人如果有异议请联系我。


我曾经跟朋友开玩笑说,这个时代,有两种人的妻子应该要受人尊敬,第一种是军嫂,这是毫无争议的,第二种就是像我这样的,程序员的老婆。当然,这个 玩笑半分自嘲半分真。我的本科是穿着大白褂在各种挂着植物、动物、有机化学、无机化学的门牌的实验室里度过的,在显微镜下给三段生的夹竹桃画过横切片图, 在大头针和解剖剪子的辅助下找过蚯蚓的三条神经,闻过带有臭鸡蛋味的硫化氢气体……

是的,你们都猜对了,我确实是相貌平平,不修边幅,素面朝天的理科女。见了人就开始习惯性地科普:蝴跟蝶,蜻跟蜓,其实是不一样的,还有,白菜跟萝卜其实都是属于十字花科啦,香港的市花根本就不是紫荆,那是马蹄甲,还有,还有,那个康乃馨的学名其实更好听的,叫石竹花……

没有人欣赏我。

因 为没有人在意我在说什么。是啊,我说的那些东西根本就没什么用处,别人还不如去微博上关注科学松鼠会。他们说,女生就应该好好打扮自己嫁个好老公,谁关心 什么纲目科属种。他们说,女生就应该多读点张小娴和亦舒。他们说,女生就应该多学点礼仪和瑜伽。他们说,你要是什么都不会,就学点厨艺啊。他们说,理科的 女生就是木讷,又没有情调,不如去选修一个文科的双学位吧?

——为什么呢?

——为什么?!你不想嫁个好老公吗?!

——哦。

其 实,虽然我没有读过张小娴和亦舒,但是我读过三毛,读过张爱玲,读过严歌苓,读过杨绛,读过席慕容,读过冰心,读过安妮宝贝,读过七堇年,读过王安忆,读 过《飘》,读过《安娜·卡列尼娜》读过《苏菲的世界》……不是只有清新文学和治愈系才能诠释一个女性啊,难道严肃文学就不能解读一个女性了么?

虽然没有学过礼仪,可是我大一就开始报名学习街舞。难道只有学过礼仪的女生才值得被疼惜被怜爱,而一个戴着鸭舌帽跳街舞的女生就应该遭到集体鄙视么?

……

是的,你们都比我聪明,知道我会遇到一个正眼看我的男生。

他告诉我,你很特别啊,很好啊,不需要改变啊……

我顿时就觉得他的周围笼罩了耶稣一般的光辉。

他是个程序员。

当然我不否认我从小到大确实有被一些审美有问题的男生夸奖过长得好,或许是他们深知白富美不会给予垂怜,像我这样的不入流的长相应该可以徒添他们的自信。但是,从来没有一个人跟我说过那么一句话:

你很特别。

可惜晴天霹雳是个贬义词,不然我真的很想用来形容我当时听到这句话的心情。

然后呢,然后我就义无返顾地成了一位程序员的老婆。我继续给他科普各种知识,他从来都是饶有兴致地看着我,就算我口沫横飞手舞足蹈他都不会嫌我聒噪。我甚至在他的鼓励下一天一天觉得自己确实长得不错。

直到有一天,我看到了那个小黑窗,看到了各种在小黑窗上面跳跃的白色字符。

——这是什么意思啊?

——这个表示创建一个目录,这个表示进入这个目录,这个表示查看这个目录的列表内容……

——哦……我给你洗个苹果吧……

后来,我们一个房间两台电脑,我们都不知道彼此在做什么。

后来,我说要不你教教我学编程吧。

后来,他告诉我一个网站,里面是《笨办法学python》,告诉我他常常看cnbeta,看爱范儿,看瘾科技,看糗事百科,告诉我他用 google reader,gmail,告诉我什么是单核什么是双核,告诉我什么是bug,告诉我固件指的不是一个固态的硬件而是软件,他送给我手机, 然后帮我刷机,送给我ipod touch然后帮我越狱,给我的电脑里面装上ubuntu……

他不让我在手机上面贴膜,并花时间跟我解释为什么不需要这么做。也是摔了几次之后他才答应我给手机买个保护壳。

他常常给我普及隐私的重要性,告诉我要及时备份我的各种文件。

后来,我陪他看《生活大爆炸》看《行尸走肉》看《生化危机》……

后来,我陪他逛华强北,逛博物馆,陪他加班……

后来,我考上了研究生,我们结了婚,分隔两地。

我开始学习PHP,学习HTML,学习Java,学习Dreamweaver,学习PS……

然后我开始给身边的女生普及各种计算机知识,陪她们去买电脑,挑手机,告诉她们不要给手机贴膜……

后来,我认识了很多很多很多程序员。从我的老师到同学,从我的朋友到朋友的朋友,从我读的书里面。

我从他们身上学到了很多。

我知道了 Steve Jobs,知道了为什么 less is more,知道了为什么用户体验那么重要,知道了 stay hunger stay foolish.

我知道了 Steve Krug,知道了为什么面包屑会叫做面包屑,也知道了为什么网页要做得 Don’t make me think。

我还知道了 Norman,知道了诺曼门,知道了如果东西使用不便不是我的错,而是设计的问题。

……

我懂得了程序员的幽默。

看到了不一样的世界。

我真正开始从心底里肯定自己,也是因为他。

这是一个好男人带给我的。

所谓的独立,便是不向别人过多索求,也不过多抱怨。

很遗憾的是,我没能带给他什么不一样的东西。

于是就想起了张卫健那首很老的歌:

“我什么都没有,就是有一点吵,如果你感到寂寞,我带给你热闹……”

Category: 未分类 | Tags: 程序员
11
26
2011
7

给博客加入 Google +1 按钮

本来我是懒得去做这种东西的,可鉴于以下几个原因,还是弄了一个。

  • Mike 也 +1 了
  • 代码很简单
  • 方便分享到 Google Plus
  • 反正从国内访问本博客也不容易,就不在乎这个 +1 按钮很可能出不来了

代码如下,真的很简单:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">{lang: 'zh-CN'}</script>
<g:plusone></g:plusone>

我把它加到了每篇文章的末尾,因为我不认为没看完文章的读者会需要用到它。看不到按钮的读者请自行解决对 Google HTTPS 的访问问题。

Category: 未分类 | Tags: Google
9
29
2011
4

Flash 游戏 Music Catch 2 hack 攻略

Music Catch 是 Reflexive 出品的一款音乐游戏,其PC版本收费,但有两个免费的Flash版本。版本一是一个非常有限的预览版,只内置了一首音乐;版本二不仅内置了更多音乐,并拥有更多选项,它还支持从URL获取外部音乐:

不过,这些选项要逐个解锁——即完成它们。好不容易全部解锁后,终于可以播放自己的歌曲了。搭建个HTTP服务器,却发现需要公网能访问才行,而且速度死慢死慢的——因为它是从自家的网站的一个代理获取歌曲文件的。这也是Flash跨域请求的限制。简单抓包下就可以知道该怎么对付了。

首先修改 hosts 文件,把那个代理劫持到自己机器上:

127.0.0.1       wgextras.gamecentersolution.com

然后是crossdomain.xml文件,把它放自己的根目录下。

<cross-domain-policy>
    <site-control permitted-cross-domain-policies="master-only"/>
    <allow-access-from domain="*"/>    
</cross-domain-policy>

最后是那个代理脚本了,路径是/proxy.php。我简单地用PHP写了个:

<?php
# 为 Music Catch 2 而写
# 使其可以直接从本地读取音乐文件
error_reporting(0);
if($_POST['MusicCatch']){
  $mp3 = file_get_contents($_GET["url"]);
  header("Content-Length: ".strlen($mp3));
  header("Last-Modified: ".gmdate("F d Y H:i:s")." GMT");
  header("Connection: close");
  header("Accept-Ranges: bytes");
  header("Content-Disposition: attachment; filename=\"song.mp3\"");
  header("Content-Type: audio/mpeg");
  echo $mp3;
}else{
  header("HTTP/1.1 400 Bad Request");
?>
<title>400 Bad Request</title>
<h1>400 Bad Request</h1>
<hr/>
<p>This page is intended for Music Catch 2.</p>
<?php
}
?>

就是这样。现在再从URL加载音乐时,只需要一两秒的时间了。

最后,Music Catch 2 SWF 文件下载

Category: 未分类 | Tags: flash 网络
5
9
2011
40

可笑的计算机网络应用设计实验作业

计算机网络应用设计实验是我们计算机网络课程的后继实验课程。今天是其上机的最后一天,于是得到最后要回去自己做的作业。看到其要求后我大跌眼镜——

要求完成FTP客户端、SMTP客户端、POP3客户端三个系统程序,以及一个应用程序

客户端操作系统为Windows XP。

FTP程序要求具有图形化界面、上传、下载功能,鼓励实现断点续传功能,SMTP/POP3程序具有邮件编写、发送、接收、阅读、删除等基本功能。FTP、SMTP、POP3程序使用socket方式编程,从创建socket、建立TCP连接开始,实现FTP、SMTP、POP3协议的功能,不得调用第三方控件(可使用操作系统自身的API函数)。编程工具可以使用C#或VC++。

应用程序要求实现一个网上书店的基本功能,要求具有前端(用户)和后端(管理)功能,基于Web运行方式。前端具有浏览书目、购物车等功能,后端具有管理书目、基本统计功能。编程工具可以是MS .NET(C#)或者J2EE 二选一,数据库可以是SQL Server、DB2、Oracle、Mysql、PostgreSQL之一。

我们的计算机网络课程是讲从物理层到应用层、从路由协议到TCP协议等等的,这个“计算机网络应用设计实验”总共有七次,要么使用思科的 Packet Tracer 模拟,要么在机柜的机器上弄,配置路由啊VLAN啊之类的,很是正常。可最后这个实验设计是怎么回事?就算是计算机网络应用程序设计课程也没有这么严格而变态的要求啊。这不仅仅是应用层的编程,而且还是Windows图形界面编程、数据库编程、C#或Java Web编程!这样的课程作业,实在应该在至少大二就布置下来,因为它可以作为另外至少四门课的大作业!!

对了,还有一点很令我郁闷——报告要求交Word 2003版格式的文件。根据我未读完的《Word排版艺术》里的信息,以及Word不断弹出的关于Normal.dot文件的对话框,我很确定Word会将文档的某些信息保存在本地的其它文件中,从而导致文档不具有可移植性,别人看到的排版可能根本不对。不过我估计那些用Word的老师没几个人听说过《Word排版艺术》。微软的罪孽在于,它把本来复杂的东西弄得看似简单,实则更加复杂。

武汉大学计算机学院,你太令我失望了!!!

参见:一名大学毕业生的反思已失效链接二

2011年10月10日再加个链接:珞珈山水BBS -- 作为一名毕业生,谈谈哪些行业或者企业不宜进入[原创]

Category: 未分类 | Tags: 教育
10
14
2010
2

QQ群邮件:美好生活路上的又一障碍

如果能够不用QQ,生活会变得美好。可现实是,我不仅不得不使用QQ,而且还得使用腾讯烂得要命的群邮件服务。

QQ邮箱又挂掉了

WebQQ不知从什么时候开始不再提示新(群)邮件了。由于我们课件什么的都只知道往群邮件里发,我只好每隔几天去查收一次,不然所谓的“超大附件”会过期的。

说起“超大附件”我觉得好笑。现在都什么年代了,我网易邮箱现在6G的存储空间,附件大小可达50M,其它邮箱附件也至少可以20M。我还以为“超大附件”有几百M呢,原来才超过5M就是“超大”了。为什么腾讯不设置成1.44M的限制呢?

看到群邮箱里有不少课件,一个个手动下吧。很快就下好了,结果双击一个PPT,却是用OpenOffice Write打开的,还是空白页面。。。。我还没弄明白出什么事了,到虚拟机的XP里用MS Office打开,结果是“无法打开xxx所代表的文件类型”(微软的用词一向很怪异,我就不追究了)。再试试那些rar文件,也出错。这才注意到文件的大小不对。

OK,算我网络不行,那重新下吧。结果回邮箱里就遇到上面截图里的情况了。。。

这不是我第一次遇到,也不是第二次。我相信也不会是最后一次

唉,难道这就是劣币驱逐良币

PS: wget rocks!

Category: 未分类 | Tags: QQ 腾讯
6
10
2010
0

多篇Word课件打印,我这样省纸

我需要六个共21页Word文档的课件以供开卷考试时使用。可是打印成21页也太浪费了!字号可不需要那么大,于是使用Ooo调整字号,结果令我郁闷的是,除了大部分文字位于左边而右边很多空白之外,我发现项目符号依旧是很大的字号。这样可不行。而且,一个个文件处理太没效率——我马上就要去应考了啊!考虑过LaTeX,结果因为不会调字体而放弃。于是想起了前些天发现的Google Docs使用的prince。于是开始工作——

首先把Word转成txt。我使用的是wvText这个位于wv包的工具。只能一个个文件转,不过我使用的是shell脚本(因为要手动给那些Word排序),这个就没关系了。然后把内容cat到一起,成为一个大的纯文本文件。然后打开这个文件,用Vim删去空行,然后在利用正则表达式\v第.章|^(一|二|三|四|五|六|七|八|九|十)加上Vim的宏给标题前空一行免得到时候不好找答案。prince是处理HTML的,所以还要把它改成HTML。这个手动就可以了,写上head标签,meta指明编码,正文前后加上<pre>标签,再写点样式表:

pre {
  font-size: 11px;
  font-family: 'Adobe Song Std';
  -moz-column-count: 2;
  -moz-column-gap: 20px;
  -webkit-column-count: 2;
  -webkit-column-gap: 20px;
  column-count: 2;
  column-gap: 20px;
  white-space: pre-wrap;
}

这里用到了我最近学到的多栏布局的CSS,prince认识它。然后使用prince转成PDF,打开一看效果灰常不错,而且只有六页了!

注意,CSS里的white-space是必须的,不然不会自动折行,左栏的过长文字会叠加到右栏。

PS: prince共享版会在每个生成的文件的第一页的右上角加个图标,但打印时并没有打印出来。

Category: 未分类 | Tags: shell prince

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com