用 Shell 脚本制作签字页

在我目前的工作中,一项常见但繁琐的任务就是制作文件的「签字页」。具体而言,这项任务包含如下步骤:

  1. 将 Word 格式的交易文件导出为 PDF 格式;
  2. 逐页提取 PDF 版中的签字页部分;
  3. 将单页签字页按照类似于 合同名称_SigPage_01_签署方名称.pdf 的格式重命名。
「签字页」
「签字页」

这些步骤本身都毫无难度,但逐个操作下来仍然麻烦且易错。特别是对于那些文件数量和签署方数量都动辄十几二十个的大型交易,制作签字页对体力、眼力和脑力都是挑战。

显然,这就给通过自动化来「偷懒」创造了很强的动机。

上述步骤中,第 1 步是最容易通过工具来省事的:有大把的图形界面软件(例如 Acrobat、WPS 等)可以批量将 Word 文件转换为 PDF,只要一股脑地选中需要转换的原始文件,等待转换完成即可。如果偏好使用命令行,还可以使用 docx2pdf(Windows 和 macOS 通用)、DocToOfficeToPDF(只适用于 Windows)等工具进一步方便批量操作。

但之后的两个步骤——分割页面和重命名——才是最耗费精力、却又不太可能找到现成的工具的。

之前,我虽然一直有 DIY 一个自动化方案的想法,但总是因为时间有限和自己懒等原因未能实现。但在今天又一次被制作签字页的任务羞辱之后,我终于决心长痛不如短痛,花了一个下午把这个想法付诸实践,而成果就是下面这段(简陋难看的)shell 脚本 sigpgs.sh:…

Word 文档导出为 PDF 时出现额外脚注

昨天在把一个合同从 Word 版本导出为 PDF 的时候,发现导出的 PDF 版总是会在页脚处多出一串代码(形如 XY&Z\12345.67),但在 Word 中并不能看到任何对应的文字。

打印时页脚自动出现的编号(文件内容和代码都是我乱编的)
打印时页脚自动出现的编号(文件内容和代码都是我乱编的)

虽然暂时不知道这串代码的意思,但看外观像是某种格式的文件编号。于是首先尝试搜索其中的字母部分 XY&Z,发现是某个律所的简称(全称类似 Xenos, Yanko & Zais, LLP)。

看来,这串字符确实是文件编号。剩下的问题就是它是如何出现的,以及怎么去掉。

考虑到文件编号只在导出成 PDF 时才出现,而导出 PDF 的操作基本相当于打印,便联想到 Word 中域功能的特性——打印时自动更新页眉和页脚中的域。于是再次进入脚注编辑界面并按 Option-F9 显示域代码,果然看到这串隐形文件编号的对应位置有一个域,代码为 { DOCPROPERTY"SWDocID" }

查阅 …

为 Magic Mouse 辩护

引言

如果要问什么苹果产品最能体现这家公司对于简约不惜代价的执念,它的鼠标系列产品显然可以堪此「重任」。

早年,从圆盘形的 Apple USB Mouse,到坚持只做一个按键的 Apple Pro Mouse,再到滚轮只有豆粒大小的 Apple Mighty Mouse,苹果的鼠标总让人觉得是设计师在真空实验室里、睥睨着人间烟火(「你也配姓乔?」)做出来的「摆件」而非工具。

始终画风清奇的苹果鼠标(来源:维基百科)
始终画风清奇的苹果鼠标(来源:维基百科)

近年,Apple Magic Mouse 虽然有了左右键的区分、在形态上向正常的鼠标靠拢,却仍然因为过度扁平的机身而被普遍认为是违反人体工学;2015 年的二代 Magic Mouse 将 Lightning 接口放在底部,导致充电只能以四脚朝天的姿势实现,收获了用户的无数嘲讽和恶搞。

对 Magic Mouse 的经典揶揄方式之一(来源:网络)
对 Magic Mouse 的经典揶揄方式之一(来源:网络)

之前,受这种「批评苹果的鼠标就是政治正确」的主流观点影响,我从来没有主力使用过 Magic Mouse,并且多次劝服身边有意入手的朋友避开这个「大坑」;与 Magic Mouse 仅有的接触——在零售店短暂的一两分钟试用——也进一步强化了这种先入为主的印象。

直到上个月,我被约稿写一篇对比 iPadOS

从邮件通讯的流行谈起

一、引言

和时尚界类似,科技行业似乎也时常出现「复古」的风潮——沉寂的旧技术被发掘出新用途、重新走入聚光灯下,开拓出新的市场和商机。

2018 年,在 Facebook 泄露信息等事件的催化下,RSS 这项有二十多年历史的资讯订阅技术,就突然重获科技媒体的关注,被誉为未被算法污染的净土;我还撰文探讨「RSS 的复兴」这个一度热门的话题。

不过,当时被我忽略的是,另一项更为古老的技术——电子邮件也在悄悄积累势能。不知从何时起,邮件通讯(newsletter)已经成为社交媒体和新闻 app 外,获取资讯的另一个流行选择。

如果留心观察,你很可能已经发现自己关注的媒体网站,都在醒目位置加上了邮件订阅入口。的确,无论老牌印刷媒体还是新生代互联网媒体,都在争相推出邮件通讯产品,将其视作新的流量增长点。两年前,《纽约时报》制作的邮件通讯数量就达到了 55 种,订阅量超过 1400 万。就连主打专有排版格式、大力推广 Apple News 服务的苹果,也在去年底加入赛场,推出了配套的邮件新闻早报

《纽约时报》数量繁多的邮件通讯产品
《纽约时报》数量繁多的邮件通讯产品

邮件通讯也被证明是一条可行的创业、创收途径。由两名前媒体制作人创办的新闻简报 theSkimm 积累了 700 万读者,每封邮件的广告收入可达六位数,并获得了两轮共计 2000 万美元的投资。随着邮件通讯市场逐渐壮大,还出现了 Substack 这样为独立创作者提供「一条龙」服务的付费通讯发布平台,其上不乏 The

若饭 2.9 和 3.7

最近在家办公时间比较多,伙食问题难免要多费神。虽然一直尽可能自己动手做饭,但毕竟厨艺有限,做多了终归会黔驴技穷。年前曾经趁打折买了一批饮料版和固体版若饭,但为了省事扔在了办公室,也不想专门跑一趟去拿。想到之前还没有试过他们的粉末版产品,就买了两罐粉末版 2.9 版尝试。

因为之前刚吃完 Huel 的存货,免不了拿它和若饭粉末版做比较。在我吃过的各类代餐中,粉末版 Huel 可以说是饱腹感最强的。这既来源于它冲泡后浓稠的质感,也是因为 Huel 粉末非常「吃水」——官方建议的注水量是每 100 克(对应 400 卡热量,正好一顿)加水 17 fl oz(502 mL),因此,每份的质量达到 600 克,做出来是毫无疑问的「大碗」。

相比之下,粉末版若饭则「轻盈」很多。400 卡热量对应约 90 克粉末,并且建议的加水比例则是 1:3,即一份做出来总计 360 克,只有同等热量 Huel 的 60%。再加上若饭的口感走的似乎是顺滑路线,更像是饮料、而不是 Huel 那样的「粥」,喝完后的饱腹感完全不是一个量级的,我必须再搭配些蔬菜才能保证在下顿前不提前挨饿。至于口味,与我之前喝过的原味饮料版若饭比较类似,但似乎奶味更浓一些,比较符合我的偏好。

另外,我比较喜欢把代餐加热后再喝,而不同代餐在受热后的差异远比常温时大得多。Soylent 和 Huel 在加热后都会变得更浓稠,但热的 Soylent 比较顺滑,更像是奶昔,热的 Huel 完全变成了「大果粒」的燕麦粥。而粉末版若饭则让我非常意外,在受热以后变得非常……蓬松,一勺铲起来轻飘飘的,几乎像是奶盖或搅打奶油了。我并不排斥这种质感,觉得还挺有趣的,但这也进一步削弱了饱腹感——毕竟有谁能靠奶盖吃饱呢。…

Year in Review 2019 — 当数字生活与工作相遇

对我个人而言,2019 是充满变化的一年。

这一年,我从美国回到国内,走出学校,走上了工作岗位。地理位置和社会角色的改变,自然会在生活中有所反映。但或许是因为我习惯了比较简单而规律的生活方式,这些变化对我日常生活的影响,并没有想象中来得大。

相反,我生活中的另一个重要部分——数字生活——却因此迎来了不少新的挑战。而我过去一年的很多时间,正是花在了应对这些影响做出调整上。通过这篇文章,我想对自己目前为止的经验和思考做一次总结。

一、一次失败的叛逃经历——macOS 和 Windows 双平台办公记

(一)两个契机

在去年以前,Windows 已经是我一个渐行渐远的记忆。和很多同龄人一样,我也是在 Windows 环境下完成了对电脑的启蒙。但自从带着 MacBook 上大学以后,我就很久没有主力使用过 Windows 设备。

不过,去年的两次契机,却让我在多年后重新捡起了对 Windows 系统的学习。

先是在去年四月,我筹划为自己的房间添置一台小主机。主要的目的是拿它当软路由,以及外出时充当 iPad 的远程桌面。最初的计划是继续选择熟悉的 Mac,买一台刚获得重大更新的 Mac mini。但在调研的过程中,体积更小、成本更低、配置更灵活的 Intel 第八代 NUC 意外进入了我的视野。就这样,我迎来了自己很久以来的第一台 Windows 设备。

用作软路由的 Intel NUC8I5BEH
用作软路由的 Intel NUC8I5BEH

但更重要的契机还是在九月。参加工作后,单位为我配发了一台 ThinkPad X390 作为办公电脑。本来,我并不介意背着 MacBook …

iPod touch — My Apple Product of the Decade

前两个星期,国外苹果圈掀起了一阵评选「十年间最重要的苹果产品」的热潮。在果圈名流们的评选结果中,MacBook Air、iPad Air、iPhone 4 等重磅产品意料之中地榜上有名。

令我稍有些意外的是,尽管参与点评的人不少、提名的产品也覆盖了苹果大多数品类,但似乎始终没有人提到 iPod touch。当然,这种冷落也是情理之中。iPod touch 既不像 iPhone 那样占据了苹果营收的半壁江山,也不像 MacBook Air 那样成为了其他厂商多年追逐的目标。iPod touch 甚至在过去十年的大部分时间中都处于「休眠」状态——最近一次「实质性」更新还是在 2012 年的第五代,此后都只是对处理器、摄像头和存储空间的例行升级,外观和设计再无变化。此外,官网上折叠在「音乐」页面下的链接,财报中折叠在「其他」类目中的销量,无一不显示着官方对这一产品放任自流的态度。

问题在于,「十年间最重要的苹果产品」本身是一个模糊的概念——它没有界定「对谁重要」。如果是「对苹果最重要」或「对业界最重要」,那大概确实没有 iPod touch 什么事。可是,如果把标准改成「对自己最重要」呢?过去十年,苹果的哪个产品向介绍了这个品牌和它的价值观、审美观?哪个产品塑造了日后的使用习惯?哪个产品跟重要的经历和记忆关联在一起?按这个标准,iPod touch 对我来说才是 the Apple product of the decade,重要性甚至超过每天揣在口袋里的 …

若饭固体版 v1.7

今天收到了若饭前不久更新的固体版 v1.7。

之前,在少数派商店买过 1.5 版,尝试后感觉虽然不算惊艳,但口味亦可接受,且成本方面确实比海淘 Soylent 有很大优势,便续购了几次。上周吃完存货,准备再买一点时,却发现各个渠道的 1.5 版都缺货或者下架了。搜索后,才知道是官方更新了 1.7 版配方。出于好奇,我便直接下单了。

(这次购买过程还出了些乌龙:我的订单是两箱 20 块装的 1.7 版,结果官方商店第一次给我发来的是两盒 1.5 版,而且还是零售装的小盒……收到后颇有一种「你在逗我吗」的错愕感。好在售后态度尚可,反映后当天就顺丰补发出来了。)

对于 1.5 和 1.7 版的区别,我根据官方提供的数据做了些换算,见下图。两个表格分别从成本和营养成分角度对比了新旧版本。

可以看到,好的变化在于纤维、蛋白质的含量都提高了,而糖分、脂肪的含量则下降了(当然,这里说的「好」是相对的,是否有益还取决于各营养素整体的均衡程度和不同个体的需求)。但另一方面,新版提供能量的密度(单位重量含有的热量)和「性价比」(单位价格对应的热量)都有一定程度的下降。

晚上,我各吃了两块 1.7 版和 1.5 版,将两者做了对比。

口感方面,新版确实比旧版「松软」了不少,应证了宣称的改进。但至于这是否足以像官方宣传那样,让固体版若饭从「饼干」变为「糕点」,我暂时持保留态度。毕竟,「糕点」并不简单地是软化的饼干,而往往还有更丰富的层次;1.7 版在我看来暂时还没有达到这样的水平。

此外,我之前发现 1.5 版有严重的口感不统一问题:同一箱饼干中,常常是某一袋明显偏硬、而另一袋明显偏软,表明厂商对生产工艺的控制能力有待提高。由于样本数量不足,我暂时无法判断 1.7 版是否解决了这个问题,有待之后补充。

口味方面,官方宣传此次加入了苹果果酱和豆沙,因此将会比之前更「好吃」。不过,我在尝试时并没有明显吃出这两种材料的味道,反倒感觉有些类似葱香的口味,但从成分表中并不能看出是从何而来。个人而言,我并不排斥更新后的口味,但也不认为它优于原来那种纯粹到有些寡淡的奶香味;「丰富」可能是比「好吃」更严谨的表述。

整体而言,若饭固体版这次更新给我的印象是不过不失。相比于只是风格微调的口味和口感,更重要的变化可能在于营养成分,但这就不是我今晚一两口能尝出来的了。…

My Alfred Themes

Today I finally decided it’s time to swallow the bullet — too many built-in actions in LaunchBar have been broken by Catalina to keep me in its orbit. I installed Alfred and started my self-inflicted journey upward along its learning …

如何在 Word 文档的同一段落内插入自动编号

在使用 Word 编辑文档的过程中,我们经常会遇到需要在一段话内列举带编号项目的情况,例如:

鼓励网络信息内容服务平台坚持主流价值导向,优化信息推荐机制,加强版面页面生态管理,在下列重点环节(包括服务类型、位置版块等)积极呈现本规定第五条规定的信息:(一)互联网新闻信息服务首页首屏、弹窗和重要新闻信息内容页面等;(二)互联网用户公众账号信息服务精选、热搜等;(三)博客、微博客信息服务热门推荐、榜单类、弹窗及基于地理位置的信息服务版块等;[…]

在这些场合,编号的输入和修改是比较繁琐的。如果编号项目的总数只有两三个,工作量还能忍受;但如果数量达到两位数,逐个手敲就很低效了。特别是对于中文文档,在段落中输入 (1)(a)(i) 这样的字母、数字编号,还意味着需要在中英文状态下来回切换。如果后续修改中不幸要删除列表中的某一项,也就意味着要手动修改它之后的每一个编号,更加耽误时间。

在多段落列表中,这些麻烦是不存在的——只要用现成的自动编号功能就行了。然而,自动编号并不能在同一个段落中使用。

不过,这并不意味着在段落内部就无法实现自动编号。解决方法就是使用 Word 的(field)功能。

关于「域」在 Word 中的含义和使用方法,我在之前的文章中已经有所介绍,这里不再重复。简言之,所谓的「域」就是一个占位符,它的作用是告诉 Word「显示的时候把我换成别的东西」。

这里,我们要使用的是 SEQ。如名称(SEQuence)所表明,它的作用就是产生一个数字「序列」。但与自动编号不同的是,SEQ 域可以在同一段落中多次出现,且位置不限于段落开头。因此,通过在段落中插入多个 SEQ 域,就可以实现段内自动编号的效果。

通过 SEQ 域插入编号:基础操作

我们首先通过一个简单场景——插入形如「(一)、(二)、(三)」的段内序号——来熟悉 SEQ