Technology

用 Dropbox 实现云同步游戏存档

Steam 云存档 (Steam Cloud) 是一项很方便的功能, 能让你在多台电脑上玩同一个游戏的时候, 无缝云同步游戏存档. 去年年初发布的戴森球计划 (Dyson Sphere Program) 到今天 (2022年2月27日) 为止, 还没有更新对 Steam 云存档的支持. 在他们1月19日发布的“进化的伊卡洛斯” FAQ中里提到他们“仍然在研究云存档部分的功能”. 那如何在官方支持发布前实现云同步存档呢? 用 Dropbox 和符号链接就能做到.

这里假设所有需要同步存档的电脑都有安装 Dropbox 客户端, 并且 Dropbox 同步的文件夹放在了 %HOMEPATH%\Dropbox 目录里.

第一步, 先找到游戏的存档在硬盘里存在哪里了. 对于戴森球计划, 它的存档默认放在了 %HOMEPATH%\Documents\Dyson Sphere Program 里. 对于其他游戏, 默认的存档路径可能会不一样, 除了像戴森球计划一样放在Documents里, 也有可能在 AppData (%HOMEPATH%\AppData\)里. 注意, AppData是个隐藏文件夹, 如果在任务管理器里找不到, 可以在”查看”菜单里把显示“隐藏的项目”勾选上.

第二步, 把装有存档的文件夹移动到 Dropbox 里去. 这里记得先做好备份, 不要因为误操作丢失了存档. 我在 Dropbox 里新建了一个文件夹 Game Saves, 用来存放我所有用 Dropbox 同步的游戏存档.

第三步, 用mklink创建一个从之前的存档保存路径指向 Dropbox 里的新存档保存路径的符号链接. 这里要用管理员身份打开 Windows 命令提示符, 才能有足够的权限. 按下 Windows 键, 输入 cmd, 如下图所示, 在右边的菜单里选择”以管理员身份运行”.

Screenshot of cmd run as admin

在管理员命令提示符窗口里, 输入 mklink /D "%HOMEPATH%\Documents\Dyson Sphere Program" "%HOMEPATH%\Dropbox\Game Saves\Dyson Sphere Program" (假设你和我一样是把存档放在 Dropbox 的 Game Saves 文件夹里, 如果不是的话请自行替换目标路径). 如果成功的话, 会提示符号链接创建成功.

好了, 至此就已经成功地让本地的游戏存档同步到 Dropbox 上了. 之后, 对于每一台想要用 Dropbox 同步游戏存档的电脑, 只需要把它们本地的存档目录替换成指向 Dropbox 同步目录的符号链接即可. 具体来说, 就是把它们本地的 %HOMEPATH%\Documents\Dyson Sphere Program 目录删除(如果有想要保留的存档, 请自行备份), 然后执行上面的第三步, 创建一个指向 Dropbox 的符号链接就可以了.

在 GameShell 上玩仙剑奇侠传

Update (2019-10-08): 之前一个版本的命令完全不能用, 因为写文章的时候我已经基本把游戏都设置好了, 那些命令其实是我想出来觉得应该可以用的. 但我今天不小心把 GameShell 的文件系统弄坏了, 不得不重新刷系统 image, 才发现真的错的很离谱. 现在是更新后的版本, 在 v0.4 image 上亲测可用.

最近入手了一件新玩具 GameShell - 一款外形像 GameBoy, 系统基于 Linux 定制的高可玩性掌机.

GameShell 开箱时和高达模型一样, 零件需要自己用模型剪钳从板件上剪下来, 然后自己动手组装起来才能玩. 组装过程并不复杂, YouTube 上可以找到很多组装视频教程. 需要注意的是好多零件的水口又宽又厚, 不太好处理. 不过就算是我这种模型新手, 拼出来的成品看着质量也还过得去.

言归正传, GameShell 自带的系统 image 里已经装了 GBA, SFC 和 PS 的模拟器. 这些模拟器核心都是通过 RetroArch 加载的. RetroArch 是一个支持多种模拟器核心的前端框架, 功能十分强大. RetroArch 里自带的核心加载器可以直接从网上下载安装各种后端, 而这其中就包括 DOSBox. 当我看到这里, 脑海中闪过的第一个念头就是 – “那不是可以用来玩仙剑奇侠传了?!”

在开始之前, 请一定把 clockworkOS 更新到 v0.3 v0.4! 新版的系统支持 Lima 显卡驱动, 能显著提高系统性能, 降低 CPU 使用率和耗电. 刷机可以用 balenaEtcher, 过程十分傻瓜. 要先刷机再设置的原因是, 刷机之后, 整个 tf 卡的文件系统都会被覆盖, 之前所有的设置都得重新来过.

首先, 要在 RetroArch 里下载 DOSBox 的核心. 把 GameShell 连上 Wi-Fi 后, 从菜单里打开 RetroArch. 在菜单里先选择 Online Updater => Update Core Info Files 更新模拟器核心的索引文件. 然后回到 RetroArch 的主菜单, 选择 Load Core => Download Core…, 找到 DOS(DOSBox), 选择下载. DOSBox 核心就下载好了.

然后, 要去准备一份仙剑奇侠传 DOS 版的文件. 这里请大家自行 Google. 这里假设游戏在本地的路径是 ./Pal95.

最后, 要把仙剑奇侠传复制到 GameShell 里, 并创建启动游戏的菜单项. 回到 GameShell 的目录里, 打开 TinyCloud. 这里可以看到 GameShell 在本地局域网里的 IP 地址(后面的命令里假设这里的 IP 地址是 192.168.1.123), 和GameShell 默认用户的用户名和密码 (都是 cpi).

先把仙剑奇侠传 DOS 版复制到 GameShell 的系统里:

ssh cpi@192.168.1.123 'mkdir -p ~/games/DOSBOX/Pal95/' && scp -r ./Pal95 cpi@192.168.1.123:'~/games/DOSBOX/'

再创建一个启动游戏的菜单项, 并复制到对应的目录下:

mkdir -p ~/apps/Menu/21_Indie\\ Games/20_Pal && echo \'#!/bin/bash\nretroarch --verbose -L ~/.config/retroarch/cores/dosbox_libretro.so ~/games/DOSBOX/Pal95/PAL!.EXE\' > ~/apps/Menu/21_Indie\\ Games/20_Pal/Pal.sh'

回到 GameShell 主菜单, 选择”重载菜单”, 在主菜单重新加载之后, 就可以从 Indie Game 里找到 “Pal” 并进入仙剑奇侠传了. 进入游戏前, 记得去 GameShell 的系统设置里, 选择 Lima 作为 GPU 驱动.

至此, 应该已经可以在 GameShell 里加载仙剑奇侠传了. 但我发现在默认的设置下, 动画的部分会有卡顿的感觉, 模拟器也会时不时死机. 解决的办法是在主机上按 Shift + MENU 键进入 RetroArch 的菜单, 进入 Options => CPU cycle multipler, 把默认的 100 改成 1000, 再把 CPU cycles 改成 3. 然后在同一级菜单里选择 Save Game-options file 把设置保存下来.

最后, 在 RetroArch 的菜单里选择 Controls, 可以调整 GameShell 按键如何映射到游戏里的按键. 要调整的是先把 User 1 Device Type 设置成 Keyboard + Mouse, 把方向键映射到对应的键盘方向键, A 键映射到 Space, B 键映射到 Escape, 就可以实现方向键走路, A 键确定, B 键返回的基本设定了. 同样记得在设置完成后选择 Save Game Remap File 把设置文件保存下来. 下面是我设置好之后的 remap file 内容, 你也可以选择把它传到 GameShell 上去, 在 RetroArch 里直接加载.

input_libretro_device_p1 = "3"
input_player1_key_a = "32"
input_player1_key_b = "27"
input_player1_key_down = "274"
input_player1_key_left = "276"
input_player1_key_right = "275"
input_player1_key_up = "273"

好久没写过 blog 了, 如果整个过程中有什么问题, 欢迎留言提问.

LaTeX 宏包小记 (2): listings

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

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

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

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

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

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 的日志来恢复了.

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.

TeX Live 2008 安装 & 配置中文支持 (下)

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

居然拖了两个多月都没把这篇文章写完, 但十月份之前总算交出了它的下半篇.

上次说到把 XeLaTeX 安装好了. 但默认的设置对中英文混排支持还不够好, 不能对中文和英文分别设置字体, 也不能很好地处理中文和英文之间的空白距离. 我们可以安装孙文昌老师开发的 xeCJK 宏包来解决这个问题.

xeCJK 的宏包可以在这里下载到. 这个不是最新版的 xeCJK, 因为最新版的 xeCJK 需要 xetex 0.9995.0 之后的版本(TeX Live 2009 或 MiKTeX 2.8). 而且新版的 xeCJK 已经被收入 ctex-kit 项目, 将随 TeX Live 2009 一起分发. 就是说, 等到 TeX Live 2009 Release 的时候, 它对中文的支持会比现在好很多.

把刚刚下载到的压缩包解压到 ~/.texlive2008/texmf/tex/xelatex/, 然后用mktexlsr 更新. (这里我不是很了解, 只是照葫芦画瓢, 没自己看过文档, 有什么问题还请诸位老师指正)

unzip xecjk-2_2_15.zip -d ~/.texlive2008/texmf/tex/xelatex/
cd ~/.texlive2008/texmf
mktexlsr .

在刚才下载的压缩包里的 doc 文件夹里有 xeCJK 的完整文档, 我这里给出一个我使用的 preamble 模板.

%# -*- coding: utf-8 -*-
\documentclass[a4paper]{article}

\usepackage[slantfont, boldfont, CJKtextspaces,
CJKmathspaces]{xeCJK} % 允许斜体和粗体
\setCJKmainfont[BoldFont={Adobe Heiti Std}, ItalicFont={Adobe Kaiti
  Std}]{Adobe Song Std} % 设置缺省中文字体
\setCJKmonofont{Adobe Fangsong Std} % 设置等宽字体

\setmainfont[Mapping=tex-text]{Liberation
  Serif} % 英文衬线字体
\setsansfont{Liberation Sans} % 英文无衬线字体
\setmonofont{Bitstream Vera Sans Mono} % 英文等宽字体
\punctstyle{kaiming} % 开明式标点格式
  
\usepackage{indentfirst} % 首段缩进
\begin{document}
  
{默认字体}   {\bfseries 粗体效果}   {\itshape 斜体效果}

这是Ai.Freedom的Blog的第101篇日志。

居然拖了两个多月都没把这篇文章写完,但十月份之前总算交出了它的下半篇。

上次说到把 XeLaTeX 安装好了。但默认的设置对中英文混排支持还不够好,不能
对中文和英文分别设置字体,也不能很好地处理中文和英文之间的空白距离。我
们可以安装孙文昌老师开发的 xeCJK 宏包来解决这个问题。

\end{document}

但这里给出的代码你很可能还无法编译, 因为你没有安装 Adobe 的字体. 这里用到的四个字体可以在这里下载到. 其中 Adobe Song Std 和 Adobe Heiti Std 是随 Adobe Reader 一起分发的, 根据 Lisence 可以免费使用, 关于另外两个字体的版权我还不是很清楚.

把它们下载回来了之后解压到 ~/.fonts 目录中. 然后执行

sudo fc-cache -fv

更新字体缓存. 好了, 把刚才的代码保存到 test.tex 后用

xelatex test.tex

编译就可以得到 test.pdf 了.

在下载的 xeCJK 的压缩包里, source 目录下有一个脚本用来为特定的字体生成标点符号. 按照 README 里的提示, 将 xecjksetpunct-main.tex 里用于 Windows 平台的部分注释掉, 把 Linux 里用到的语句的注释去掉, 然后把下面的字体设置成自己用的字体, 保存. 我们这里用的是 TeX Live, 所以执行

xelatex --shell-escape xecjksetpunct-main

然后把生成的 xeCJKpunct.spa 文件移动到 .texlive2008/texmf-var/tex/xelatex/xecjk/tex/xelatex/xecjk 目录下, 覆盖默认的 xeCJKpunct.spa 文件. 最后执行

texhash .

好了, 我们的配置总算是告一段落了. 关于 xeCJK 的更多详细的设置选项, 请查询它的文档. 学习 LaTeX 文档的排版, 有这样一本 “The not so Short Introduction to LaTeX“, 这个链接是中文版的, 还有 CTeX 论坛的版主 milksea 推荐的这个列表. 学习 LaTeX 的资料真的很多, 只要你愿意动手.

Linux Tricks (1)

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

之前写过一段时间的 Linux 日记, 后来没有继续更新了. 但我发现把在使用 Linux 的过程中解决某些问题的过程用文字记录下来是很有用的! 比如前些天我的同学问我 Mplayer 的 RMVB 解码器是哪个包, 我却记不起来了. 但我记得我写过一篇日志记录了我解决这个问题的过程, 于是他的问题也顺利解决了.

我一直认为学习的过程就是”不断遇到问题, 并寻求解决问题的方法”的过程. 把这个过程记录下来, 就为自己再次重温这个过程留下了线索. 这也就是笔记的重要性. 我在上课时很少做笔记, 但阅读有价值的书是一定要做笔记的. 计划等我有一大段空闲时间了就去整理我的笔记, 把他们都整理成 TeX 文件或者 Muse 文件.

现在这个 “Linux Tricks” 系列, 每一篇都不会太长, 内容比较杂乱, 但涉及的方面会很多. 很多的 Trick 都是从论坛或者 Blog 上看来的, 把它们集中在一起, 既方便了我日后查看, 又传播了 Linux 的文化.

今天的两个Tricks分别从徐宥TualatriX 处学到, 感谢他们的分享.

1. 史上最强 PS1

这里说的 PS1 不是 Sony 的 Play Station I, 是 Bash Shell 的提示字符串(Prompt String). 就是下图中 “$” 字符前的那些信息.

Snapshot of the shell with the PS1 above

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
	# We have color support; assume it's compliant with Ecma-48
	# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
	# a case would tend to support setf rather than setaf.)
	color_prompt=yes
    else
	color_prompt=
    fi
fi

if [ $color_prompt=yes ]; then
    PS1='`a=$?;if [ $a -ne 0 ]; then echo -n -e "\[\e[01;32;41m\]{$a}"; fi`\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\W`[[ -d .git ]] && echo -n -e "\[\e[33;40m\](branch:$(git branch | sed -e "/^ /d" -e "s/* \(.*\)/\1/"))\[\033[01;32m\]\[\e[00m\]"`\[\033[01;34m\] $ \[\e[00m\]'
    # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='`a=$?;if [ $a -ne 0 ]; then echo -n -e "{$a}"; fi`\u@\h \W`[[ -d .git ]] && echo -n -e "(branch:$(git branch | sed -e "/^ /d" -e "s/* \(.*\)/\1/"))"` $ '
    # PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

这个 PS1 有两个功能: 一是高亮显示所有非0返回值, 如图所示; 二是在 Git 管理的目录下显示当前的 Git branch. 最近因为在做C语言课程设计, 用了 Git 来管理我的代码. 所以这个显示分支功能我太喜欢了. (虽然这个项目没有分支的必要..)

将上面的代码加入你的 ~/.bashrc 文件.

如果你使用 Emacs 的 Shell-mode, 那么你需要把 ANSI 彩色字符支持打开.

将下面的代码加入你的.emacs文件.

(ansi-color-for-comint-mode-on)

2. 一行语句的HTTP文件服务器

python -m SimpleHTTPServer

可以将当前目录设为一个在8000端口开放的http服务器的根目录. 在互联网中临时共享文件的时候是多么地方便阿!

徐宥说很多哥们还不知道 “wget -c” 能断点续传, 是这样么?

TeX Live 2008 安装 & 配置中文支持 (上)

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

Knuth 爷爷的 TeX 系统堪称完美! 但他在发明它的时候没有考虑到对英文之外的语言的支持, 因此用 LaTeX 给中文排版一直有些麻烦.

一年前, 我写过一篇日志介绍 TeX Live 2007 的中文支持配置. 但那个还是用 CJK 实现对中文的支持, 字体的配置比较麻烦. 而现在我要推荐的是 XeTeX, 它对中文的支持比 LaTeX + CJK 包要好很多. 这个解决方案是基于 XeLaTeX + xeCJK 实现对中文的支持. 其实 XeLaTeX 支持中文排版, 但它对中英文混排的支持不是很好. 它不能为中文英文分别设置字体, 也不能很好地控制中英文混排时的间距. 这些都是靠 xeCJK 这个宏包完成的. 去年的时候 LeafDuo 就跟我说 XeTeX 的中文支持很好, 但当时因为懒惰, 一直没有配置起来. 直到不久前写C语言实验报告, 才有了动力把 XeTeX 配置起来.

这篇日志主要记录的是我在 Ubuntu 中安装 TeX Live 2008 及配置中文支持的过程, 在 Windows 中安装与配置的过程与本文有些区别.

这一篇讲的是下载安装 TeX Live 2008, 下一篇讲的是将是 Linux 字体安装和 xeCJK 的配置.

Ubuntu 的源里就有 XeTeX 了, 而这里不使用源里的那个 XeTeX 是因为它的版本比较旧, 之后安装中文排版支持宏包会遇到一些麻烦.

TeX Live 可以直接在线安装, 也可以把光盘镜像下载回本地安装. 考虑到网速等问题, 我是下载镜像到本地之后安装的.

TeX Live 的镜像可以在 TeX Live 的主页下载到. 在中国, 使用 CTeX 的镜像下载会比较快.

1. 如果要使用图形界面安装, 需要先安装 perl-tk; 解压 lzma 格式的压缩包需要安装 lzma.

在 Ubuntu 的源里有这两个包, 可以使用 apt-get 安装.

sudo apt-get install perl-tk p7zip

2. 进入存下载的镜像的目录, 将压缩包解开.

注意, 这一步需要有 4-5G 的空余磁盘空间. 解压后的光盘镜像似乎有 2-3G.

lzma -d texlive2008.iso.lzma

3. 挂载刚刚解压出的 iso 镜像.

sudo mount -o loop texlive2008-20080822.iso /mnt

4. 执行安装程序

sudo /mnt/install-tl --gui

这时会弹出安装程序的窗口.

将最后一项 “Create symlinks in system directories” 勾上, 让它自动创建符号链接.

我几乎把所有的包都装上了, 如果你的硬盘空间足够, 也就不需要做什么改动了. 但可以在第四项 “Language Collections” 中去掉不需要的语言包, 节省几百兆的空间.

配置完后点击 “Install TeX Live“, 等上几分钟就装好了.

现在 XeLaTeX 就已经可以处理中文了, 不信你试试编译这个 tex 文档.

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Adobe Song Std}
\begin{document}
  Ai.Freedom的Blog\\
  aifreedom.com
\end{document}

这里用的 “Adobe Song Std” 字体需要你从 Adobe 下载后安装. 在 Linux 中安装字体的方法会在下一篇中介绍.

编译的命令用 xelatex. 这个文档是可以正常编译的, 但用宋体显示英文字体太丑了, 所以就需要 xeCJK 告诉 XeLaTeX 哪些字符该用哪些字体. xeCJK 的配置和简单的使用也会在下一篇中介绍.

Twitter on Emacs

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

Twitter Logo

Update[20090603]: 由于 Twitter 撞墙, 这个 Elisp 在中国大陆暂时无法使用.

Update[20090609]: 昨天 Twitter 又神奇地穿墙了..

Twitter.com 是一家微博客网站, 你可以在上面发布短消息, 每一条消息都不能超过140个字符. 因为每条消息的内容相对博客的一篇日志要少很多, 所以它们被叫做”微博客”. 微博客现在越来越流行了, 我认为一个很重要的原因是它相对博客显得更随意. 但是一个流量很大又太随意的 Twitter Feed 是谁也不愿意 Follow 的. 说真的, 如果你不是徐静蕾, 有多少人关心你每天的早餐吃的什么, 路上是不是堵车了, 中午是不是小睡了一觉呢?

而在 CCTV 大火等突发事件中, 在 Twitter 上都已经开始广泛讨论时, 网易, 新浪等门户网站上还迟迟没有相关新闻. 这很好地显示出了 Twitter 上消息传播的即时性. 很多”正在发生”的事情, 去 Google 上搜索还不如去 Twitter 上搜索. 比如这个事. 有一个 Greasemonkey 的脚本能在搜索 Google 同时显示 Twitter 里的搜索结果, 可以在这里安装. Greasemonkey 是 Firefox 的一个扩展, 可以用脚本修改网页的内容, 还是不清楚 Greasemonkey 是什么的可以等着看我准备要写的 Firefox 扩展推荐.

回到主题, Emacs 真的不愧是一个伟大的编辑器. 你可以在我的 Blog 里找到我之前写过的关于 Emacs 的新手指南(虽然现在看起来, 它不是一份很好的入门指南), 我翻译的 Emacs 默认快捷键列表, 还有一个 Emacs 资源网站的书签列表在这里. 而今天要说的是一个让你可以在 Emacs 里收发 Twitter 消息的扩展.

Snapshot of Twitter on Emacs

这是我在查看最新的消息的截图. 这个扩展的主页在这里, 在这里可以下载到最新的代码, 现在最新的版本是 0.3.3.

把它下载后保存到一个 Emacs 能找到的地方(在这里有添加扩展的方法介绍), 然后在 .emacs 里写上配置.

  (require 'twit)
  (setq twit-show-user-images t) ;; 显示好友头像
  (setq twit-user-image-dir "~/.twit") ;; 设置头像保存路径

然后重启 Emacs, M-x twit-show-recent-tweets, 输入用户名密码后就可以看到最新的消息了. 可能在你输完以后消息没有显示出来, 按一下 g 之后等两秒就应该能看到了.

在这个 buffer 里, 有一些默认的快捷键, 比如 g 是刷新消息, a 是查看@你的消息, w 是发消息, r 是回复别人的消息, d 是给某人发 Direct Message. 常用的就这些吧.

我还在全局绑定了一些键, C-c t 是查看最新的消息, C-c w 是发消息.

(global-set-key (kbd "C-c t") 'twit-show-recent-tweets)
(global-set-key (kbd "C-c w") 'twit-post)

下面是我的 Twitter Profile 的地址, 欢迎 Follow.

https://twitter.com/aifreedom