Tuesday, February 15, 2011

Short notes about LaTeX2e fonts

对LaTeX上的字体概念一直很混淆,所以这里大概总结一下一点概念与机制。
主要涉及到字体的使用与选择,但不包括使用任意自定义字体/系统字体,以及中文字体。
关于中文字体+LaTeX,可以使用CJK[utf8]宏包,可以参考以前一篇旧文
关于使用任意字体,太复杂,此处不表。参考[1]的section 4,文档 [8], 以及tex-font-cheatsheet [5] (also available using texdoc).
以上两个问题比较简单的处理方法是使用XeTeX/LuaTeX,它们都能直接使用系统的字体。因此顺带也把中文的问题给解决了。

所谓的NFSS, New Font Selection Scheme。
参考 fntguide [1], psnfss2e [2](可用texdoc docname打开),
以及Font selection in LATEX: The most frequently asked questions (schmidt.pdf) [3]。
以上三个都是只有十来页的文档,非常值得一读。
另外,有一个非常好的网站 [4] 列出了LaTeX上主要能用的字体(depends on distribution)。
想用某种字体前可以先去参考。

以下为summary:
  • 每种font有五个attributes:
    • encoding, 如OT1, T1 等。
    • family, 如cmr (=Computer Modern Roman), ptm (=Adobe Times)等. 值得注意的是,family 又分为三种:
      • roman (serif),即衬线字体
      • sans serif,即无衬线字体
      • typewriter (monospace),即等款字体
    • series, 如m for medium, b for bold
    • shape, 如n for normal, it for italic, sl for slanted, sc for caps and small caps.
    • size, 如1.5in, 3mm
  • 所以,OT1 cmr m n 10 就是指 Computer Modern Roman 10 point, TeX 里面的font name就是cmr10
  • 所以,平时见的\textxx command就是用来设置这写attr的。如\textrm{..} 用来更改 family, \textbf{..} 更改 series, \footnotesize 更改size 为 8pt
  • 用于底层的font selection command为\font... 系列。如\fontfamily 用来选择family
  • 使用author commands来直接选择字体。上面所说的如\textrm会选择一种现在选定的roman字体(\rmdefault)。因此要更改这个设置,则可以更新\rmdefault:
    • \renewcommand{\rmdefault}{ptm}
  • 数学字体与文本字体不同,并且更复杂。比如上面的命令只改变了文本字体,而没有改变数学字体。所以一般是用package来封装、完成上面所说的这些命令。
    • 比如要把文本和数学字体都改为Times, 则执行 \usepackage{mathptmx}
  • LaTeX包含有可用的minimum font sets ``PSNFSS collection'',除了默认的Knuth大爷的Computer Modern,还有Times, Helvetica, Palatino, Chater等,强烈建议参考 [2].
    • 注:在 PSNFSS 里有一个pifont,包含了一些有趣的符号。如扑克牌……
  • 执行 pdftex testfont 可以测试LaTeX能用的字体。执行后,输入字体名字(如cmr10),然后 \sample, \bye。TeX会生成对应的一个示例。font-change [6] 给出了一份不错的参考。
关于数学字体:
  • 通过\mathbf 等命令来使用某种特别的数学字体。型如 \mathbf 的字体称为 math alphabets。它们只能在数学模式内使用。
  • 数学字体与文本字体一样具有五个attribute。然而,它们并不能被单独设置,而只能通过设置 "math version" 来设置。predefined的math version有normal和bold。它们只能在数学模式外调用。如 \mathversion{bold} 选择使用了 \boldmath 这个math version。
  • 综上所述,要选择特定的数学字体,必须使用如下的步骤:
    • 定义一个新的mathversion:如 \DeclareMathVersion{normal}
    • 定义相应的mathalphabet,如\SetMathAlphabet{\baz}{normal}{OT1}{cmss}{m}{n}, 它设置 \baz 为 normal 这个 math mode 的一个math alphabet,其中的OT1, cmss m, n参数意义如文本字体
    • 定义数学符号字体以及数学符号。以上只是设置了math alphabet的字体,还必须为符号再定义一套字体。参考 [1]。
    • 定义数学字体大小。有四种大小:\textstyle, \displaystyle, \scriptstyle 与 \scriptscriptstyle,使用\DeclareMathSizes设置。
    • 最后,使用 \mathversion 来选用这个 math version.
最后,The UK TeX FAQ [7] 也是一份非常不错的文档,它的section K 包含了字体相关的FAQ。 可以使用 texdoc FAQ-en 来察看一份pdf copy。

Reference:
[1] fntguide
[2] psnfss2e
[3] schmidt.pdf
[4] The LaTeX Font Catalogue, http://www.tug.dk/FontCatalogue/
[5] tex-font-cheatsheet
[6] font-change
[8] 为LaTeX 添加英文 TrueType 字体, http://giantchen.googlepages.com/TrueTypeFonts_en.pdf

Tuesday, February 1, 2011

用 ruby 做url decode

最近用iGetter从离线迅雷的服务器下载文件时, 发觉文件名会成为这样的东西:

%C0%EE%BD%A1.(%B8%BD%D4%F9MV).%B7%E7%B4%B5%C2%F3%C0%CB

这是encode过的url。
于是必须进行url decode。发觉竟然没有一个现成的command line tool能用。
网上的资源中, 英文版的一般不能处理这样的字符串, 因为它是用GBK编码再encode的。
于是自己用ruby简单地写了一下:

#!/usr/bin/env ruby
# -*- coding: utf-8 -*- 

require 'uri'
require 'iconv'

if ARGV.size <= 0 
        puts "Usage: ./urldecode url ..."
        exit
end

ARGV.each do |a| 
        str=URI.decode("#{a}")
        puts Iconv.conv("utf-8", "gbk",str)
end

注意国内资源一般是在win下用gbk编码的, 所以带来了很多不方便, 直接url decode得到的并不是utf8编码的字串。
因此必须用iconv转换一下。

使用方法为:
./urldecode "%C0%EE%BD%A1.(%B8%BD%D4%F9MV).%B7%E7%B4%B5%C2%F3%C0%CB"

得到正确的字串为:

李健.(附赠MV).风吹麦浪

参考文档: