使用Shell脚本自动化构建Source Han Serif多语言字体
使用Shell脚本自动化构建Source Han Serif多语言字体
引言:简化多语言字体的编译流程
手动编译Source Han Serif字体家族的多语言版本通常需要执行大量重复命令,管理不同字重和地区变体,并确保构建参数的一致性。这不仅耗时且容易出错。本文将介绍如何通过Shell脚本实现全自动化构建,涵盖所有字重(从ExtraLight到Heavy)和多地区(简体中文、繁体中文、日文、韩文)的字体。
完成本文后,您将掌握以下技能:
- 使用核心工具链(makeotf/tx/sfntedit/otf2otc)进行多语言字体构建。
- 编写跨平台的Shell脚本。
- 实现并行构建以优化性能。
- 构建完整的自动化工作流。
项目背景与挑战
Source Han Serif是一款开源的泛东亚字体家族,提供7个字重(ExtraLight、Light、Regular、Medium、SemiBold、Bold、Heavy)和5个地区版本(简体中文CN、繁体中文TW/HK、日文JP、韩文KR)。手动构建涉及:
- 7个字重 × 5个地区 = 35个基础OTF文件
- 7个字重 × 1个超级OTC集合 = 7个字体合集
- 变量字体(Variable Fonts)的额外构建流程
手动构建的问题
| 问题类型 | 具体表现 | 影响程度 |
|---|---|---|
| 命令重复 | 同类命令需执行35次 | 容易出错,维护困难 |
| 路径管理 | 文件分散在嵌套目录中 | 路径错误导致失败 |
| 依赖顺序 | OTC构建依赖基础OTF文件 | 错误顺序导致损坏 |
| 时间消耗 | 单字体构建需三步,全量构建超1小时 | 开发周期延长 |
核心工具与原理
工具安装
Source Han Serif的构建依赖Adobe Font Development Kit for OpenType (AFDKO)工具集,包含以下组件:
# Ubuntu/Debian系统安装
sudo apt-get install -y afdko fonttools
# macOS系统安装
brew install afdko fonttools
# 验证安装
makeotf -v # 版本应为2.5.x以上
otf2otc -h # 显示OTC合并工具帮助
核心命令解析
以下是单个字体的构建流程示例(以简体中文为例):
# 字体构建
makeotf -f cidfont.ps.CN \
-omitMacNames \
-ff features.CN \
-fi cidfontinfo.CN \
-mf ../FontMenuNameDB \
-r -nS -cs 25 \
-ch ../UniSourceHanSerifCN-UTF32-H \
-ci ../SourceHanSerif_CN_sequences.txt
# CFF表优化
tx -cff +S cidfont.ps.CN CFF.CN
# 整合CFF表到OTF
sfntedit -a CFF=CFF.CN SourceHanSerifCN-Regular.otf
自动化脚本设计
目录结构与常量定义
首先明确项目的目录结构并定义关键常量:
#!/bin/bash
# 配置区域
ROOT_DIR=$(pwd)
WEIGHTS=("ExtraLight" "Light" "Regular" "Medium" "SemiBold" "Bold" "Heavy")
REGIONS=("CN" "TW" "HK" "JP" "KR")
# 工具路径
MAKE_OTF="makeotf"
TX_CMD="tx"
SFNT_EDIT="sfntedit"
OTF2OTC_CMD="otf2otc"
OTF批量构建函数
创建generate_otf()函数处理所有地区的单字重版本:
generate_otf() {
local weight=$1
local dir="${ROOT_DIR}/Masters/${weight}"
echo "开始构建 ${weight} 字重"
for region in "${REGIONS[@]}"; do
cd "${dir}" || exit 1
# 执行构建命令
$MAKE_OTF -f "cidfont.ps.${region}" \
-omitMacNames \
-ff "features.${region}" \
-fi "cidfontinfo.${region}" \
-mf "../../FontMenuNameDB" \
-r -nS -cs 25 \
-ch "../../UniSourceHanSerif${region}-UTF32-H" \
-ci "../../SourceHanSerif_${region}_sequences.txt"
# 优化CFF表
$TX_CMD -cff +S "cidfont.ps.${region}" "CFF.${region}"
$SFNT_EDIT -a "CFF=CFF.${region}" "SourceHanSerif${region}-${weight}.otf"
# 验证输出
if [ -f "SourceHanSerif${region}-${weight}.otf" ]; then
mkdir -p "${ROOT_DIR}/output/otf"
mv "SourceHanSerif${region}-${weight}.otf" "${ROOT_DIR}/output/otf/"
fi
done
}
OTC合集构建函数
创建assemble_otc()函数处理每个字重的OTC合集:
assemble_otc() {
local weight=$1
local otc_dir="${ROOT_DIR}/Masters/${weight}/OTC"
local output="${ROOT_DIR}/output/otc"
echo "开始构建 ${weight} OTC合集"
cd "${otc_dir}" || exit 1
# 构建OTC文件
$OTF2OTC_CMD -t 'CFF '=0 \
-o "SourceHanSerif-${weight}.ttc" \
"SourceHanSerif-${weight}.otf" \
"SourceHanSerifK-${weight}.otf" \
"SourceHanSerifSC-${weight}.otf" \
"SourceHanSerifTC-${weight}.otf" \
"SourceHanSerifHC-${weight}.otf"
# 移动到输出目录
if [ -f "SourceHanSerif-${weight}.ttc" ]; then
mkdir -p "${output}"
mv "SourceHanSerif-${weight}.ttc" "${output}/"
fi
}
主流程控制
主函数协调整个构建流程:
main() {
mkdir -p "${ROOT_DIR}/output/{otf,otc}"
# 并行构建OTF
printf "%s\n" "${WEIGHTS[@]}" | xargs -I {} -P 4 bash -c 'generate_otf "$@"' _ {}
# 构建OTC
for weight in "${WEIGHTS[@]}"; do
assemble_otc "${weight}"
done
echo "构建完成,输出位于 ${ROOT_DIR}/output"
}
main
总结与扩展
通过上述脚本,我们可以显著简化Source Han Serif的构建过程,提升效率并减少错误。未来可以进一步集成CI/CD系统,支持更多平台,或引入测试工具以验证字体质量。