关于tex:ConTeXt-蹊径
2009 年已经写过一份「ConTeXt 学习笔记」,内容颇为简陋,且已经允诺要更新,却始终未曾兑现。 最近,我将这份笔记从新写过,内容空虚了很多,该当足以让老手学会应用 ConTeXt 排版惯例文档了。 我的项目地址:https://github.com/liyanrui/ConTeXt-notes 敬请批评指正。
2009 年已经写过一份「ConTeXt 学习笔记」,内容颇为简陋,且已经允诺要更新,却始终未曾兑现。 最近,我将这份笔记从新写过,内容空虚了很多,该当足以让老手学会应用 ConTeXt 排版惯例文档了。 我的项目地址:https://github.com/liyanrui/ConTeXt-notes 敬请批评指正。
上一篇:源码彩化zhfonts 模块实现了 ConTeXt (>= MkIV) 对汉字字体的加载、简体汉字标点符号(全角)间距的压缩以及边界对齐。该模块成型于 2011 年,2023 年初对代码进行了一番梳理,心愿它能工作到 2033 年……装置和应用办法可参考 https://github.com/liyanrui/zhfonts/blob/master/README.md,本文仅对其一些技术细节予以阐明,一则备忘,二则或者能帮忙一些同好对该模块予以改良。 默认字体zhfonts 默认应用 simsun.ttc(宋体),simhei.ttf(黑体) 和 simkai.ttf (楷体)三种汉字字体: simsun.ttc 的子字体 nsimsun 作为衬线字族(Serif,对应 ConTeXt 字体切换命令 \tf)的正体(Regular,对应\rm) 和斜体(Italic,对应 \it);simhei.ttf 作为无衬线字族(Sans,对应 \ss)的所有字体;simkai.ttf 作为等宽字族(MonoSpace,对应 \tt)的正体和斜体;simhei.ttf 作为衬线,无衬线以及等宽字族的粗体和粗斜体,对应这三种字族的 \bf 和 \bi 命令。具体设定可参考 t-zhfonts.lua 的设定: f.chinese = { serif = {regular = {name = "nsimsun", rscale = "1.0"}, bold = {name = "simhei", rscale = "1.0"}, italic = {name = "nsimsun", rscale = "1.0"}, bolditalic = {name = "simhei", rscale = "1.0"}}, sans = {regular = {name = "simhei", rscale = "1.0"}, bold = {name = "simhei", rscale = "1.0"}, italic = {name = "simhei", rscale = "1.0"}, bolditalic = {name = "simhei", rscale = "1.0"}}, mono = {regular = {name = "kaiti", rscale = "1.0"}, bold = {name = "simhei", rscale = "1.0"}, italic = {name = "kaiti", rscale = "1.0"}, bolditalic = {name = "simhei", rscale = "1.0"}}}至于拉丁字体,zhfonts 默认应用 ConTeXt 自带的 LatinModern 字族,可参考 t-zhfonts.lua 的设定: ...
上一篇:缓冲区魔法 以下示例,可能应用 ConTeXt 默认的等宽字体排版一段 C 程序源码: \environment card-env\starttext\starttyping#include <stdio.h>int main(void){ printf("Hello world!\n"); return 0;}\stoptyping\stoptext 这段 C 程序源码在我的 Emacs 编辑器里,变量类型、宏、关键字、函数名等元素,色彩不一,可读性显然优于 ConTeXt 默认的排版后果,证据是,反对者的家里早已没有黑白电视了。 上面基于 Lua 的 Lpeg 库以及 ConTeXt LMTX 的 Pretty Printing 性能,实现 C 程序源码的彩化。 框架以下 Lua 代码能够结构一个 ConTeXt 默认的解析器的复本 c_parser: local P, V = lpeg.P, lpeg.Vlocal new_grammar = visualizers.newgrammarlocal g = { pattern = V"default:pattern", visualizer = V"pattern"^1}local c_parser = P(new_grammar("default", g))而后给解析器取个名字 foo,并将其注入 ConTeXt 的源码彩化机制: visualizers.register("foo", { parser = c_parser })解析器的名字是在 \starttyping ... \stoptyping 命令中应用的,即 ...
上一篇:工夫治理 将 TeX 宏接到的参数传递于 Lua 函数,略含机巧。例如,将 \foo 承受的 Lua 表数据传递给 bar 函数, \environment card-env\startluacodefunction bar(x) context.startitemize{"n", "broad"} for _, v in ipairs(x) do context.item(v) end context.stopitemize()end\stopluacode\def\foo#1{\ctxlua{bar({#1})}}\starttext\foo{"Hello", "world", "!"}\stoptext \foo 接到的参数,并非真正的 Lua 表,而是一段文本 "Hello", "world", "!"。 宏调用语句 \foo{"Hello", "world", "!"}里的这对花括号 {},它是 TeX 的编组(Group)符号,用于囊括一段文本并将其作为 \foo 的参数 #1。换言之,对于上述宏调用语句而言,\foo 的定义里的参数 #1 是 "Hello", "world", "!",而非 {"Hello", "world", "!"}。 在 \foo 的定义里,将 #1 的值传递给 Lua 函数 bar 时,我又给 #1 穿上了 {},此时,对于 Lua 解释器而言,bar 函数的参数是一个表 {#1}。因为在上例里,#1 的值是 "Hello", "world", "!",所以 Lua 解释器便认为 bar 函数的参数是 {"Hello", "world", "!"}。 ...
上一篇:伪竖排 对每个人最偏心的莫过于工夫。绝大多数人的工夫,被极少数的人以花样繁多的管理学伎俩轻轻偷去了一部分。窃钱者蹲监狱,窃工夫者为老板。若每个人都能管好本人的工夫,天下必将大同。 工夫戳增强版回顾一下之前在 card-env.tex 文件里定义的工夫戳: \startluacodemy = {}function my.is_cjk_char(c) if c >= 0x3400 and c <= 0x4db5 or c >= 0x4e00 and c <= 0x9fa5 or c >= 0x9fa6 and c <= 0x9fbb or c >= 0xf900 and c <= 0xfa2d or c >= 0xfa30 and c <= 0xfa6a or c >= 0xfa70 and c <= 0xfad9 or c >= 0x20000 and c <= 0x2a6d6 or c >= 0x2f800 and c <= 0x2fa1d or c >= 0xff00 and c <= 0xffef or c >= 0x2e80 and c <= 0x2eff or c >= 0x3000 and c <= 0x303f or c >= 0x31c0 and c <= 0x31ef then return true; else return false; endendfunction my.rotate(x, a) pad = "\\kern.125em" for _, c in utf8.codes(x) do if my.is_cjk_char(c) then context("%s{\\rotate[rotation=%d]{%s}}%s", pad, a, utf8.char(c), pad) else context("{\\raise.5\\maxdepth\\hbox{%s}}", utf8.char(c)) end endend\stopluacode\def\timestamp#1{\rotate[rotation=270]{\ctxlua{my.rotate("#1", 90)}}}\setuptexttexts [margin] [][\hfill{\timestamp{2023 年 01 月 26 日 凌晨 04 时 44 分}}\hfill]当初,将 \timestamp 定义为 ...
上一篇:工夫戳 这次会用到 Lua,我保障。 页码在我的肤浅的审美领域里,card.pdf 的页码没有在页脚(footer)的留白(Margin)区域居中,甚为不美。然而,card-env.tex 里的 \setuppagenumbering[location={footer,inmargin}]对此却无能为力。既然如此,还要它作甚,破而后立吧。先将上述代码批改为 \setuppagenumbering[location=] % 敞开页码而后应用 \setupfootertexts 在页脚的留白区域安放页码: \setupfootertexts[margin][][\hfill 1\hfill] 当然不可能所有页面的页码都为 1,所以该当应用 \pagenumber 取得每一页对应的页码: \setupfootertexts[margin][][\hfill\pagenumber\hfill]当初将以下两行代码增加到 card-env.tex 里: \setuppagenumbering[location=]\setupfootertexts[margin][][\hfill\pagenumber\hfill]工夫戳我想让工夫戳呈现在版心(或注释区域)右侧的留白区域,\setuptexttexts 可成就此事: \setuptexttexts[margin][foo][bar]可在注释区域的左侧和右侧的留白区域居中搁置 foo 和 bar: \setuptexttexts[margin][\hfill foo\hfill][\hfill bar\hfill] 去掉 foo,将 bar 换成工夫戳: \setuptexttexts [margin] [][\hfill 2023 年 01 月 26 日 凌晨 4 时 44 分\hfill] 后果是工夫戳文字大部分出界了。这在预料之中,留白区域太窄,工夫戳太长。 应用 \rotate 能够依据指定角度逆时针旋转文本, \setuptexttexts [margin] [][\hfill\rotate[rotation=270]{2023 年 01 月 26 日 凌晨 4 时 44 分}\hfill]在生成 PDF 文件的过程中,上述代码会导致 context 命令报错: ...
上一篇:卡片 我要在卡片的页脚区域减少工夫戳,例如 2023 年 01 月 26 日 凌晨 4 时 44 分然而,迄今为止,尚未介绍如何让 ConTeXt 反对汉字。 汉字,始终是 TeX 世界之痛。 与仅须要几十个字母的拼音文字不同,汉字要成千上万个字符。为汉字设计字体,全副字符须要应用字体设计软件逐个绘制而成。 字体大多是有版权的,须要付费取得字体设计公司的受权方能应用。中文 Windows 用户之所以能看到汉字,须要感激微软出钱购买了汉字字体的受权,但也无需感激,羊毛出在猪身上。不过,即便你应用的是正版 Windows 零碎,假使将其字体复制到非 Windows 零碎里应用,仍然很有可能是侵权行为。RMS 当年因为感觉相似这样的事件切实是荒谬至极,愤而举起自由软件大旗。 微软 Office,金山 WPS,方正的飞腾以及 Adobe 的 InDesign 等商业排版类软件,它们不为汉字而痛,因为经营它们的这些公司有购买甚至设计汉字字体的实力。TeX 则不然,它是自由软件,负责它的开发和保护的组织是非盈利组织,没有这样的实力。 有些汉字字体是收费的。这份文档仅以此类字体为例,介绍如何在 ConTeXt 里应用,然而所讲述的常识对于任何 TrueType 和 OpenType 格局的汉字字体理当实用。 Google 公司和 Adobe 公司联合开发了蕴含了汉字的思源字体,有黑体1,也有宋体2。这份文档仅应用思源宋体,可从以下链接下载: 思源宋体下载后,将 SourceHanSerifCN.zip 解开,这份文档仅应用其中的 SourceHanSerifCN-Regular.otf 字体。 有很多种方法让 ConTeXt 在须要指定字体的时候可能找到字体文件,最简略的一种办法是将字体文件放在 ConTeXt 的装置目录里的指定地位。 我的机器运行的是 Linux 零碎,我将 ConTeXt 装置到了 $HOME/opt/context 目录。对于不相熟 Linux 系统目录构造及相干术语的 Windows 用户而言,能够设想为,我将 ConTeXt 装置到了 D:\Program Files\context 目录,这个目录就是所谓的 ConTeXt 的装置目录。 ...
上一篇:两个世界ConTeXt 输入的 PDF 文件,其页面尺寸默认与 A4 纸的尺寸雷同。在今后,我可能要给出很多的排版示例。若给出排版后果的全貌,则 A4 尺寸太大了,会导致示例截图里的文字不够清晰。假使能将页面尺寸设置为卡片大小,并对版面略作设计,兴许能让我在写这份文档的过程中多一些愉悦。 导言区TeX 源文件里若应用了 ConTeXt 提供的管制序列,便可将其称为 ConTeXt 源文件。很多时候,咱们也不用如此学究气。此外,TeX 管制序列也常常能够称为命令,只是要留神,它们是排版命令,而非在终端里执行的命令。 一份 ConTeXt 源文件,其根本格局为 \starttext% 注释\stoptext% 是 TeX 源文件里的正文符,该符号以及位于它之后直至行尾的文字(包含换行符)会被 TeX 编译器疏忽。 在 \starttext 之前呈现的任何内容,不会呈现在排版后果里。在 \starttext 和 \stoptext 里呈现的内容,能够呈现在排版后果里,因而这部分内容称为注释。\stoptext 前面的内容,会被 TeX 编译器疏忽。 当初,开始关怀 \starttext 之前应该能够产生什么。通常称该区域为导言区,用于排版的全局管制。例如 \setuphead[title][align=middle]\starttext\title{Hello world!}... some text ...\title{Hello world again!}... some text ...\stoptext在导言区设定了题目的居中,会作用于注释里的所有 \title。同理,如果我在导言区定义了页面的尺寸,那么它就能够作用于每个页面。试试看, \definepapersize[card][width=85.6mm,height=53.98mm]\setuppapersize[card]\starttext\title{Hello world!}... some text ...\title{Hello world again!}... some text ...\stoptext上述第一个命令 \definepapersize 定义(define)了纸张(paper)的尺寸(size),并给它取了个名字 card。第二个命令的作用是设置(set up)纸张(paper)的尺寸(size)为 card 这个尺寸。 值得注意的是,在 ConTeXt 里,纸张的尺寸与页面的尺寸是两个概念,然而当初无需纠结此事,上述设定是用纸张尺寸作为页面尺寸了。 上述 ConTeXt 源文件的排版后果如下图所示: ...
上一篇:ConTeXt 计算机ConTeXt 里的 Lua。这句话博大精深。 ConTeXt 世界里的大部分设施是用 TeX 语言构建的。在 ConTeXt 源文件里, \ 前面追随一个或多个英文字母的文本称为管制序列。 \ 前面追随单个非字母的文本,也称为管制序列。 例如 \starttextfoo \ConTeXt\ bar\stoptext其中,\starttext,\ConTeXt,\stoptext 以及 \空格,皆为管制序列。 所有的管制序列有着一个独特的使命,将排版信息输入到 PDF 文件里,简而言之,即排版。例如上例,排版后果如下图所示 每个管制序列都有其独特的作用。例如,在 ConTeXt 的世界里,只有位于 \starttext 和 \stoptext 之间的内容,方有机会输入至 PDF 文件。 TeX 语言可能组合既有的管制序列,派生出新的管制序列,这是 TeX 世界生生不息的本源所在。无妨从人类语言字词组合的角度了解管制序列的组合,例如「人」和「间」的组合产生了「世间」。 TeX 语言所结构的世界在 TeX 源文件里占主体位置。Lua 语言通常仅呈现于管制序列 \ctxlua{ ... } 或 \startluacode... ... ...\stopluacode中省略号批示的地位,其中 \ctxlua,\startluacode 以及 \stopluacode 是沟通 TeX 世界和 Lua 世界的隧道,但 Lua 世界里通过计算产生的后果最终须要传递于 TeX 世界。 因而,TeX 世界看了 Lua 世界一眼说,世界是咱们的,也是你们的,但归根结底是咱们的。 Lua 世界说,归根结底是 PDF 的。 古代大多数字处理软件,例如微软 Word,金山 WPS,自在的 LibreOffice Writer……它们皆能将本人的排版后果转化为 PDF 文件。当初的网页浏览器也能将网页内容保留为 PDF 文件。有什么必要应用 TeX 制作 PDF 文件呢? ...