Doom 的呐喊

Crying in the Day of Doom

Typescripts Rearranged

今天好好看了一下 ConTeXt 的新文档 co-fonts,然后把平时常用的字体都写成 typescript 放到 texmf-local 里。这样以后写作业就不会出现字体定义比文档内容还长的情况了-_-…

首先定义几个 feature sets

\definefontfeature[latin-smallcaps][smallcaps][script=latn]
\definefontfeature
  [fancy]
  [language=dflt, script=latn, method=node, pnum=yes, onum=no,
    kern=yes, liga=yes, dlig=no, zero=no, tlig=yes, trep=yes,
    protrusion=quality, expansion=quality, mapping=tex-text]

然后定义单个字体的 typescript

\starttypescript[myCaslon]
  \definefontsynonym[proserif][name:ACaslonPro-Regular]
  \definefontsynonym[proserifit][name:ACaslonPro-Italic]
  \definefontsynonym[proserifbf][name:ACaslonPro-Bold]
  \definefontsynonym[proserifbi][name:ACaslonPro-BoldItalic]
  \definefontsynonym[Serif][proserif][features=fancy]
  \definefontsynonym[SerifItalic][proserifit][features=fancy]
  \definefontsynonym[SerifBold][proserifbf][features=fancy]
  \definefontsynonym[SerifBoldItalic][proserifbi][features=fancy]
  \definefontsynonym[SerifCaps][Serif][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myPalatino]
  \definefontsynonym[palarm][name:PalatinoLTStd-Roman]
  \definefontsynonym[palait][name:PalatinoLTStd-Italic]
  \definefontsynonym[palabf][name:PalatinoLTStd-Bold]
  \definefontsynonym[palabi][name:PalatinoLTStd-BoldItalic]
  \definefontsynonym[Serif][palarm][features=fancy]
  \definefontsynonym[SerifItalic][palait][features=fancy]
  \definefontsynonym[SerifBold][palabf][features=fancy]
  \definefontsynonym[SerifBoldItalic][palabi][features=fancy]
  \definefontsynonym[SerifCaps][Serif][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myOptima]
  \definefontsynonym[prosans][name:OptimaLTStd]
  \definefontsynonym[prosansit][name:OptimaLTStd-Italic]
  \definefontsynonym[prosansbf][name:OptimaLTStd-Bold]
  \definefontsynonym[prosansbi][name:OptimaLTStd-BoldItalic]
  \definefontsynonym[Sans][prosans][features=fancy]
  \definefontsynonym[SansItalic][prosansit][features=fancy]
  \definefontsynonym[SansBold][prosansbf][features=fancy]
  \definefontsynonym[SansBoldItalic][prosansbi][features=fancy]
  \definefontsynonym[SansCaps][Sans][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myFutura]
  \definefontsynonym[prosans][name:FuturaStd-Medium]
  \definefontsynonym[prosansit][name:FuturaStd-MediumOblique]
  \definefontsynonym[prosansbf][name:FuturaStd-Bold]
  \definefontsynonym[prosansbi][name:FuturaStd-BoldOblique]
  \definefontsynonym[Sans][prosans][features=fancy]
  \definefontsynonym[SansItalic][prosansit][features=fancy]
  \definefontsynonym[SansBold][prosansbf][features=fancy]
  \definefontsynonym[SansBoldItalic][prosansbi][features=fancy]
  \definefontsynonym[SansCaps][Sans][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myMyriad]
  \definefontsynonym[prosans][name:MyriadPro-Regular]
  \definefontsynonym[prosansit][name:MyriadPro-It]
  \definefontsynonym[prosansbf][name:MyriadPro-Bold]
  \definefontsynonym[prosansbi][name:MyriadPro-BoldIt]
  \definefontsynonym[Sans][prosans][features=fancy]
  \definefontsynonym[SansItalic][prosansit][features=fancy]
  \definefontsynonym[SansBold][prosansbf][features=fancy]
  \definefontsynonym[SansBoldItalic][prosansbi][features=fancy]
  % No smallcaps
%  \definefontsynonym[SansCaps][Sans][features=latin-smallcaps]
\stoptypescript
 
\starttypescript[myMonaco]
  \definefontsynonym[promono][name:Monaco_Linux]
  \definefontsynonym[Mono][promono][features=default]
\stoptypescript

ConTeXt Minimals 自带的 px-math 也定义一个

% The internal px-math
\starttypescript[myPxMath]
  \loadfontgoodies[px-math]
  \definefontsynonym[MathRoman][pxmath@px-math]
\stoptypescript

最后写几个常用组合

\starttypescript[PalatinoOptima]
  \usetypescript[myPalatino]
  \usetypescript[myOptima]
  \usetypescript[myMonaco]
  \usetypescript[myPxMath]
  \definetypeface[PalatinoOptima][rm][serif][myPalatino][default]
  \definetypeface[PalatinoOptima][ss][sans][myOptima][default]
  \definetypeface[PalatinoOptima][tt][mono][myMonaco][default][rscale=0.8]
  \definetypeface[PalatinoOptima][mm][math][myPxMath][default]
\stoptypescript
 
\starttypescript[PalatinoMyriad]
  \usetypescript[myPalatino]
  \usetypescript[myMyriad]
  \usetypescript[myMonaco]
  \usetypescript[myPxMath]
  \definetypeface[PalatinoMyriad][rm][serif][myPalatino][default]
  \definetypeface[PalatinoMyriad][ss][sans][myMyriad][default]
  \definetypeface[PalatinoMyriad][tt][mono][myMonaco][default][rscale=0.8]
  \definetypeface[PalatinoMyriad][mm][math][myPxMath][default]
\stoptypescript
 
\starttypescript[CaslonMyriad]
  \usetypescript[myCaslon]
  \usetypescript[myMyriad]
  \usetypescript[myMonaco]
  \usetypescript[myPxMath]
  \definetypeface[CaslonMyriad][rm][serif][myCaslon][default]
  \definetypeface[CaslonMyriad][ss][sans][myMyriad][default]
  \definetypeface[CaslonMyriad][tt][mono][myMonaco][default][rscale=0.8]
\stoptypescript

把这些写成一个文件扔到 textmf-local/tex/context/base 里,然后
luatools --generate; context --make。测试:

\input type-mine
\usetypescript[PalatinoOptima]
\setupbodyfont[PalatinoOptima, roman, 12pt]
 
\setuppapersize[B5][B5]
\setupinterlinespace[line=1.4em]
 
\starttext
Serif test 1234567890.  {\ss Sans test}.  {\tt Typewriter test.}
 
{\it Serif test 1234567890.  {\ss Sans test}.}
 
{\bf Serif test 1234567890.  {\ss Sans test}.}
 
$M_{ath} \times t^{est} = 1234567890.$ \placeformula
\startformula
  \widetilde{G}(\vec k, \omega) = \int_{-\infty}^{+\infty} e^{i(\vec
    k\cdot \vec x - \omega t)} G(\vec x, t)\, {\rm d}^3 \vec x\, {\rm d}t
\stopformula
\stoptext

效果如图

Palatino + Optima Caslon + Myriad
Palatino Caslon

Code Hilighting in ConTeXt

今天需要排一个带 Scheme 代码的文档,里面还有点数学公式,所以决定用 ConTeXt。正好前几天 Steamedfish 同学跟我说过 ConTeXt 可以读取 Vim 的语法加亮,决定看一看。

Google 了一下之后发现 ConTeXt 是使用一个叫做 t-vim 的 module 来干这件事的,我使用的 ConTeXt 发行是 ConTeXt Minimal,于是进入 ConTeXt 的安装目录,更新

./first-setup.sh --extras=t-vim

然后随便排了一个代码。ConTeXt 报错

VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Mar  8 2010 22:56:09)
Garbage after option argument: "-u NONE -e -C -n -c "set tabstop=8" -c
"syntax on" -c "set syntax=scheme" -c "let contextstartline=1" -c "let
contextstopline=0" -c "source 2context.vim" -c "wqa"
"009-vimsyntax.tmp" "

哭了… 这不是要整死我这个 Vim 白痴么… 经过无穷多小时的 google,我终于认识到“Garbage after option argument”错误表示 Vim 的参数有错… 看来要改 t-vim 的代码了。于是打开 t-vim.tex,一看又哭了… 一个 macro 都不认识,这不是要整死我这个 TeX 白痴么… 经过 3000+ ms 的搜索,我终于认识到问题出在 t-vim.tex 的第 344 行:

330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
   {\executesystemcommand
      {mtxrun --verbose --noquote bin:vim
          "-u NONE  % No need to read unnessary configurations
           -e       % run in ex mode
           -C       % Set compatibile
           -n       % No swap
%          -V10log  % For debugging only, will go away later.
           -c \shellescapedquote set tabstop=\@@vstab \shellescapedquote\space    
           -c \shellescapedquote syntax on\shellescapedquote\space 
           -c \shellescapedquote set syntax=\@@vssyntax\shellescapedquote\space
           -c \shellescapedquote let contextstartline=\@@vsstart\shellescapedquote\space
           -c \shellescapedquote let contextstopline=\@@vsstop\shellescapedquote  \space
           -c \shellescapedquote source kpse:2context.vim\shellescapedquote\space
           -c \shellescapedquote wqa\shellescapedquote\space    
            \shellescapedquote#1\shellescapedquote\space "}}

Macro \shellescapedquote 后面的 \space 会在文件名(#1)的后面加上一个空格。而 mtxrun 会把这个空格当作参数的一部分??!!!于是 vim 就会收到一个很诡异的参数而报错。所以我首先想到的解决方法就是把最后那个 \space 去掉。然后发现编译时最后的那个引号(\shellescapedquote)居然就没了,还是出错… 于是我怒了,毅然决定把 mtxrun 换成无敌的 Bash。

\def\runvimsyntax#1
   {\executesystemcommand
      {bash -c "vim -u NONE -e -C -n -c \shellescapedquote set tabstop=\@@vstab \shellescapedquote\space -c \shellescapedquote syntax on\shellescapedquote\space -c \shellescapedquote set syntax=\@@vssyntax\shellescapedquote\space -c \shellescapedquote let contextstartline=\@@vsstart\shellescapedquote\space -c \shellescapedquote let contextstopline=\@@vsstop\shellescapedquote  \space -c \shellescapedquote source /home/corsair/software/context/tex/texmf-context/tex/context/third/vim/2context.vim\shellescapedquote\space -c \shellescapedquote wqa\shellescapedquote\space \shellescapedquote#1\shellescapedquote\space "}}

宇宙终于又开始正常运行了。

ConTeXt MKIV

订阅了 ConTeXt 的邮件列表,看的手痒的不行了,下了一个 ConTeXt minimal。这个东西安装极其的方便,这里有详细流程。唯一的不爽是安装以后是一个独立的 TeX 发行版,不能和现有的TeX tree 合并起来。我试过把安装好的目录拷到 ~/.texmf 里,然后设环境变量,但是 LuaTeX 老是说找不到 script,很郁闷…

现在的 ConTeXt 和一年前已经大不一样。对中英混排已经有了一定的支持。我从这里抄了一份测试文档,稍微改了一下,编译出来效果还是很不错的。

PDF Shot

注意原文档编译出来是不行的,ConTeXt 不会在中文之间断行。必须要在文件里加入

\setscript[hanzi]

才行。另外 MKIV 的内存占用及其恐怖,编译这个文档用了 148M 的内存。

CSS Selectors

昨天做 blog 的文章首字突出显示,使劲看了一下 CSS 的 selector。Selector 分为 9 类

  1. Type selector, 就是地球人都会用的那种,h1, p 什么的都是。CSS3 里引入了 namespace,也算在 type selector 里。
  2. Universal selector, 就是传说中的通配符 *
  3. Attribute selector, 我昨天才知道 CSS 里有这么强悍的东西。比如 p[attr=blah] 会选择 <p attr="blah">.  还有很多其他的用法。
  4. Descendant selector, 一个空格,地球人都用的,比如 h1 em 表示包含在 h1 中的 em.  个人认为 CSS3 中的叫法 descendant combinator 更为准确。
  5. Child selector, 一个大于号。貌似很少用。这个也是表示从属关系,和 descendant selector 的区别是 child 只选择直接的下级。比如 <div><p><span>aaa</span></p></div> 中的 span 可以被 div span 选择,但是不能被 div > span 选择。个人认为 CSS3 中的叫法 child combinator 更为准确。
  6. Class selector & ID selector
  7. Adjacent sibling selector, 一个加号。div + p, 选择紧跟在 div 后面的 p,并且这两个要有相同的父标签。个人认为 CSS3 中的叫法 adjacent sibling combinator 更为准确。在 CSS3 里还有一个和这个差不多的 general sibling combinator, 暂时还没搞明白怎么用。
  8. Pseudo-class.  很常用,我们用的最多的就是 a:visited, a:hover. 除了这个 a 系列以外,还有 :first-child:lang.  CSS3 中的 pseudo-class 就多得让人发指了,随便说几个::nth-child(), :nth-of-type(), :only-child
  9. Pseudo-element, 经常和 pseudo-class 混,包括 :first-line, :first-letter, :before:after.  在 CSS3 里,为了和 pseudo-class 区分,pseudo-element 的符号变成了两个冒号。

Pseudo-class 和 Pseudo-element 的区别

其实很简单。Pseudo-class 的冒号可以想象成 which is.  Pseudo-element 的冒号(或两个冒号)可以想象成 ’s.  也就是说前者选择的是符合条件的冒号前面的东西,而后者选择的是冒号前面的东西的一部分。  感觉有点像面向对象的类包容和类继承~~

回到首字突出

在网上看到很多实现文章首字突出的方法,居然有很多是用 javascript 搞的… 其实完全用不着。我的方法是

.entry-content > p:first-child::first-letter
{
    background-color: #2e3735;
    float: left;
    margin: -0.2em 0 -0.2em -1.15em;
    padding: 0.2em 0 0.2em 0.15em;
    font-family: Arno, Palatino, Georgia, Times, serif;
    font-size: 3em;
    border-radius: 0.2em;
    -moz-border-radius: 0.2em;
    -webkit-border-radius: 0.2em;
}

Reference

  1. http://www.w3.org/TR/CSS21/selector.html
  2. http://www.w3.org/TR/css3-selectors/
  3. http://www.w3.org/TR/CSS21/conform.html

YAFV

早就想写一个地球人能用的字体查看器了。现存的字体查看器都存在一个问题,就是只能查看系统已经识别的字体,或者只能查看某个字体文件,所以对于我这种看到好字体就两眼发直且配字体可以配一整天综合症患者来说,系统里要备有两套字体查看器。

But worry no more~~  新一代轻量级字体查看器 YAFV 已经诞生。功能:

  1. 列出系统中的字体名,并查看
  2. 查看指定的字体文件
  3. 查看指定的字体名

Todo: 查看一票字体文件,像在 feh 里一样切换。

EDIT: 查看一票字体文件的功能已经实现,但是有一个严重问题:如果要查看的字体已经被安装到了系统里,会按照系统中的 style 顺序查看,而不是命令行参数中的顺序。这是因为 Qt 只能以 family name 来调用字体。我得看看 Kfontview 是怎么调用字体的…

EDIT2: 最新更新:已经可以正常的查看系统中已安装的字体文件。在 Google Code 建立了项目

生成 ASCII Arts 的程序

做个广告先:我的 wiki 搬家且更新了,重新设计了 CSS。新地址在这里。

My Wiki

写了一个生成 ASCII arts 的程序,效果如下。

 __   __                           _
 \ \ / / ___  _  _   ___ _  _  __ | |__
  \ V / / _ \| || | (_-<| || |/ _|| / /
   |_|  \___/ \_,_| /__/ \_,_|\__||_\_\

这个程序支持读取 FIGlet 的字体,并且支持两种 kerneling style: 不 kernel 和 fitting。展示如下:

         _____
 _ __   |_   _|   ___
| '_ \    | |    / _ \
| | | |   | |   |  __/
|_| |_|   |_|    \___|
    
       _____
 _ __ |_   _| ___
| '_ \  | |  / _ \
| | | | | | |  __/
|_| |_| |_|  \___|
    
No kerneling Fitting

字体在 figlet 网站下载。顺便展示几个~~

 \_/  _         _      _ |  |
  |  (_) |_|   _> |_| (_ |< o

 .oooooo..o                       oooo        .o.
d8P'    `Y8                       `888        888
Y88bo.      oooo  oooo   .ooooo.   888  oooo  888
 `"Y8888o.  `888  `888  d88' `"Y8  888 .8P'   Y8P
     `"Y88b  888   888  888        888888.    `8'
oo     .d8P  888   888  888   .o8  888 `88b.  .o.
8""88888P'   `V88V"V8P' `Y8bod8P' o888o o888o Y8P

  _____            ______        _  __  __
 / ___/ ___   ___ /_  __/ ___   | |/_/ / /_
/ /__  / _ \ / _ \ / /   / -_) _>  <  / __/
\___/  \___//_//_//_/    \__/ /_/|_|  \__/

嘿嘿 :-D

Ligatures in Firefox

在写完上一篇关于 CSS3 分栏的 post 以后,我查看分栏的效果,突然发现底下英文那一段中的 figure 比较诡异,放大以后发现 Firefox 居然支持字体中的 ligatures~~

关于 ligatures,简单的说就是把某些字母组合搞成一个字母,这样看起来更好看(一般来说是更紧凑)。还有三点补充:

  1. Ligatures 很神奇
  2. Windows 下的程序基本都不能识别 ligatures,除非是 Safari 3 和 Adobe 这样自己写字体引擎的
  3. X 的 Freetype 2 在 patch 之后支持 ligatures。

看截图,是在 Firefox 里放大到 4 倍的结果,字体是 Adobe 的 Gill Sans Std:

Ligatures in Firefox Normal i
连在一起的 f 和 i 普通的 i

Multi-column

CSS3 中增添了对分栏排版的支持,这个我很早就知道了,但是今天才发现 Firefox 和 Safari 3 已经实现了这个东西,真是惊天地泣鬼神… 测试一下~~

中文的:

从那以后,他的预感就不太灵了。那一天,乌苏娜在狱里探望他的时候,他经过长久思考得出结论,这一次,死神很可能不会马上来临,因为死神的来临取决于刽子手的意志,他被自己的脓疮弄得很苦,整夜都没睡着。黎明前不久,走廊上响起了脚步声。“他们来啦,”奥雷连诺自言自语地说,他不知为什么突然想起了霍⋅阿⋅布恩蒂亚;就在这一片刻,在黎明前的晦暗里,霍⋅阿⋅布恩蒂亚蜷缩在粟树下面的板凳上,大概也想到了他。奥雷连诺上校心里既没有留恋,也没有恐惧,只有深沉的恼怒,因他想到,由于这种过早的死亡,他看不到自己来不及完成的一切事情如何完成了……牢门打开,一个士兵拿着一杯咖啡走了进来。第二天,也在这个时刻,奥雷连诺上校腋下照旧痛得难受的时候,同样的情况又重复了一遍。星期四,他把乌苏娜带来的蜜饯分给了卫兵们,穿上了他觉得太紧的干净衣服和漆皮鞋。到了星期五,他们仍然没有枪毙他。

英文的:

A small figure gallops across the windswept ice slope. The bundled rider is mounted on a large gray snow lizard, a Tauntaun. Curving plumes of snow rise from beneath the speeding paws of the two-legged beast. The rider gallops up a slope and reins his lizard to a stop. Pulling off his protective goggles, Luke Skywalker notices something in the sky. He takes a pair of electrobinoculars from his utility belt and through them sees smoke rising from where the probe robot has crashed. The wind whips at Luke’s fur-lined cap and he activates a comlink transmitter. His Tauntaun shifts and moans nervously beneath him.

MacTeX

安上了 MacTeX,这是运行在 Mac OS X 下的基于 TeXLive 的发行版,比 CTeX 还大… 不过像 CTeX 一样,装起来很方便,不用配置,而且一上来就可以排中文~~,不过据我的试验,编码只能为 utf-8,而且可以用的简体字体只有一个 gbsn,这个字体比 M$ 的那个 simsun 好看多了~~。

\\documentclass[12pt]{article}
\\usepackage{CJK}
\\begin{document}
\\begin{CJK}{UTF8}{gbsn}
This is a test. 中文测试。

\\textbf{粗体}\\textit{斜体}\\texttt{等宽字体}\\ldots
\\end{CJK}
\\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End: 

Font gbsn