有些时候最可气的是,明明有个东西你知道见过,但用的时候就是找不到了。
我这学期网络课的项目要求在明天之前交 Proposal,要求中说如果是用 LaTeX 排版的可以有加分。我这学期之前一直在用 ConTeXt,这学期一直在用 Emace Muse 和 org-mode,感觉很长时间没有用过 LaTeX 了。开始的时候我想接着用 ConTeXt,毕竟感觉熟悉一些,但在 Emacs 中打开一个 .tex 文件却提示错误。我才想起我这个自己编译的 Emacs 里面还没有安装任何 ConTeXt 的支持。后来为了方便大家一起工作,决定用 LaTeX。之前加上 AUXTeX 插件的 Emacs 也用惯了,于是我就自己装一次 AUCTeX,既为了这次使用,也为了将来编辑 ConTeXt 时用。
AUCTeX 支持通过快捷键来编译文档。我过去用的应该也是 AUCTeX,但一直没有用过快捷键,因为一直不知道有这个功能。我一般都是或者用 compile 命令,或者按 M-! 来执行 pdflatex 命令。而 AUCTeX 的快捷键的好处就是编译完成后,有没有问题都在 mini-buffer 里面告诉你,而不会把窗口切成两半再出来一个新的 buffer。按 C-c C-l 之后才会调出编译的结果,所以我就一直在用快捷键。
但它有个问题,就是 Emacs 找不到 latex 命令。我用 (getenv "HOME") 检查了一下,发现 Emacs 并没有载入我在 .profile 文件里面设置的 PATH 变量。这样的后果是,AUCTeX 找不到 latex 命令,因为它们都不是安装在默认的 /usr/bin 和 /usr/sbin 目录里面。这让我相当苦恼,不仅 AUCTeX 没法用,原先我的那种 M-! 调用外部命令的方法也不行了。
我印象里之前看过让 Emacs 识别 .profile 文件里的 PATH 设定,但从来没有想到自己也有用到的一天。这次我从网上用各种关键字搜索了很长时间,还是没有找到。CarbonEmacs 在这方面工作是正常的,不过我也没有仔细研究过 CarbonEmacs 的目录分配,不知道相关的设定文件在什么位置,一时间也找不到。
后来我想过一个折衷方法,把 AUCTeX 的 latex 命令设定成绝对路径,也就是在 .emacs 文件里面加上这么一行 (custom-set-variables '(LaTeX-command "/usr/local/texlive/2009/bin/universal-darwin/latex"))。但我发先这样的话,单纯用 latex 是没问题了,但要想用 PDFLaTeX 直接生成 PDF 文件,而不是生成 DVI 文件后再转换成 PDF 文件的话,这样做就没用了。原来是 AUCTeX 没有给每个编译命令设定不同的命令行,而是直接偷懒,如果是想调用 PDFLaTeX 的话,就直接在 LaTeX 的命令行前面加上 pdf。这样的话,AUCTeX 生成的 PDFLaTeX 命令行就成了 pdf/usr/local/texlive/2009/bin/universal-darwin/latex,自然找不到相关的程序了。
后来我没办法,直接用笨办法,在 .emacs 里面设定 PATH 变量。也就是加上这么一段:
(setenv "PATH"
(concat
"/opt/local/bin" ":"
"/opt/local/sbin" ":"
"/usr/bin" ":"
"/bin" ":"
"/usr/sbin" ":"
"/sbin" ":"
"/usr/local/bin" ":"
"/usr/texbin" ":"
"/usr/X11/bin"
(getenv "PATH")
)
)
这种方法,我参考了 Xah Lee 的文章。
不知道是不是心理作用,我试验了这种方法之后,总是觉得启动的速度变慢似地。不过这样确实是在设定程序里面加了一些不应该添加的东西,因为他们降低了 .emacs 文件的“可移植性”。所以我又在找其它的办法,于是我找到了这篇文章。文章介绍了通过设定 Mac OS X 本身的 plist 来让 Emacs 获取设定的路径。方法是在终端里面运行 defaults write $HOME/.MacOSX/environment PATH “$PATH” 这么一行。我试验了之后,手动观察了一下 ~/.MacOSX/environment.plist 文件,发现里面是乱码。我对 plist 文件的格式不了解,以为是系统给编码了。文章中说执行完这行命令后,要重启一下计算机才行,我也乖乖重启。但重启之后却发现 Emacs 中根本还是老样子。
印象里 Mac 自带了一个程序,可以编辑 plist 文件的。我于是找了一下,发现了 Property List Editor.app 程序。进去后打开了 ~/.MacOSX/environment.plist 文件,试着把乱码改成了 PATH 变量里的内容,再重启之后就好了。不过这样也不是很完美,我查了一下系统的 PATH 变量,有些路径出现了两次,不过不影响使用。
这件事给了我又一个 Mac OS X 系统与 UNIX 系统之间的不同的地方。可能是为了兼容旧程序,Mac 没有统一实行一个策略。既然已经有了 PATH 方式,为什么还要弄个 plist 让某些程序读取呢?我觉得 UNIX 传统的路径政策是非常好的,通用、设定起来也方便。Mac 的很多这策是只给用户提供一种最通用的办法,而这种情况下,一个简单的路径就有了不同的设定方案,两者还不统一,确实给用户带来了麻烦。