ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 第 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 "字体设置")