2008年3月27日星期四

中文docbook转换成PDF终于实现

终于搞定了~~~
  • 首先安装fop
# autounmask dev-java/fop-0.94-r1
据说fop对中文的断行支持得比0.93好。另外"zh_cn"也可以正确处理了。
# emerge fop -av
  • 然后生成字体描述文件
# java -cp /usr/share/fop/lib/fop.jar:/usr/share/avalon-framework-4.2/lib/avalon-framework.jar:/usr/share/commons-logging/lib/commons-logging.jar:/usr/share/commons-io-1/lib/commons-io.jar org.apache.fop.fonts.apps.TTFReader /usr/share/fonts/fireflysung/fireflysung.ttf fireflysung.xml
TTF Reader for Apache FOP 0.94

Parsing font...
Reading /usr/share/fonts/fireflysung/fireflysung.ttf...
Font Family: AR PL New Sung
Creating xml font file...
Creating CID encoded metrics...
Writing xml font file fireflysung.xml...
This font contains no embedding license restrictions.

XML font metrics file successfully created.

# java -cp /usr/share/fop/lib/fop.jar:/usr/share/avalon-framework
-4.2/lib/avalon-framework.jar:/usr/share/commons-logging/lib/commons-logging.jar:/usr/share/commons-io-1/lib/commons-io.jar org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" /usr/share/fonts/winfonts/simsun.ttf simsun.xml
TTF Reader for Apache FOP 0.94

Parsing font...
Reading /usr/share/fonts/winfonts/simsun.ttf...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
SimSun <-- selected
NSimSun
Font Family: SimSun
Creating xml font file...
Creating CID encoded metrics...
Writing xml font file simsun.xml...
This font contains no embedding license restrictions.

XML font metrics file successfully created.
# mkdir /etc/fop
# mv *.xml /etc/fop
  • 建立FOP配置文件
# cp /usr/share/doc/fop-0.94-r1/examples/conf/fop.xconf /etc/fop
# cd /etc/fop

建立zhfop.conf的内容如下:

<?xml version="1.0"?>
<fop version="1.0">
<base>.</base>
<renderers>
<renderer mime="application/pdf">
<filterList>
<value>flate</value>
</filterList>
<fonts>
<font metrics-url="/etc/fop/simsun.xml" kerning="yes"
embed-url="/usr/share/fonts/winfonts/simsun.ttf">
<font-triplet name="SimSun" style="normal" weight="normal"/>
<font-triplet name="SimSun" style="normal" weight="bold"/>
<font-triplet name="SimSun" style="italic" weight="normal"/>
<font-triplet name="SimSun" style="italic" weight="bold"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
  • 创建xsl文件
# cat /usr/share/sgml/docbook/xsl-stylesheets/fo/docbookzhcn.xsl
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
exclude-result-prefixes="doc"
version="1.0">
<xsl:import href="docbook.xsl"/>
<xsl:param name="body.font.family">SimSun</xsl:param>
<xsl:param name="body.font.size">12</xsl:param>
<xsl:param name="monospace.font.family">SimSun</xsl:param>
<xsl:param name="title.font.family">SimSun</xsl:param>
<xsl:param name="page.margin.inner">2cm</xsl:param>
<xsl:param name="page.margin.outer">2cm</xsl:param>
<xsl:param name="hyphenate">false</xsl:param>
<xsl:param name="paper.type" select="'A4'"/>
<xsl:param name="draft.mode" select="'no'"/>
</xsl:stylesheet>

  • 用xsltproc来生成HTML或者XSL-FO文件

譬如,下面是根据Docbook文档生成HTML的例子:
$ xsltproc --output myfile.html /usr/share/sgml/docbook/xsl-stylesheets/html/docbook.xsl myfile.xml

或者根据docbook文档生成XSL-FO文档的例子:
$ xsltproc --output myfile.fo /usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl myfile.xml

  • 用fop生成PDF文档
$ fop -c /etc/fop/zhfop.conf -xsl /usr/share/sgml/docbook/xsl-stylesheets/fo/docbookzhcn.xsl -xml myfile.xml -pdf myfile.pdf

2008年3月2日星期日

Gentoo Linux nVidia指南(译)

最近翻译的一篇gentoo文档,响应乐伯特的号召贴出来。

可到下面这个链接去找全部gentoo简体中文文档:
http://www.gentoo-cn.org/trads/
如果想入伙,到下面这个链接看一看:
http://www.gentoo-cn.org/trads/#doc_chap4

Gentoo Linux nVidia指南

Sven Vermeulen 作者
Joshua Saddler 作者
M Curtis Napier 编辑
Chris Gianelloni 编辑
刘清 译者

更新于2007年 11月 15日

1. 简介

portage树中的nVidia驱动由nVidia发布,构建于Linux内核之上。驱动中包括一个担负与卡对话的艰巨任务的二进制部分。驱动包括两部 分,内核模块和X11驱动。两部分包括在一个单独的包中。因为nVidia给它们的驱动打包的方式,你需要在安装驱动前进行一些选择。

nvidia-drivers 包包括来自nVidia的最新驱动,支持所有nVidia的显卡。根据卡的新旧不同,有几个版本。它使用eclass检测你正在使用的是哪种卡,然后安装适合的版本。

2. 驱动兼容性

哪个版本?

nvidia-drivers包支持所有可用的nVidia卡。根据你使用的卡,有多个相应版本。

较新的卡(如GeForce 8, 7, 6和FX 5系列)应该使用100.x系列的较新的驱动。

较老的卡(如GeForce 3或GeForce 4系列)需要96.x驱动。对于这些卡,你应该在/etc/portage/package.mask中屏蔽掉>=x11-drivers/nvidia-drivers-97.00。这样将阻止安装你的显卡不兼容的新版驱动。

老的基于NV2x的显卡(如:TNT、TNT2、Geforce和GeForce 2)需要更老的71.x驱动(例如nvidia-drivers-71.86.01)。对于这类卡,你应该在/etc/portage/package.mask中屏蔽掉>=x11-drivers/nvidia-drivers-87.00

你可以在发布说明通过读相应的x86或x86-64的README来检查你的显卡与哪个驱动兼容。

3. 配置显卡

内核配置

正如刚才提到的,nVidia内核驱动在你当前内核上运行。它做成了一个模块,所以你的内核必须支持内核模块的加载才行。如果你是用genkernel all配置的内核,那就是可以的。如果不是,请再检查一下你的内核配置,保证这项支持被打开。

代码 3.1: 打开内核模块加载的支持

Loadable module support --->
[*] Enable loadable module support

你还要在内核中打开Memory Type Range Register

代码 3.2: 打开MTRR

Processor and Features --->
[*] MTRR (Memory Type Range Register) support

另外,如果你装的是AGP显卡,你可以选择打开内核里的agpgart支持,直接编到内核里或者编成模块。如果你不使用内核中的agpgart支持,驱动将使用它们自己的agpgart实现,这个实现叫做NvAGP。在某些系统中,它的表现要强于内核中的agpgart。在另外一些系统中,它的表现要弱于内核中的agpgart。你需要自己评估在你自己的系统中哪个更好以得到最佳性能。如果你搞不清楚该怎么做,那就使用内核中的agpgart吧。

代码 3.3: 打开agpgart支持

Device Drivers --->
Character devices --->
<*> /dev/agpgart (AGP Support)

注意: 在amd64平台,IOMMU控制着agpgart的设置。

平台相关注释

重要: 对于x86和AMD64的处理器,内核中的驱动与nvidia提供的二进制驱动冲突。如果你为这些CPU编译内核,你必须按照下面的方法完全去掉内核中的驱动。

代码 3.4: 去掉内核中的驱动

Device Drivers --->
Graphics Support --->
< > nVidia Framebuffer Support
< > nVidia Riva support

一个不错的framebuffer替代物── VESA

代码 3.5: 打开VESA支持

Device Drivers --->
Graphics Support --->
<*> VESA VGA graphics support

然后,在"VESA driver type"中选中vesafbvesafb-tng。如果你用的是AMD64的处理器,你应该选择vesafb而不是vesafb-tng

代码 3.6: 选择framebuffer类型

(X) vesafb
( ) vesafb-tng

要了解更多的信息,如果在用vesafb可以读/usr/src/linux/Documentation/fb/vesafb.txt,否则就到/usr/src/linux/Documentation/fb/下找你使用的framebuffer的相应文档。

继续进行内核配置

nvidia-drivers的ebuild按/usr/src/linux符号链接自动检测你的内核版本。请确认你正确配置了你的内核而且这个符号链接指向了正确的内核源码。参阅安装手册中的"配置内核"一节。

首先,你需要emerge eselect(如果你没装它的话)。如果你在使用gentoo-sources-2.6.18-r4,你的内核列表看起来象下面一样:

代码 3.7: 检查你的/usr/src/linux符号链接

# eselect kernel list
Available kernel symlink targets:
[1] linux-2.6.18-gentoo-r4 *
[2] linux-2.6.20-gentoo-r7
[3] linux-2.6.20-gentoo-r8

(确认正确的内核被标了星号

在上面的输出中,你会注意到linux-2.6.18-gentoo-r4内核标记了星号(*),这表示它是符号链接指向的内核。

如果符号链接没有指向正确的内核源码,你必须象前面的例子那样选择想要的内核源码。

代码 3.8: 建立或更新/usr/src/linux符号链接。

(选择正确的内核)
# eselect kernel set 1

安装适宜的驱动

然后就要安装驱动了。

代码 3.9: 安装nVidia驱动

# emerge nvidia-drivers

注意: 安装驱动时可以加上gtk用户标识。加上后将会安装media-video/nvidia-settings。这是一个方便的用来查看和配置nVidia显卡各个方面的图形化工具。

重要: 每次你编译新内核或重新编译当前内核,你需要运行emerge nvidia-drivers重新安装nVidia模块。一个更容易的保持由ebuild安装的模块可用的方式是安装sys-kernel/module-rebuild。一旦你已经安装了它,简单地运行module-rebuild populate以把一个需要重新编译的包列表populate到数据库中。仅仅运行module-rebuild rebuild来为你的新内核重建驱动就行了。

安装完成后,运行modprobe nvidia把内核模块载入内存。如果是在升级的情况下,你应该把先前的模块移出内存。

代码 3.10: 载入内核模块

# lsmod | grep nvidia && rmmod nvidia
# modprobe nvidia

为避免不得不每次启动都手动地加载模块,你可能想要在启动系统时自动地加载,那就编辑/etc/modules.autoload.d/kernel-2.6,把nvidia加进去。不要忘了过后儿运行update-modules

重要: 如果你把agpgart编成模块,你需要把它加入/etc/modules.autoload.d/kernel-2.6

代码 3.11: 运行update-modules

# update-modules

配置X服务

一旦安装完合适的驱动,需要用nvidia驱动而不是默认的nv驱动来配置X服务。

用你喜欢的编辑器(如nanovim)打开/etc/X11/xorg.conf,到Device一节,把Driver一行改成如下:

代码 3.12: 在X服务配置中把nv改成nvidia

Section "Device"
Identifier "nVidia Inc. GeForce2"
Driver "nvidia""
VideoRam 65536
EndSection

然后到Module一节,确认glx模块加载,同时dri模块没加载:

代码 3.13: 更新Module一节

Section "Module"
(……)
# Load "dri"
Load "glx"

(……)
EndSection

下一步,在Screen一节,确保DefaultDepth指令被设为16或24,或者你只有 Depth设为16或24的Display小节。如果不这样做,nVidia的GLX扩展将无法启动。

代码 3.14: 更新Screen section

Section "Screen"
(……)
DefaultDepth 16
Subsection "Display"
(……)
EndSection

运行eselect,让X服务使用nVidia的GLX库:

代码 3.15: 运行eselect

# eselect opengl set nvidia

把你的用户加入video组

你必须把你的用户加入video组,他才会有访问nVidia设备文件的权限:

代码 3.16: 把你的用户加入video组

# gpasswd -a youruser video

如果你不使用udev,这个步骤不一定需要,但也不会有坏处,还能使你的系统适应将来的需要。

测试显卡

要测试你的nVidia显卡,就启动X,运行glxinfo,它是mesa-progs包的一部分。应该出现"direct rendering is activated"这类结果:

代码 3.17: 检查直接渲染状态

$ glxinfo | grep direct
direct rendering: Yes

如果要测试你的FPS,就运行glxgears命令。

打开nvidia支持

有些工具,如mplayerxine-lib,使用一个叫做xvmc的本地USE标识来打开XvMCNVIDIA支持。这个支持在看高清电影时很有用。在/etc/make.conf中的USE变量中加入xvmc或者在/etc/portage/package.use中为media-video/mplayer和/或media-libs/xine-lib加入这个USE标识。

也有一些程序使用nvidiaUSE标识,所以你可能需要把它加入/etc/make.conf

然后,运行emerge -uD --newuse world以重新编译这些获益于上述USE标识改变的应用程序。

使用NVidia配置工具

nVidia也为你提供了一个设置工具。这个工具使你能够查看并且不必重启X服务器就改变图形设置。这个工具在portage树的media-video/nvidia-settings包里。如前所述,如果你安装驱动时在/etc/make.conf/etc/portage/package.use中加入了gtkUSE标识,这个包将自动安装。

4. 故障排除

在拥有4Gb或以上的内存的机器上搞定2D

如果你在nVidia的2D加速方面有什么问题。那可能是你不能用MTRR建立混合写入区。要确认这个,请检查/proc/mtrr的内容:

代码 4.1: 检查你是否打开了混合写入

# cat /proc/mtrr

每行都应有"write-back"或"write-combining"。如果你看到有一行有"uncachable",你需要更改BIOS设置来修正它。

重启并进入BIOS,找到MTRR设置(可能会在"CPU Settings"下面)。把该项设置由"continuous"改为"discrete",再引导回Linux。你将发现没有带"uncachable"的行了。2D加速没有任何毛病了。

当我试图加载内核模块时,出现"no such device"。

这个错误通常出现在你没有匹配的显卡时。确认你有装了nVidia的显卡。你可以运行lspci再看一次。

如果你确信你有nVidia显卡,检查你的BIOS看一下Assign IRQ to VGA是否设置了。

5. 专家级配置

文档

nVidia驱动包还包含了包罗万象的文档。这些文档安装在/usr/share/doc,能够用以下命令查看:

代码 5.1: 查看NVIDIA文档

$ less /usr/share/doc/nvidia-drivers-*/README.gz

内核模块参数

nvidia内核模块能接受一些参数。你可以用这些参数调整驱动的行为。这些参数中的大部分都在文档中提到了。你可以通过编辑/etc/modules.d/nvidia来增加或改变这些参数的值。在改变这个文件后记住要运行update-modules,一定要牢记你所做的新设置只有在nvidia模块重新加载后才会生效。

代码 5.2: 调整nvidia驱动参数

(用你喜欢的编辑器编辑/etc/modules.d/nvidia)
# nano -w /etc/modules.d/nvidia
(更新模块信息)
# update-modules
(卸载nvidia模块……)
# modprobe -r nvidia
(……然后再次加载)
# modprobe nvidia

X的高级配置

GLX这个层次也还有相当多的参数可以设置。这些参数控制电视输出、双显、显示器刷新率检测等等的配置。同样,所有这些可用的参数的细节可以在文档中找到。

如果你想要使用这些参数,你需要把它们填入X配置文件(通常是/etc/X11/xorg.conf)的相关设备节。举例如下,假如我想要不显示飞溅屏幕:

代码 5.3: X配置中的nvidia高级配置

Section "Device"
Identifier "nVidia Inc. GeForce2"
Driver "nvidia"
Option "NoLogo" "true"
VideoRam 65536
EndSection