第 29 章 ConTeXt 入门指南

目录

TeX 简介

为什么要用 TeX

顺流、逆流

LaTeX

部署 LaTeX

安装宏包

学习 LaTeX

Latex 结构化写作

ConTeXt 简介

部署 ConTeXt

安装

快速通道

字体设置

Windows 下安装

项目管理

语法简介

空白距离

特殊字符

命令

标题

列表

数学公式

运算符

上标、下标

打印字体配置文件

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]。

总体说来,LaTex 是科技论文事实上的标准,如果要排论文,就用 LaTeX;而作个人的文档、非正式散布的文档、演示文档,推荐用 ConTeXt


[63] 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 下载宏包,解压后移动到 LaTeX 能找到的目录,使用以下命令刷新:

sudo texhash

学习 LaTeX

推荐两本 LaTeX 的书:

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 这是推荐的目录

使用 rsync 下载 ConTeXt Minimals 的安装脚本:

rsync -ptv rsync://contextgarden.net/minimals/setup/linux/first-setup.sh .
  • 同样,安装脚本也使用 rsync 下载安装文件。这种方式只下载升级过的文件,便于增量更新;也能够最大程度的降低网络不稳定所带来的影响

执行安装脚本64

./first-setup.sh
  • 升级到最新版本,也使用这个脚本

下载完所有文件后,安装脚本会自动配置 ConTeXt Minimals [65]

快速通道

新建一个 ctx 文件,内容如下:

export CTEXDIR=/opt/context
source $CTEXDIR/tex/setuptex $CTEXDIR/tex 
export OSFONTDIR="/usr/share/fonts/adobe"

1 这里的目录为 ConTeXt Minimals 安装目录

2 ConTeXt 需要设置一些环境变量才能正常工作,使用 setuptex 脚本

3 OSFONTDIR 为字体路径变量,设置为系统中字体的实际路径,见“字体设置”一节

执行 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]

新建一个打印字体配置文件(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

下载中文字体[67],安装,并设置 OSFONTDIR 变量:

export OSFONTDIR="/usr/share/fonts/adobe"

1 中文字体的安装路径,建议写入 ctx 文件[68]

执行以下命令刷新文档数据库:

context --generate

最后,使用 chinese.tex 文件生成 PDF

  context chinese.tex

[64] 需要 ruby 支持

[65] 期间可能会出现几次如下> 提示:

! I can't find file `core-swd'.

键入core-swd.mkii即可

[66] 如 $TEXMFLOCAL``/tex/context/third

mkdir -p $TEXMFLOCAL/tex/context/third
mv zhfonts.tex $TEXMFLOCAL/tex/context/third
context --generate

1$TEXMFLOCAL 目录下新建第三方目录

2zhfonts.tex 文件移动到该目录

3 刷新一下文档数据库,就可以使用该字体配置文件了

[67] 这个配置文件使用 Adobe Creative Suite 4 中附带的四种字体

[68] 前面给出的 ctx 文件已设置此变量

Windows 下安装

首先下载 context-setup-mswinruby

安装 ruby ;解压 context-setup-mswin ,运行 first-setup.bat[69]

假设 conTeXt 安装在 D:\context 目录下,设置环境变量[70],在 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]

使用命令 context --generate 刷新文档数据库[72]

最后,使用命令 context a.tex 或者 texexec a.tex 生成 PDF 文档


[69] 这是一个自动下载、升级的脚本

[70] 我的电脑:右键→属性→高级→环境变量

[71] 默认的配置文件需要4个 Adobe 的字体,如果没有这四个字体,可以将配置文件中使用到的 Adobe 字体改为系统中的字体

[72] 需要在 Windows 命令行中执行

项目管理

为了养成良好的习惯,我们把 ConTeXt 文档拆分到几个单独的 .tex 文件中,这样维护起来比较方便。

首先是主文档 product.tex[73],生成 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] 文件名任意

语法简介

空白距离

TEX 将空格和制表符等空白字符视为相同的空白距离(space),多个连续的 空白字符 等同为一个空白字符, 每行开始的空白字符将被忽略, 而单个的 换行符 被视为一空格。

TEX 使用空行(两个或以上换行符)来分隔段落。如同空格一样,多个空行所起的作用和一个空行是相同的。

以下为示例代码:

TEX 将空格和制表符等空白字符视为相同的空白距离(space),
多个连续的 空白字符         等同为一个空白字符,
       每行开始的空白字符将被忽略,
而单个的 换行符
被视为一空格。

TEX 使用空行(两个或以上换行符)来分隔段落。如同空格一样,多个空行所起的作用和一个空行是相同的。    

以下为示例代码:

可以使用 \blank [74]命令插入空行,使用 \\ 插入空格

特殊字符

以下为 TeX 的保留字符:

保留字符 禁止解析 说明
\ \type{} 命令引导符
% \% 注释
$ $ 数学公式
^ \^ 上标
_ _ 下标
# #
& \&
~ ~
{ { 命令参数
} } 命令参数

\backslash 可以得到数学符号中的 \,而 \\ 通常在标题、页眉/页脚、边注等环境中作为换行符

命令

TEX 命令以反斜线“\”引导,以任意非字母字符结束

命令可以使用花括号或方括号作为参数,例如:

\command[选项,设置,……]{操作对象}

命令分为两种:普通命令和环境命令。普通命令可以用于行内;环境命令包含起始声明和结束声明,用于多行。普通命令和环境命令可以互相嵌套

\begin{itemize}                                %环境命令起始声明
\item 列表项                      %普通命令
\item 列表项                              
\end{itemize}                                     %环境命令结束声明

[74] \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 参阅“字体设置”一节)

.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 文件,参阅“字体设置”一节