第 29 章 ConTeXt 入门指南
目录
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
使用 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"
ConTeXt 需要设置一些环境变量才能正常工作,使用
setuptex
脚本
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"
中文字体的安装路径,建议写入
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
[67] 这个配置文件使用 Adobe Creative Suite 4 中附带的四种字体
[68] 前面给出的
ctx
文件已设置此变量
Windows 下安装
首先下载 context-setup-mswin 和 ruby
安装 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
文件,参阅“字体设置”一节