## 第 29 章 ConTeXt 入门指南
**目录**
[](ch29.html#id3138032)
[TeX 简介](ch29s02.html)
[为什么要用 TeX](ch29s02.html#id3137416)
[顺流、逆流](ch29s02.html#id3137440)
[LaTeX](ch29s03.html)
[部署 LaTeX](ch29s03.html#id3138143)
[安装宏包](ch29s03.html#id3138323)
[学习 LaTeX](ch29s03.html#id3138482)
[Latex 结构化写作](ch29s04.html)
[ConTeXt 简介](ch29s05.html)
[部署 ConTeXt](ch29s06.html)
[安装](ch29s06.html#id3138931)
[快速通道](ch29s06.html#id3139072)
[字体设置](ch29s06.html#context-font)
[](ch29s07.html)
[Windows 下安装](ch29s07.html#id3139709)
[项目管理](ch29s08.html)
[语法简介](ch29s09.html)
[空白距离](ch29s09.html#id3140461)
[特殊字符](ch29s09.html#id3140535)
[命令](ch29s09.html#id3140679)
[标题](ch29s10.html)
[列表](ch29s11.html)
[数学公式](ch29s12.html)
[运算符](ch29s12.html#id3141181)
[上标、下标](ch29s12.html#id3141349)
[打印字体配置文件](ch29s13.html)
## TeX 简介
古来圣贤皆寂寞,唯有饮者留其名
沧海桑田,UNIX 的世界在风雨飘摇中悄悄变换了容颜
从传统工具到 GNU 工具,从 4.4BSD-Lite 到 FreeBSD,从 Minix 到 Linux,从 VI 到 VIM……往日的 UNIX 已经不复存在
唯一历久弥新的,只有 UNIX 的风骨;或者还有,TeX?
### 为什么要用 TeX
TeX 足够强大,可以满足使用者的绝大多数要求。尤其在排版质量、数学公式、图形生成、结构化控制等方面,几乎无出其右者
尽管学习 TeX 相对困难,但是学习的收益比成本要大得多
TeX 尤其适合需要打印的文档。恐怕你不能够在办公室里使用诸如 DocBook、reStructuredText 之类的格式写一份文件,然后把它拿给你的老板
### 顺流、逆流
现代文档工具,倾向于分离内容与样式。而内容部分,则用结构化的方式进行梳理,对于规模比较大的文档,这是最佳的方案。
Knuth 的 TeX 本身没什么结构控制,它就像一套排版领域的"汇编语言",大约 300 多个标记。TeX 在处理一份文档时,就是把整篇文档当作一个很长很长的字符串一口吞下去,然后消化掉,最后排出 dvi 文件(现代的 TEX 输出的是 PDF)。
由于 TeX 支持宏扩展,为了方便排版,Knuth 做了一个 Plain TeX,对 TeX 标记进行了一些功能逻辑上的封装。不过,还是很不结构化。
LaTeX 是较早尝试对 TeX 进行结构化封装的宏包,它可以明确地实现样式与内容的分离。不过,LaTeX 本身对排版方面的内建支持太少,需要许多其它宏包的支持,而那些宏包不是统一开发的,它们之间经常出现冲突。
ConTeXt 是对 TeX 进行结构化封装的新尝试,比 LaTeX 更加结构化,对排版方面的内建支持很好。而且 ConTeXt 对 XML 的支持相对完善,甚至可以直接用 ConTeXt 的 XML 语法来写文档[[63](ch29s02.html#ftn.id3138107)]。
总体说来,LaTex 是科技论文事实上的标准,如果要排论文,就用 LaTeX;而作个人的文档、非正式散布的文档、演示文档,推荐用 ConTeXt
* * *
> [[63](ch29s02.html#id3138107)] DocBook与ConTeXt之间可以无缝转换
## LaTeX
### 部署 LaTeX
安装 texlive-core
新建 `a.tex` 文件,内容如下:
```
\documentclass[11pt,a4paper]{article}
%加入了一些针对XeTeX的改进并且加入了 \XeTeX 命令来输入漂亮的XeTeX logo
\usepackage{xltxtra}
%启用一些LaTeX中的功能
\usepackage{xunicode}
%%%% fontspec 宏包 %%%%
\usepackage{fontspec}
% 指定字体
\setmainfont[BoldFont=Adobe Heiti Std]{Adobe Song Std}
\setsansfont[BoldFont=Adobe Heiti Std]{Adobe Kaiti Std}
%\setmonofont{Bitstream Vera Sans Mono}
%%%% 版面 %%%%
\usepackage[top=1in,bottom=1in,left=1.25in,right=1in]{geometry}
% 设置行距
\linespread{1.3}
%%%% 缩进 %%%%
% 自动首行缩进
\usepackage{indentfirst}
% 设置首行缩进的距离
\setlength{\parindent}{2.22em}
%连字符
\defaultfontfeatures{Mapping=tex-text}
%中文断行
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt
%以下为正文部分
\begin{document}
% 生成目录
\tableofcontents
% 章节
\section{\XeLaTeX}
XeTeX 可以使用系统自带的字体,而不需要再另外生成
% 章节
\section{……}
\end{document}
```
使用 `fc-list` 命令查看可用字体,根据实际情况修改 % 指定字体 下面的几行
使用以下命令生成 PDF
```
xelatex a.tex
```
### 安装宏包
LaTeX 只是一个基本框架,通过宏包扩展其功能。例如:
fontspec
指定字体
geometry
设置版面
color
使用色彩
hyperref
设置链接
listings
代码引用环境
titlesec
设置标题样式
titletoc
设置目录样式
indentfirst
首行缩进(这是中文的排版习惯)
xltxtra
XeTeX 扩展功能
到 [CTAN](http://www.ctan.org/) 下载宏包,解压后移动到 LaTeX 能找到的目录,使用以下命令刷新:
```
sudo texhash
```
### 学习 LaTeX
推荐两本 LaTeX 的书:
* [lshort-zh-cn 4.20](http://bbs.ctex.org/viewthread.php?tid=40736&extra=page%3D1)
* [lnotes](http://bbs.ctex.org/viewthread.php?tid=43774&extra=page%3D1)
## Latex 结构化写作
对于规模比较大的文档项目,要用结构化方法写作
首先样式要与内容分离,将 LaTeX 的导言部分写在一个文件里,例如 `style.tex`:
```
%\documentclass[11pt,a4paper,twoside]{article}
\documentclass[11pt,a4paper,twoside]{book}
%加入了一些针对XeTeX的改进并且加入了 \XeTeX 命令来输入漂亮的XeTeX logo
\usepackage{xltxtra}
%启用一些LaTeX中的功能
\usepackage{xunicode}
%%%% fontspec 宏包 %%%%
\usepackage{fontspec}
% 指定字体
\setmainfont[BoldFont=Adobe Heiti Std]{Adobe Song Std}
\setsansfont[BoldFont=Adobe Heiti Std]{Adobe Kaiti Std}
%\setmonofont{Bitstream Vera Sans Mono}
%%%% 版面 %%%%
\usepackage[top=1in,bottom=1in,left=1.25in,right=1in]{geometry}
% 设置行距
\linespread{1.3}
%%%% 缩进 %%%%
% 自动首行缩进
\usepackage{indentfirst}
% 设置首行缩进的距离
\setlength{\parindent}{2.22em}
%连字符
\defaultfontfeatures{Mapping=tex-text}
%中文断行
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt
%%%% color %%%%
\usepackage{color}
\definecolor{gray}{rgb}{0.9,0.9,0.9}
\definecolor{blue}{rgb}{0,0,1}
%%%% 章节标题 %%%%
\usepackage[center,pagestyles]{titlesec}
\titleformat{\section}{\centering\Large\bfseries}{\thesection}{1em}{}
\titleformat{\subsection}{\large\bfseries}{\thesubsection}{1em}{}
\newpagestyle{main}{
\sethead{\small\thesection\quad\sectiontitle}{}{$\cdot$~\thepage~$\cdot$}
\setfoot{}{}{}\headrule}
\pagestyle{main}
%%%% 目录样式 %%%%
\usepackage{titletoc}
\titlecontents{chapter}
[0.0em]
{} %\song
{\thecontentslabel\hspace{1em}}
{}
{\normalfont\dotfill\textrm{\contentspage[{\bfseries\thecontentspage}]}}
\titlecontents{section}
[0.0em]
{} %\song
{\thecontentslabel\hspace{1em}}
{}
{\normalfont\dotfill\textrm{\contentspage[{\bfseries\thecontentspage}]}}
%%%% hyperref %%%%
\usepackage[
pdfstartview=FitH, CJKbookmarks=true, bookmarksnumbered=true,
bookmarksopen=true,
linkcolor=true, %注释掉此项则交叉引用为彩色边框(将colorlinks和pdfborder同时注释掉)
colorlinks=blue,
pdfborder=001, %注释掉此项则交叉引用为彩色边框
citecolor=blue ]{hyperref}
\usepackage{listings}
\lstset{
numbers=none,
numberstyle=\scriptsize,
frame=single,framerule=0.1pt,
backgroundcolor=\color{gray},
fontadjust=false,
flexiblecolumns=true,
language=[LaTeX]TeX,
basicstyle=\ttfamily\small,
commentstyle=\color{orange},
keywordstyle=\color{blue}
escapebegin=\begin{esc},escapeend=\end{esc},texcl=true
}
\graphicspath{{img/}}
%其它
%\usepackage[marginal,perpage,symbol]{footmisc}
```
将所有会用的到词汇在一个文件中定义,例如 `glossary.tex`
```
\def\xxx{The five boxing wizards jump quickly.\\}
```
* 使用命令 **\xxx** 插入定义的词汇
使用 **\input** 命令将这两个文件插入到主文档中:
```
%插入样式定义文件的内容
\input{style}
%插入词汇定义文件的内容
\input{glossary}
%正文内容
\begin{document}
%将前言放到 `info.tex` 文件中
%使用 \include 命令载入
\include{info}
%插入目录
\tableofcontents
%将每章的内容放在单独的文件中 (1st.tex)
%使用 \include 命令载入
% `1st.tex` 文件中应包含 **\chapter** 等命令
\include{1st}
% \include 命令会在新的一页上排版载入的文本
%如果不想分页,可以使用 \input 命令,它只是简单的载入文本 (2nd.tex)
\input{2nd}
\end{document}
```
## ConTeXt 简介
LaTeX 是一个基本框架,主要依靠宏包扩展功能,这样在保持自身精干的同时,可以拥有强大的功能,不失为一个灵活的方案
这种方案初衷是好的,但是在漫长的进化中,零零散散开发的宏包缺乏组织,多个宏包可能同时提供某一功能,这就可能引发冲突……而 ConTeXt 则不存在这一问题,因为它是的各种功能是统一开发的,而且开发进程相当活跃。
ConTeXt 制作的 PDF 文档,可以拥有强大的交互特性,使用 ConTeXt 作出的 PDF 文档,甚至可以作为计算器
当然,ConTeXt 并不是很容易掌握的,千里之行,始于足下,我们先搭建 ConTeXt 的工作环境
## 部署 ConTeXt
### 安装
目前,只有 ConTeXt Minimals (ConTEXt最小包)提供了最新的 ConTeXt 版本,而且可以与系统内其它 TeX 发行版和睦相处
ConTeXt Minimals 通过脚本安装,安装脚本会下载安装文件到当前目录。为了避免混乱,有必要手动为 ConTeXt Minimals 创建目录
```
export CTXDIR=/opt/context
mkdir -p $CTXDIR
cd $CTXDIR
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch29s06.html#context-s-1) 这是推荐的目录
使用 rsync 下载 ConTeXt Minimals 的安装脚本:
```
rsync -ptv rsync://contextgarden.net/minimals/setup/linux/first-setup.sh .
```
* 同样,安装脚本也使用 rsync 下载安装文件。这种方式只下载升级过的文件,便于增量更新;也能够最大程度的降低网络不稳定所带来的影响
执行安装脚本[[64](ch29s06.html#ftn.id3139012)](第一次安装可能会等待较长时间)
```
./first-setup.sh
```
* 升级到最新版本,也使用这个脚本
下载完所有文件后,安装脚本会自动配置 ConTeXt Minimals [[65](ch29s06.html#ftn.id3139043)]
### 快速通道
新建一个 `ctx` 文件,内容如下:
```
export CTEXDIR=/opt/context
source $CTEXDIR/tex/setuptex $CTEXDIR/tex
export OSFONTDIR="/usr/share/fonts/adobe"
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch29s06.html#context-e-1) 这里的目录为 ConTeXt Minimals 安装目录
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch29s06.html#context-e-2) ConTeXt 需要设置一些环境变量才能正常工作,使用 `setuptex` 脚本
> [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch29s06.html#context-e-3) `OSFONTDIR` 为字体路径变量,设置为系统中字体的实际路径,见[“字体设置”一节](ch29s06.html#context-font "字体设置")
执行 `source ctx` 命令,设置好需要的环境变量,ConTeXt 工作环境便准备就绪
新建一个 `a.tex` 文件,内容如下:
```
% a.tex %这里是注释
\starttext %正文开始
Hello World. %正文内容
\stoptext %正文结束
```
执行 `context a.tex` 命令,会得到 `a.pdf` 文件
> 提示:执行 `context --purge` 命令清除中间文件。但保留中间文件可以提高编译速度
### 字体设置
下面是一个包含中文的 `chinese.tex` 文件
```
\usetypescriptfile[zhfonts] %加载打印字体配置文件(typescript) `zhfonts.tex`
\usetypescript[myscript] %使用打印字体配置文件中定义打印字体的脚本 `myscript`
\setupbodyfont[myfont,rm,11pt] %设置正文字体
\setupindenting[always,2em,first] %设置中文缩进格式(首行缩进两字)
\setupheads[indentnext=yes] %每节的首段也要缩进
\setupinterlinespace[big] %设置行距(big=1.5倍)
\setupwhitespace[medium] %设置段间距[small, medium, big]
\definepapersize[SCREEN][width=21cm,height=29.7cm] %设置页面尺寸
\setuppapersize[SCREEN][SCREEN] %纸张尺寸,通常和页面尺寸相同。(除非在印刷用纸上实现多页排版)
\starttext
世界,你好!
\stoptext
```
`打印字体配置文件`(typescript) 文件是一个 TeX 文件,要求与 `chinese.tex` 文件在同一目录,或者位于 ConTeXt Minimals 可以检索到的某个目录中[[66](ch29s06.html#ftn.id3139372)]
新建一个`打印字体配置文件`(typescript),名为 `zhfonts.tex`,内容如下:
```
% engine=luatex
% \ctxlua{fonts.collections.trace = true}
\let\synchronizetext\relax
\synchronizemathfontsfalse
\spaceskip .25em plus .25em \relax
\definefontfeature[zh][mode=node,script=hang,lang=zhs]
\starttypescript [serif] [zhfont]
\definefontsynonym
[ZhSerif][name:AdobeSongStd-Light][features=zh]
\definefontsynonym
[ZhSerifBold][name:AdobeHeitiStd-Regular][features=zh]
\definefontsynonym
[ZhSerifItalic][name:AdobeKaitiStd-Regular][features=zh]
\definefontsynonym
[ZhSerifBoldItalic][name:AdobeHeitiStd-Regular][features=zh]
\definefontfallback
[WesternSerif][name:TeXGyrePagella-Regular][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSerifBold][name:TeXGyrePagella-Bold][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSerifItalic][name:TeXGyrePagella-Italic][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSerifBoldItalic][name:TeXGyrePagella-BoldItalic][0x0000-0x0400][force=yes]
\definefontsynonym
[Serif][ZhSerif][fallbacks=WesternSerif]
\definefontsynonym
[SerifBold][ZhSerifBold][fallbacks=WesternSerifBold]
\definefontsynonym
[SerifItalic][ZhSerifItalic][fallbacks=WesternSerifItalic]
\definefontsynonym
[SerifBoldItalic][ZhSerifBoldItalic][fallbacks=WesternSerifBoldItalic]
\stoptypescript
\starttypescript [sans][zhfont]
\definefontsynonym
[ZhSans][name:AdobeKaitiStd-Regular][features=zh]
\definefontsynonym
[ZhSansBold][name:AdobeHeitiStd-Regular][features=zh]
\definefontsynonym
[ZhSansItalic][name:AdobeKaitiStd-Regular][features=zh]
\definefontsynonym
[ZhSansBoldItalic][name:AdobeHeitiStd-Regular][features=zh]
\definefontfallback
[WesternSans][name:TeXGyreAdventor-Regular][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSansBold][name:TeXGyreAdventor-Bold][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSansItalic][name:TeXGyreAdventor-Italic][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSansBoldItalic][name:TeXGyreAdventor-BoldItalic][0x0000-0x0400][force=yes]
\definefontsynonym
[Sans][ZhSans][fallbacks=WesternSans]
\definefontsynonym
[SansBold][ZhSansBold][fallbacks=WesternSansBold]
\definefontsynonym
[SansItalic][ZhSansItalic][fallbacks=WesternSansItalic]
\definefontsynonym
[SansBoldItalic][ZhSansBoldItalic][fallbacks=WesternSansBoldItalic]
\stoptypescript
\starttypescript [mono][zhfont]
\definefontsynonym
[ZhMono][name:AdobeFangsongStd-Regular][features=zh]
\definefontsynonym
[ZhMonoBold][name:AdobeHeitiStd-Regular][features=zh]
\definefontsynonym
[ZhMonoItalic][name:AdobeFangsongStd-Regular][features=zh]
\definefontsynonym
[ZhMonoBoldItalic][name:AdobeHeitiStd-Regular][features=zh]
\definefontfallback
[WesternMono][name:TeXGyreCursor-Regular][0x0000-0x0400][force=yes]
\definefontfallback
[WesternMonoBold][name:TeXGyreCursor-Bold][0x0000-0x0400][force=yes]
\definefontfallback
[WesternMonoItalic][name:TeXGyreCursor-Italic][0x0000-0x0400][force=yes]
\definefontfallback
[WesternMonoBoldItalic][name:TeXGyreCursor-BoldItalic][0x0000-0x0400][force=yes]
\definefontsynonym
[Mono][ZhMono][fallbacks=WesternMono]
\definefontsynonym
[MonoBold][ZhMonoBold][fallbacks=WesternMonoBold]
\definefontsynonym
[MonoItalic][ZhMonoItalic][fallbacks=WesternMonoItalic]
\definefontsynonym
[MonoBoldItalic][ZhMonoBoldItalic][fallbacks=WesternMonoBoldItalic]
\stoptypescript
\starttypescript[myscript]
\definetypeface[myfont][rm][serif][zhfont]
\definetypeface[myfont][ss][sans][zhfont]
\definetypeface[myfont][tt][mono][zhfont]
\stoptypescript
```
* 如何定制字体参阅[“打印字体配置文件”一节](ch29s13.html "打印字体配置文件")
下载中文字体[[67](ch29s06.html#ftn.id3139613)],安装,并设置 `OSFONTDIR` 变量:
```
export OSFONTDIR="/usr/share/fonts/adobe"
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch29s06.html#context-e-31) 中文字体的安装路径,建议写入 `ctx` 文件[[68](ch29s06.html#ftn.id3139659)]
执行以下命令刷新文档数据库:
```
context --generate
```
最后,使用 `chinese.tex` 文件生成 PDF
```
context chinese.tex
```
* * *
> [[64](ch29s06.html#id3139012)] 需要 ruby 支持
> [[65](ch29s06.html#id3139043)] 期间可能会出现几次如下> 提示:
```
! I can't find file `core-swd'.
```
键入`core-swd.mkii`即可
> [[66](ch29s06.html#id3139372)] 如 `$TEXMFLOCAL``/tex/context/third`
```
mkdir -p $TEXMFLOCAL/tex/context/third
mv zhfonts.tex $TEXMFLOCAL/tex/context/third
context --generate
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch29s06.html#context-e-21) 在 `$TEXMFLOCAL` 目录下新建第三方目录
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch29s06.html#context-e-22) 将 `zhfonts.tex` 文件移动到该目录
> [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch29s06.html#context-e-23) 刷新一下文档数据库,就可以使用该字体配置文件了
> [[67](ch29s06.html#id3139613)] 这个配置文件使用 Adobe Creative Suite 4 中附带的四种字体
> [[68](ch29s06.html#id3139659)] 前面给出的 `ctx` 文件已设置此变量
### Windows 下安装
首先下载 [context-setup-mswin](http://minimals.contextgarden.net/setup/context-setup-mswin.zip) 和 [ruby](http://rubyinstaller.rubyforge.org/wiki/wiki.pl)
安装 ruby ;解压 context-setup-mswin ,运行 `first-setup.bat`[[69](ch29s07.html#ftn.id3139739)]
假设 conTeXt 安装在 `D:\context` 目录下,设置环境变量[[70](ch29s07.html#ftn.id3139753)],在 `PATH` 项中添加路径:
```
;D:\context\tex\texmf-mswin\bin
```
将以下内容保存为 `environment.reg` ,双击导入注册表
```
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Environment]
"CYGWIN"="nontsec"
"OSFONTDIR"="C:\\WINDOWS\\Fonts"
"TEXMF"="{$TEXPATH\\texmf,$TEXPATH\\texmf-local,$TEXPATH\\texmf-context,$TEXPATH\\texmf-mswin}"
"TEXMFCACHE"="$TEXPATH\\texmf-cache"
"TEXMFCNF"="$TEXPATH\\texmf{-local,-context,}/web2c"
"TEXMFOS"="$TEXPATH\\texmf-mswin"
"TEXPATH"="D:\\context\\tex"
```
将打印字体配置文件复制到 `D:\context\tex\texmf-local\tex\context\third` 目录下[[71](ch29s07.html#ftn.id3139805)]
使用命令 `context --generate` 刷新文档数据库[[72](ch29s07.html#ftn.id3139823)]
最后,使用命令 `context a.tex` 或者 `texexec a.tex` 生成 PDF 文档
* * *
> [[69](ch29s07.html#id3139739)] 这是一个自动下载、升级的脚本
> [[70](ch29s07.html#id3139753)] 我的电脑:右键→属性→高级→环境变量
> [[71](ch29s07.html#id3139805)] 默认的配置文件需要4个 Adobe 的字体,如果没有这四个字体,可以将配置文件中使用到的 Adobe 字体改为系统中的字体
> [[72](ch29s07.html#id3139823)] 需要在 Windows 命令行中执行
## 项目管理
为了养成良好的习惯,我们把 ConTeXt 文档拆分到几个单独的 `.tex` 文件中,这样维护起来比较方便。
首先是主文档 `product.tex`[[73](ch29s08.html#ftn.id3139875)],生成 PDF 只要编译此文件即可
```
%%%%%此文件使用 product 环境,起始声明
\startproduct{}
%%%导言区使用 \environment 载入文件
%载入样式文件 style.tex
\environment style
%载入词汇定义文件 gloss.tex
\environment gloss
%%%正文起始
\starttext
%%%正文区使用 \component 载入文件
%封面 cover.tex
\component cover
%目录
\title{目录}
\placecontent
%%正文内容
%载入章节 1.tex 2.tex 3.tex
\component 1
\component 2
\component 3
%%%正文结束
\stoptext
%%%%% product 环境结束声明
\stopproduct
```
在导言区载入的文件,要使用 `environment` 环境,例如样式定义文件 `style.tex`
```
\startenvironment{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 中文设置 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usetypescriptfile[zhfonts] %加载打印字体配置文件(typescript) zhfonts.tex
\usetypescript[myscript] %使用打印字体配置文件中定义打印字体的脚本 myscript
\setupbodyfont[myfont,rm,11pt] %设置正文字体
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 正文 标题 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 启用颜色模式, 设置链接文本颜色
\setupcolors[state=start]
\definecolor[linktext][darkred]
\setupinteraction[state=start,color=linktext]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%正文
\setupindenting[always,2em,first] %设置中文缩进格式(首行缩进两字)
\setupheads[indentnext=yes] %每节的首段也要缩进
\setupinterlinespace[big] %设置行距(big=1.5倍)
\setupwhitespace[small] %设置段间距[small, medium, big]
%标题
\setupheads[indentnext=yes]
\setuphead
[chapter]
[style=\bfc,header=empty,footer=empty]
\setuphead
[section]
[style=\bfa]
\setuphead
[title]
[style=\bfb,header=empty,foote=empty]
\setuphead
[subsubject]
[style=\bf]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 页面设置 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%定义页面尺寸为 SCREEN
\definepapersize[mySCREEN][width=21cm,height=29.7cm]
%纸张尺寸,通常和页面尺寸相同。(除非在印刷用纸上实现多页排版)
\setuppapersize[SCREEN][mySCREEN]
%布局
\setuplayout
[width=fit,
height=middle,
leftmargin=3cm,
rightmargin=3cm,
backspace=4cm,
topspace=.5cm,
headerdistance=.4cm,
footerdistance=.4cm,
header=1cm,
footer=1cm]
%去掉页眉正中 自动添加的页码
\setuppagenumbering
[style=\tfx,location=]
%页眉
\def\CurrentChapter{%
第 \headnumber[chapter]\ 章%
\hbox to 2em{}%
\getmarking[chapter]%
}
\def\CurrentSection{%
\headnumber[section]%
\hbox to 2em{}%
\getmarking[section]%
}
\setupheadertexts
[\CurrentChapter][pagenumber]
[pagenumber][\CurrentSection]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%边注
\setupinmargin[left,right][style=\tfx]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%PDF 阅读器中自适应页宽
\setupinteraction[state=start,openaction=FitWidth]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 目录 书签 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 启用书签功能
\setupinteraction[state=start]
\setupinteractionscreen[option=bookmark]
\placebookmarks[chapter,section,subsection][chapter]
%%%经典目录样式
%% turn off numbering of some levels
%\setuphead[subsection][number=no]
%\setuphead[subsubsection][number=no]
%% TOC
%% level=4, \subsubsubsections are not listed in TOC
%% alternative=c, space to the page number is filled with dots
%\setupcombinedlist[content][level=4,alternative=c]
%%\setuplist[chapter][width=5mm,style=bold]
%\setuplist[section][width=10mm,style=bold]
%\setuplist[subsection][width=20mm]
%% pagestyle=normal for changing the appearance of pagenumber
%\setuplist[subsubsection][width=20mm,style=slanted,pagestyle=normal]
%目录样式
\def\ChapterNumber#1{\doiftext{#1}{第\;#1\;章\quad}}
\setuplist
[chapter]
[alternative=a,
before={\page[preference]\blank},
after=\blank,
style=bold,
width=fit,
pagestyle=boldslanted,
pagenumber=no,
numbercommand=\ChapterNumber]
\def\PageNumber#1{\color[darkgray]{#1}.}
\setuplist
[section]
[alternative=d,
style=small,
pagecommand=\PageNumber,
pagestyle=\itx]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\stopenvironment
```
词汇定义文件 `gloss.tex`
```
\startenvironment{}
%使用命令 \hello{mom}
%得到 Good morning mom
\define[1]\hello{Good morning, #1}
%使用命令 \lxsc
%得到 《开源世界旅行手册》
\define\lxsc{《开源世界旅行手册》}
\stopenvironment
```
章节放在单独的文件中,例如 `1.tex`
```
\startcomponent{}
\chapter{第一章}
ConTeXt 组件文档
\stopcomponent
```
* * *
> [[73](ch29s08.html#id3139875)] 文件名任意
## 语法简介
### 空白距离
TEX 将空格和制表符等空白字符视为相同的空白距离(space),多个连续的 空白字符 等同为一个空白字符, 每行开始的空白字符将被忽略, 而单个的 换行符 被视为一空格。
TEX 使用空行(两个或以上换行符)来分隔段落。如同空格一样,多个空行所起的作用和一个空行是相同的。
以下为示例代码:
```
TEX 将空格和制表符等空白字符视为相同的空白距离(space),
多个连续的 空白字符 等同为一个空白字符,
每行开始的空白字符将被忽略,
而单个的 换行符
被视为一空格。
TEX 使用空行(两个或以上换行符)来分隔段落。如同空格一样,多个空行所起的作用和一个空行是相同的。
以下为示例代码:
```
可以使用 `\blank` [[74](ch29s09.html#ftn.id3140512)]命令插入空行,使用 `\\` 插入空格
### 特殊字符
以下为 TeX 的保留字符:
| 保留字符 | 禁止解析 | 说明 |
| --- | --- | --- |
| \ | \type{\} | 命令引导符 |
| % | \% | 注释 |
| $ | \$ | 数学公式 |
| ^ | \^ | 上标 |
| _ | \_ | 下标 |
| # | \# |
| & | \& |
| ~ | \~ |
| { | \{ | 命令参数 |
| } | \} | 命令参数 |
`\backslash` 可以得到数学符号中的 **\**,而 `\\` 通常在标题、页眉/页脚、边注等环境中作为换行符
### 命令
TEX 命令以反斜线“`\`”引导,以任意非字母字符结束
命令可以使用花括号或方括号作为参数,例如:
```
\command[选项,设置,……]{操作对象}
```
命令分为两种:普通命令和环境命令。普通命令可以用于行内;环境命令包含起始声明和结束声明,用于多行。普通命令和环境命令可以互相嵌套
```
\begin{itemize} %环境命令起始声明
\item 列表项 %普通命令
\item 列表项
\end{itemize} %环境命令结束声明
```
* * *
> [[74](ch29s09.html#id3140512)] `\blank[medium*4]` 插入4个中等高度空行
## 标题
conTeXt 中,章节以下列命令开始,并使用 **{}** 指定标题,例如 `\chapter{第一章}`:
| 章节 | 编号 | 不编号 |
| --- | --- | --- |
| 部 | \part |
| 章 | \chapter | \title |
| 节 | \section | \subject |
| 小节 | \subsection | \subsubject |
| | \subsubsection | \subsubsubject |
* 章节无需结束声明,遇到下一个章节命令,本章节结束
使用方括号给章节定义标记
```
\title[引用]{标题} %定义标记
\at{page}[引用] %使用 `\at` 命令引用
```
## 列表
使用以下命令插入列表:
```
\startitemize[R,packed,broad] %列表起始声明 [选项]
\item 列表项一 %列表项使用 **\item** 命令
\item 列表项二
\item 列表项三
\stopitemize %列表结束声明
```
第一个选项为列表项分隔符(前缀):
| 选项 | 样式 |
| --- | --- |
| 1 | 圆点 |
| 2 | 短划线 |
| 3 | 星号 |
| 4 | 三角形 |
| 5 | 梅花 |
| 6 | 空心圆 |
| n | 数字 |
| a | 小写字母 |
| A | 大写字母 |
| r | 小写罗马数字 |
| R | 大写罗马数字 |
后两个为格式选项
| 选项 | 格式 |
| --- | --- |
| standard | 标准 |
| packed | 压缩列表项垂直间距 |
| serried | 压缩分隔符和文本的间距 |
| joinedup | 压缩列表与正文间距 |
| broad | 扩展分隔符和文本的间距 |
| inmargin | 将分隔符放在而边缘 |
| atmargin |
| stopper |
| columns |
| intro |
| continue |
**columns** 选项需要参数
```
\startitemize[columns,three,broad]
```
## 数学公式
数学环境
```
\placeformula[1] %给数学公式编号[引用标记]
\startformula %数学环境起始声明
y=x^2
\stopformula %数学环境结束声明
这是行内的数学环境 $\int_0^1 x^2 dx$
```
### 运算符
可以直接使用的基本运算符有:
```
+ - = < >
```
| 数学符号 | 命令 |
| --- | --- |
| ± | \pm |
| × | \times |
| ÷ | \div |
| * | \ast |
| ★ | \star |
| ● | \bullet |
| ○ | \circ |
| · | \cdot |
| ≤ | \leq |
| 《 | \ll |
| ≥ | \geq |
| 》 | \gg |
| ≡ | \equiv |
| ~ | \sim |
| ≈ | \approx |
| ≠ | \neq |
| ∩ | \cap |
| ∪ | \cup |
| ∈ | \in |
### 上标、下标
使用 `^` 输入上标
```
勾股定理 $3^2 + 4^2 = 5^2$ %`^2`为指数
二的十次方 $2^{10} = 1024$ %如果指数不止一位,要使用`{}`括起来
```
## 打印字体配置文件
conTeXt 使用以下方式定义字体:
```
\definefont %使用此命令定义字体。这三句可以写在一行
[Song] %第一个参数为字体别名
[{`name`:Adobe Song Std*zh} at 14pt] %字体定义:使用14号的 Adobe 中文宋体
%`name`使用字体名称;`file`使用字体文件
\starttext
\Song 我使用的是 Adobe 宋体 %使用字体别名指定该行体样式
\stoptext
```
使用这种方式指定字体比较繁琐,推荐建立一个打印字体配置文件(`typescript`),如 `zhfonts.tex` (如何使用 `zhfonts.tex` 参阅[“字体设置”一节](ch29s06.html#context-font "字体设置"))
`.tex` 源文件中使用以下命令定义字体:
```
\usetypescriptfile[zhfonts] %加载打印字体配置文件 `zhfonts.tex`
\usetypescript[myscript] %使用打印字体配置文件中定义打印字体的脚本 `myscript`
\setupbodyfont[myfont,ss,11pt] %使用脚本预定义的 `myfont` 字体: 字型为 `ss` ,大小为 11pt
```
通常有三种字型的字体:衬线、非衬线、等宽,衬线字型笔划起始和结束的地方有一些修饰,非衬线字体笔划为无修饰的线条,等宽字体所有的字符宽度相同
而一种字体,无论属于何种字型,都可能有几种样式,例如:普通、粗体、斜体、斜粗体
我们在打印字体配置文件中,首先定义字型,然后为每种字型定义样式。
在 `zhfonts.tex` 文件中定义打印字体 `myfont` 的字型:
```
\starttypescript[myscript] %定义打印字体的脚本为 `myscritp`
\definetypeface[myfont][ss][sans][zhfont] %将 `myfont` 的字型 `ss` 定义为 `[sans][zhfont]`(非衬线)
\stoptypescript %结束定义
```
`[sans][zhfont]` 为非衬线字型,给它指定各种样式,在上面定义之前写入以下配置:
```
\starttypescript [sans][zhfont] %定义字型 `[sans][zhfont]`
\definefontsynonym %此命令定义字体别名
%定义该字型的普通样式 `[Sans]` 为 `[ZhSans]`,备用字体为 [fallbacks=WesternSans]
[Sans][ZhSans][fallbacks=WesternSans]
\definefontsynonym
%定义该字型的粗体样式 `[SansBold]` 为 `[ZhSansBold]`,备用字体为 [fallbacks=WesternSansBold]
[SansBold][ZhSansBold][fallbacks=WesternSansBold]
\definefontsynonym
%定义斜体
[SansItalic][ZhSansItalic][fallbacks=WesternSansItalic]
\definefontsynonym
%定义斜粗体
[SansBoldItalic][ZhSansBoldItalic][fallbacks=WesternSansBoldItalic]
\stoptypescript
```
上一步定义使用别名定义别名,写起来比较麻烦,但是却可以选择备用字体。接下来将各种样式定义为实际的字体:
```
\starttypescript [sans][zhfont]
%定义四种样式实际使用的字体
%`name`使用字体名称;`file`使用字体文件
%`[features=zh]` 字体使用 `zh` 属性,还未定义
\definefontsynonym
[ZhSans][name:AdobeKaitiStd-Regular][features=zh]
\definefontsynonym
[ZhSansBold][name:AdobeHeitiStd-Regular][features=zh]
\definefontsynonym
[ZhSansItalic][name:AdobeKaitiStd-Regular][features=zh]
\definefontsynonym
[ZhSansBoldItalic][name:AdobeHeitiStd-Regular][features=zh]
%定义备用字体的四种样式
\definefontfallback
[WesternSans][name:TeXGyreAdventor-Regular][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSansBold][name:TeXGyreAdventor-Bold][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSansItalic][name:TeXGyreAdventor-Italic][0x0000-0x0400][force=yes]
\definefontfallback
[WesternSansBoldItalic][name:TeXGyreAdventor-BoldItalic][0x0000-0x0400][force=yes]
\definefontsynonym
[Sans][ZhSans][fallbacks=WesternSans]
\definefontsynonym
[SansBold][ZhSansBold][fallbacks=WesternSansBold]
\definefontsynonym
[SansItalic][ZhSansItalic][fallbacks=WesternSansItalic]
\definefontsynonym
[SansBoldItalic][ZhSansBoldItalic][fallbacks=WesternSansBoldItalic]
\stoptypescript
```
最后,定义字体属性 `zh`
```
\definefontfeature[zh][mode=node,script=hang,lang=zhs]
```
完整的 `zhfonts.tex` 文件,参阅[“字体设置”一节](ch29s06.html#context-font "字体设置")
- 开源世界旅行手册
- 授权
- 致谢
- 序言
- 更新纪录
- 导读
- 如何写作科技文档
- 部分 I. 气候
- 第 1 章 GUI? CLI?
- 第 2 章 UNIX 缩写风格
- 第 3 章 版本号的迷雾
- 第 4 章 Vim 还是 Emacs
- 第 5 章 DocBook 还是 TeX
- 第 6 章 完全用 Gnu/Linux 工作
- 第 7 章 病毒
- 第 8 章 磁盘 分区
- 第 9 章 文件系统
- 第 10 章 发行版介绍
- 第 11 章 编程语言
- 第 12 章 无根的根:无名师的 Unix 心传
- 部分 II. 地理
- 第 13 章 基础知识
- 第 14 章 命令系统
- 第 15 章 基本系统
- 第 16 章 软件管理
- 第 17 章 核心工具集
- 第 18 章 编译工具链
- 第 19 章 图形界面
- 第 20 章 国际化
- 第 21 章 内核
- 第 22 章 Grub
- 第 23 章 服务器
- 第 24 章 Vim 编辑器
- 第 25 章 Emacs 入门
- 第 26 章 正则表达式
- 第 27 章 docbook 指南
- 第 28 章 Git 版本控制系统
- 第 29 章 ConTeXt 入门指南
- 部分 III. 景观
- 第 30 章 终极 Shell -- ZSH
- 第 31 章 完美工作站 Archlinux
- 第 32 章 组织你的意念:Emacs org mode
- 第 33 章 Zsh+screen
- 第 34 章 gentoo stage3
- 第 35 章 硬件问题
- 第 36 章 网络设置
- 第 37 章 自制 LiveCD
- 第 38 章 awesome
- 第 39 章 openbox 工作环境
- 第 40 章 Emacs muse
- 第 41 章 写作工具链
- 第 42 章 使用 lftp
- 第 43 章 Firefox 使用技巧
- 第 44 章 FVWM
- 部分 IV. 地质
- 第 45 章 Unix
- 第 46 章 Gnu
- 第 47 章 软件业自由之神——Richard Stallman
- 第 48 章 Linux
- 第 49 章 GNOME与KDE的战争
- 第 50 章 Vim Emacs
- 第 51 章 年代纪
- 第 52 章 我的选择
- 第 53 章 补遗