ConTeXt 蹊径

2023-03-29
阅读 1 分钟
1.3k
大概是 2009 年,初学 ConTeXt 时,曾经写了一份笔记,内容颇为粗陋,当时 CTeX 论坛的朋友协助打包上传到了 CTAN。2011 年我对该笔记作了一些修改,并在文中许诺在当年年底作一番大修,然而我食言了。很多年后,我果然胖了起来。

《Lua-in-ConTeXt》12:zhfonts 备忘录

2023-03-02
阅读 10 分钟
1.1k
zhfonts 模块实现了 ConTeXt (>= MkIV) 对汉字字体的加载、简体汉字标点符号(全角)间距的压缩以及边界对齐。该模块成型于 2011 年,2023 年初对代码进行了一番梳理,希望它能工作到 2033 年……安装和使用方法可参考 [链接],本文仅对其一些技术细节予以说明,一则备忘,二则或许能帮助一些同好对该模块予以改进。

《Lua-in-ConTeXt》11:源码凸显

2023-02-09
阅读 9 分钟
983
这段 C 程序源码在我的 Emacs 编辑器里,变量类型、宏、关键字、函数名等元素,颜色不一,可读性显然优于 ConTeXt 默认的排版结果,证据是,反对者的家里早已没有黑白电视了。

《Lua-in-ConTeXt》10:缓冲区魔法

2023-02-05
阅读 3 分钟
1.3k
基于 ConTeXt 的缓冲区(Buffe)及其对 Lua 语言的支持,可以实现大段排版内容的预处理。所谓预处理,是指在 TeX 编译器对排版内容进行断行分页之前的处理,通常由排版者负责。

《Lua-in-ConTeXt》09:学一点 Lua

2023-02-03
阅读 5 分钟
1.2k
这份文档的题目是 ConTeXt 里的 Lua。主角应该是 Lua,ConTeXt 只是定语。但是,这个定语很长。这份文档迄今引入的 ConTeXt 知识尚不及 ConTeXt 全部知识的 1%。Lua 语言比 TeX 语言容易得多。倘若觉得学习 ConTeXt 毫无用处,学点 Lua 总是有益的,至少在这个信息化时代的某些时候跟别人说,我也懂点计算机编程。

《Lua-in-ConTeXt》08:参数列表解析

2023-02-01
阅读 3 分钟
952
\foo 接到的参数,并非真正的 Lua 表,而是一段文本 "Hello", "world", "!"。

《Lua-in-ConTeXt》07:时间管理

2023-02-01
阅读 8 分钟
936
对每个人最公平的莫过于时间。绝大多数人的时间,被极少数的人以花样繁多的管理学手段悄悄偷去了一部分。窃钱者蹲监狱,窃时间者为老板。若每个人都能管好自己的时间,天下必将大同。

《Lua-in-ConTeXt》06:伪竖排

2023-01-27
阅读 10 分钟
1.4k
在我的浅薄的审美范畴里,card.pdf 的页码没有在页脚(footer)的留白(Margin)区域居中,甚为不美。然而,card-env.tex 里的

《Lua-in-ConTeXt》05:时间戳

2023-01-26
阅读 3 分钟
1.6k
上一篇:卡片 我要在卡片的页脚区域增加时间戳,例如 {代码...} 然而,迄今为止,尚未介绍如何让 ConTeXt 支持汉字。汉字,一直是 TeX 世界之痛。与仅需要几十个字母的拼音文字不同,汉字要成千上万个字符。为汉字设计字体,全部字符需要使用字体设计软件逐一绘制而成。字体大多是有版权的,需要付费获得字体设计公司的...

《Lua-in-ConTeXt》04:卡片

2023-01-25
阅读 5 分钟
1.8k
ConTeXt 输出的 PDF 文件,其页面尺寸默认与 A4 纸的尺寸相同。在今后,我可能要给出很多的排版示例。若给出排版结果的全貌,则 A4 尺寸太大了,会导致示例截图里的文字不够清晰。倘若能将页面尺寸设置为卡片大小,并对版面略作设计,也许能岁月安好。

《Lua-in-ConTeXt》03:两个世界

2023-01-25
阅读 5 分钟
1.3k
ConTeXt 世界里的大部分设施是用 TeX 语言构建的。在 ConTeXt 源文件里, \ 后面跟随一个或多个英文字母的文本称为控制序列。 \ 后面跟随单个非字母的文本,也称为控制序列。

《Lua-in-ConTeXt》02:ConTeXt 计算机

2023-01-24
阅读 5 分钟
1.6k
用于编写 TeX 源文件(例如 hello.tex)的任何一种文本编辑器,都可视为「ConTeXt 计算机」的终端。context 命令可将 TeX 源文件里的内容输出到 PDF 文件,于是可将 PDF 文件视为 ConTeXt 计算机的显示器。

《Lua-in-ConTeXt》01:Hello world!

2023-01-24
阅读 1 分钟
1.5k
ConTeXt,我不厌其烦地打出它的大小写字母,它的意思既非「上下文」,亦非「语境」或「环境」,而是 Text with TeX 的意思。这是荷兰人 Hans Hagen 为自己创造的一个 TeX 宏包而取的一个失败的英文名字。

rskynet

2022-08-20
阅读 4 分钟
1.4k
rskynet 是用 Rust 语言编写的小程序,虽然它的名字叫天网(Skynet),但它的确是一个小程序,代码不足千行,以后也不会有更多的代码。之所以写这个程序,一是为了熟悉 Rust 语言,二是为了便于可视化我的一些三维数据。rskynet 的前身是一份用 Python 3 写的脚本,名字叫 hamal [1]。二者功能基本相同,但 rskynet 在选...

Elisp 12:兔子洞

2021-04-24
阅读 3 分钟
2.7k
从本章开始,进入这份 Elisp 教程的第三部分。这部分内容侧重于应用,在倘若不得不引入没学过的 Elisp 语法之时,则说明所侧重的应用必定是好的。

不知多久能学会 Elisp

2021-04-10
阅读 2 分钟
4.4k
在一个春天的夜晚,好久也没怎么出门的我,偶然发现 Emacs Lisp 程序能够像脚本程序那般运行,而不仅仅是用于为文本编辑器 Emacs 编写配置文件或插件。这个发现,让我觉得无意中发现了一宗瑰奇的宝藏。

Elisp 11:动态模块

2021-04-10
阅读 11 分钟
3.4k
Emacs 从版本 25 开始支持动态模块。所谓动态模块,即 C 语言编写的共享库 1 。Emacs 的动态模块,就是 Elisp 的动态模块。因此,倘若 Elisp 语言编写的程序某些环节存在性能瓶颈,可借 C 语言之力予以缓解。对于其他编程语言,只要能够调用 C 程序库,皆能用于编写 Emacs 的动态模块。本章仅讲述如何使用 C 语言完成此...

Elisp 10:宏

2021-04-09
阅读 4 分钟
3.3k
上一章实现了只定义了一个函数的库 newbie.el。事实上,这个函数可以不用定义成函数,定义成宏也可以,而且能让调用代码的执行效率微乎其微地更高一些。因为,调用函数,就像是去车站乘坐客车,而调用宏,犹如乘坐自家的私家车。这是一个不是很准确的比喻,所以它仅仅是个比喻。

Elisp 09:库

2021-04-07
阅读 2 分钟
2.5k
从第 1 章就定义了的 princ\' 函数被我一路使用至今,我一直觉得它很有用处,特别是在我调试程序的时候。我承认,用这种办法调试程序很原始。不过,筷子也很原始。为了不再张贴完整的代码之时附上它的定义,我决定建立一个 Elisp 库,用于存放它的定义以及今后我定义的其他函数。

Elisp 08:文本跨行提取

2021-04-06
阅读 6 分钟
2.7k
前言:不知多久能学会 Elisp上一章:命令行程序界面在上一章的结语里,我说这个教程是否会有第二部分,取决于我是否遇到了新的文本处理问题。结果很快如愿以偿。问题下面是 XML 文件 foo.xml 的内容: {代码...} 我需要从 <attachment>...<attachment> 块里提取以下条目: {代码...} 文本跨行匹配现在假设已...

Elisp 07:命令行程序界面

2021-04-05
阅读 6 分钟
2.4k
很多程序是有图形界面的,就是日常所见的那些有菜单和按钮的窗口以及对话框之类。在终端里运行的程序,通常也叫命令行程序,它们也有界面,即一组选项和参数。这两种程序,各有所长,也各有所短。

Elisp 06:缓冲区变换

2021-04-05
阅读 7 分钟
2.4k
在第一章「Hello world!」和第二章「文本解析」里已初步介绍了缓冲区的基本知识。使用 Elisp 语言编写文本处理程序时,充分利用缓冲区,似乎是着实是在发挥 Elisp 的一项长处。因而本章要思考和解决的一个现实问题是,缓冲区可以用来做什么。

Elisp 05:文本匹配

2021-04-05
阅读 3 分钟
3.1k
前言:不知多久能学会 Elisp上一章:迭代在第二章「文本解析」所实现的解析器程序里,为了判断一行文本是否以 \`\`\` 开头,我定义了一个函数: {代码...} 事实上,Elisp 提供了更强大的文本匹配函数。如何的强大呢?强大到了支持正则表达式匹配。正则表达式,就像古代官府捉拿江洋大盗时在城门边上张贴的通缉告示上的罪...

Elisp 04:迭代

2021-04-04
阅读 3 分钟
2.6k
前言:不知多久能学会 Elisp上一章:变量迭代,亦称循环,表示一段重复运行的程序,其状态可在每次重复运行的过程中发生变化。基于递归函数可以模拟迭代过程。例如以下程序 {代码...} Elisp 解释器在上述程序最后一个表达式 (every-line) 求值时,会转而对 every-line 函数定义里的每个表达式进行求值,但是当 Elisp 解...

Elisp 03:变量

2021-04-03
阅读 4 分钟
2.2k
前言:不知多久能学会 Elisp上一章:文本解析上一章实现的解析器程序——当然仅仅是玩具,有几处颇为丑陋,还有一处存在着安全问题。全局变量安全第一。先从安全问题开始。观察以下代码: {代码...} 上述代码定义的这个函数可判断字符串对对象 src 的内容是否以字符串对象 dest 的内容作为开头,例如 {代码...} 输出 t。这...

Elisp 02:文本解析

2021-04-03
阅读 8 分钟
2.9k
前言:不知多久能学会 Elisp上一章:Hello world!本章介绍 Elisp 的变量、列表、符号、函数的递归以及一些更便捷的插入点移动函数。这些知识将围绕一个实际问题的解决过程逐步展开。问题假设有一份文档 foo.md,内容如下: {代码...} 其中有一部分内容被包含在以 \`\`\` 为开头的两个文本行之间,如何使用 Elisp 编写一...

Elisp 01:Hello world!

2021-04-02
阅读 6 分钟
3.4k
倘若将 Elisp 的应用场景固定为文本处理,学习 Elisp,我认为无需像学习其他任何一门编程语言那样亦步亦趋,所以本章直接从文件读写开始入手,通过一些小程序,建立对 Elisp 语言的初步感受。

Bash Tips 03:双引号的重要性

2021-03-16
阅读 1 分钟
1.5k
假设在一份 Bash 脚本里,函数 foo 的定义如下: {代码...} 调用 foo: {代码...} 亦即,以空字串和 "test" 为参数值调用 foo,结果为 {代码...} 现在假设有函数 bar,其定义如下 {代码...} 然后调用 bar, {代码...} 结果输出 {代码...} 原因是,bar 接受的第一个参数值是空字串,但是当它将这个参数值传递给 foo 时,B...

Bash Tips 02:构造相对路径

2021-03-16
阅读 2 分钟
1.4k
假设此刻我的工作目录是 /tmp/demo/source/foo,该目录相对于 /tmp/demo 的路径显然是 source/foo,后者相对于前者的路径显然是 ../..,但是在 Bash 脚本里,该如何构造这样的路径呢?这个问题,在我写 gar 脚本时,是一个很关键的技术问题,因为在此我仅仅是举例说 /tmp/demo 是我的文档项目的目录,事实上,这个目录并...

Bash Tips 01:获取脚本自身路径

2021-03-16
阅读 4 分钟
4.1k
在写 gar 脚本的时候,我需要在 gar 脚本在运行时确定它自身在文件系统中所处目录的路径。基于该路径,可将 gar.css 文件部署到文档项目的根目录下,因为 gar.css 与 gar 脚本在同一目录下,后者需要根据自身的位置方能找到它,否则就只能由 gar 脚本的用户提供 gar.css 的路径,有所不便。