ConTeXt LMTX 安装与工程化配置指南

ConTeXt LMTX 安装与工程化配置指南
1. ConTeXt 不是“另一个 LaTeX”先搞清它到底解决什么问题很多人第一次听说 ConTeXt是在搜索“LaTeX 替代方案”或“排版更灵活的工具”时偶然撞见的。但如果你带着“这不就是个换了个名字的 LaTeX 吧”的预设去安装、去用十有八九会在三天内删掉它——不是它不好而是你从一开始就装错了方向。ConTeXt 的核心价值从来不在“能不能编译出 PDF”。它解决的是一个更底层、更顽固的排版工程问题当你的文档开始具备“系统性”而非“单篇性”时LaTeX 的模块耦合与配置分散机制会迅速成为生产力瓶颈。举个最典型的例子你要为一家科技公司维护一套完整的《产品白皮书》《用户手册》《API 参考指南》三套文档它们共享同一套品牌色值、同一套章节编号逻辑、同一套代码块样式、甚至同一套术语表自动索引规则。在 LaTeX 里你得分别维护三个独立的 preamble导言区每个都 copy-paste 一堆 \definecolor、\renewcommand、\usepackage并且一旦主品牌色从 #2563eb 改成 #1d4ed8你得手动改三份文件、三份 cls、甚至可能还要改三份 bst 样式——而任何一次遗漏都会导致某份文档的 PDF 输出颜色不一致被市场部当场拉群点名。ConTeXt 把这个问题从“文档级”提升到了“项目级”。它的 setup 指令比如 \setupcolors[statestop]、\setuphead[chapter][numberyes]不是写在每篇 .tex 文件开头而是统一定义在 project.mkiv 这个中央配置文件里所有子文档通过 \startproject ... \stopproject 包裹后自动继承全部设置。更关键的是ConTeXt 的模块module机制是真正可组合、可覆盖的你可以写一个 colors-mybrand.mkiv 定义所有色值再写一个 fonts-nerd.mkiv 定义等宽字体族最后在 project.mkiv 里用 \usemodule[colors-mybrand,fonts-nerd] 一行加载——顺序即优先级后加载的模块能安全覆盖前者的同名指令完全不需要修改原始模块源码。这种设计思想和现代前端框架的组件化、微前端架构一脉相承而不是 LaTeX 那种“全局宏污染补丁式覆盖”的老路。所以“安装 ConTeXt”这件事本质上不是在电脑上放一个编译器而是在你的工作流里植入一个可复用、可继承、可版本控制的排版基础设施。你安装的不是软件是整套文档工程的骨架。这也是为什么 ConTeXt 官方从不提供一键式 Windows Installer 或 macOS .pkg因为它默认就拒绝“孤立安装”。它的安装路径、环境变量、模块仓库位置全部服务于一个目标——让多个项目能共享同一套基础配置又能各自隔离定制。如果你跳过这个认知前提直接执行下载解压命令后面遇到的每一个报错比如 “context: command not found”、“cannot resolve module ‘page’”其实都是系统在提醒你“你还没想清楚这个骨架该长成什么样。”提示别急着打开终端。先花三分钟在纸上画出你未来半年要处理的文档类型树顶层是公司品牌规范中间是白皮书/手册/报告三大类叶子节点是具体版本v1.2、v2.0。ConTeXt 的安装路径应该从这棵树的根部开始规划。2. LMTX 是唯一正统选择为什么放弃旧版 ConTeXt MkII/MkIV现在打开 ConTeXt 官网wiki.contextgarden.net你会看到两个并列的下载入口“LMTX” 和 “MkIV”。很多教程还在教你怎么装 MkIV甚至有些中文资料把 MkIV 当作“最新版”。这是个危险的误导。LMTX 不是 MkIV 的升级版而是彻底重写的下一代引擎它和 MkIV 在底层架构、模块加载机制、甚至错误提示风格上都存在不可兼容的断裂。继续用 MkIV等于主动放弃 ConTeXt 过去五年最重要的进化成果。最直观的差异藏在编译命令里。MkIV 时代你输入的是context filename.tex而 LMTX 下必须用context --luatex filename.tex或简写为context --luatex filename。这个--luatex参数不是可选的装饰它是强制开关——因为 LMTX 已经完全移除了对 pdfTeX/XeTeX 引擎的支持只绑定 LuaTeX。这意味着什么意味着所有依赖\pdf...前缀的底层命令比如\pdfcompresslevel、\pdfmapfile在 LMTX 下直接报错也意味着所有用\directlua{}写的复杂排版逻辑现在可以调用完整的 Lua 5.4 标准库包括table.pack、string.match的新语法而 MkIV 只支持阉割版的 Lua 5.2。更关键的是模块生态的断层。ConTeXt 社区近两年发布的高质量模块比如t-filter用于嵌入外部代码高亮、t-tikz用于无缝集成 TikZ 图形、t-bibliography用于动态参考文献管理全部基于 LMTX 的新模块加载协议开发。这些模块的.mkiv文件里大量使用了 LMTX 特有的\registerctxluafunction注册机制和\ctxlua{...}调用方式。如果你强行把它们放进 MkIV 环境得到的不是功能缺失而是整个编译器进程崩溃——因为 MkIV 的 Lua 运行时根本无法识别这些新指令。我实测过一个典型场景用t-filter模块渲染 Python 代码块。在 LMTX 下只需三行\usemodule[filter] \defineexternalfilter[python][filtercommand{pygmentize -f latex -o \externalfilteroutputfile\space \externalfilterinputfile}] \starttext \startpython print(Hello Context!) \stoppython \stoptext编译瞬间完成输出 PDF 中的代码块带完整语法高亮和行号。而在 MkIV 下同样的代码会触发! Undefined control sequence. argument \registerctxluafunction错误且无法通过简单补丁修复——因为\registerctxluafunction这个指令本身在 MkIV 的源码中就不存在。所以“安装 ConTeXt”第一步必须明确选择 LMTX。官网提供的context-lmtx-win64-2025-08.zipWindows、context-lmtx-linux-2025-08.tar.xzLinux、context-lmtx-macos-2025-08.tar.xzmacOS这三个包就是当前唯一受官方持续维护的发行版。其他任何标着 “MkIV”、“Standalone”、“Minimal” 的第三方打包都应视为历史遗迹。安装过程看似只是解压实则是一次技术栈的迁移决策——你选择的不是文件而是未来三年文档工程的技术底座。注意LMTX 的版本号如 2025-08不是发布日期而是“功能冻结窗口”。ConTeXt 团队每月 1 日发布新版本但所有在该月内提交的 PR 都会被打包进当月版本。因此 2025-08 版本包含所有 2025 年 8 月 1 日至 31 日合并的功能而非“2025 年 8 月发布的旧版”。选择最新月份版本等于获得最完整的 LuaTeX 5.4 集成能力。3. 接力式安装的本质用最小初始包规避网络与权限陷阱你可能会疑惑为什么 ConTeXt 官方不提供一个几百 MB 的“全功能安装包”像 TeX Live 那样开箱即用答案藏在它的设计理念里——ConTeXt 不是静态软件而是一个按需生长的活体系统。它的核心编译器context只有不到 2MB但整个生态系统字体、模块、文档、示例超过 20GB。如果强制打包要么牺牲完整性变成阉割版要么制造巨大的下载负担尤其对国内用户。于是诞生了“接力式安装”Relay Installation先下载一个极小的 bootstrap 包约 10MB它只包含 LuaTeX 引擎、基础 context 脚本、以及一个智能的first-setup.shLinux/macOS或first-setup.batWindows引导程序。这个引导程序才是真正的主角它会自动探测本地网络环境检测是否能直连 contextgarden.netConTeXt 官方镜像站。如果失败国内常见自动切换到备用镜像如清华 TUNA、中科大 USTC智能分片下载将庞大的模块仓库拆成数百个独立 tarball如cont-t-auxiliary.tar.xz、cont-t-bibliography.tar.xz并行下载失败后自动重试权限沙盒化所有下载和解压操作都在用户目录下完成如~/context或C:\context绝不触碰系统级路径如/usr/local或C:\Program Files避免 sudo 或管理员权限需求增量更新感知如果检测到已有旧版 LMTX只下载变更的模块包跳过未修改的数 GB 文件。这就是为什么你在知乎看到的教程强调“假设你想将 d:\context 作为安装目录”——这个路径不是随意指定的而是接力安装的根容器。所有后续动作模块安装、字体注册、项目配置都以这个目录为绝对基准。我曾见过最典型的失败案例用户把 bootstrap 包解压到C:\Users\John\Downloads\context-lmtx然后运行first-setup.bat结果脚本在C:\Users\John\Downloads\context-lmtx\tree下创建了完整环境但用户误以为Downloads目录就是安装根后续手动把项目文件扔进去导致 context 找不到自己的模块仓库因为模块实际在tree/texmf-context子目录下。正确的操作链必须严格遵循四步闭环创建纯净根目录在 D 盘或其他非系统盘新建空文件夹如D:\context解压 bootstrap 到根目录将下载的context-lmtx-win64-2025-08.zip全部内容解压到D:\context确保解压后D:\context\first-setup.bat文件存在以普通用户身份运行引导程序双击D:\context\first-setup.batWindows或在终端执行sh first-setup.shLinux/macOS等待自动完成脚本会输出类似installing cont-t-bibliography ... done的日志全程无需人工干预耗时约 15-45 分钟取决于网络。最关键的细节在于第 3 步绝对不要用管理员权限运行first-setup.bat。因为 LMTX 的设计哲学是“用户私有环境”一旦用管理员权限运行它会尝试把模块安装到C:\Program Files\context这类系统路径后续普通用户运行context命令时反而因权限不足而失败。我踩过的坑是某次误点右键“以管理员身份运行”结果first-setup.bat创建了C:\Program Files\context\tree但我的日常账户没有读取该路径的权限导致所有context命令返回Permission denied。最终解决方案不是重装而是手动删除C:\Program Files\context再用普通账户重新执行第 1-4 步。提示接力安装完成后检查D:\context\tree\texmf-context\tex\context目录下是否存在cont-new.tex、cont-old.tex、cont-yes.tex三个核心格式文件。如果存在说明基础环境已就绪如果只有cont-base.tex说明模块下载未完成需再次运行first-setup.bat它会自动续传。4. 环境变量与 PATH 注册让 context 命令在任意位置生效接力安装完成后D:\context\tree\texmf-context\bin\win64Windows或~/context/tree/texmf-context/bin/unixLinux/macOS目录下已经生成了完整的可执行文件包括context.exeWindows或contextLinux/macOS。但此时你在任意终端输入context --version系统仍会返回context is not recognized as an internal or external commandWindows或command not found: contextmacOS/Linux。这不是安装失败而是环境变量尚未注入。这里有个重要认知ConTeXt 的context命令本质是一个 Perl 脚本Windows 下是.bat封装Linux/macOS 下是.pl它需要精确知道自己的“家目录”即D:\context才能定位模块、字体、缓存路径。因此不能简单地把bin目录加到 PATH而必须同时设置CONTEXTROOT环境变量指向根目录。这是 ConTeXt 区别于其他 TeX 发行版如 TeX Live的关键设计。4.1 Windows 系统的正确注册方式在 Windows 上最稳妥的方式是通过系统属性面板永久设置而非临时在 CMD 中用set命令右键“此电脑” → “属性” → “高级系统设置” → “环境变量”在“系统变量”区域点击“新建”变量名CONTEXTROOT变量值D:\context注意此处必须是你的实际根目录且不能带尾部反斜杠即D:\context\是错误的在“系统变量”中找到Path点击“编辑” → “新建”输入D:\context\tree\texmf-context\bin\win64Windows 64位如果是 32 位系统则输入D:\context\tree\texmf-context\bin\win32点击“确定”保存所有更改。关键验证关闭所有已打开的 CMD/PowerShell 窗口重新打开一个新的终端输入echo %CONTEXTROOT%应返回D:\context输入context --version应显示类似ConTeXt ver: 2025.08.01 12:34的版本信息。如果失败请检查CONTEXTROOT的值是否多了一个\这是 Windows 用户最常见的拼写错误。4.2 macOS/Linux 系统的 Bash/Zsh 配置在类 Unix 系统中需要编辑 shell 配置文件Bash 用户编辑~/.bash_profile或~/.bashrcZsh 用户编辑~/.zshrc# 在文件末尾添加以下两行 export CONTEXTROOT/Users/yourname/context # 替换为你的实际路径 export PATH/Users/yourname/context/tree/texmf-context/bin/unix:$PATH保存后在终端执行source ~/.zshrcZsh或source ~/.bash_profileBash使配置生效。验证方式同 Windowsecho $CONTEXTROOT和context --version。4.3 为什么不能跳过 CONTEXTROOT我曾尝试过“偷懒”方案不设CONTEXTROOT只把bin目录加到 PATH然后在项目目录下运行./context filename.tex用相对路径调用。短期看可行但很快暴露出致命缺陷——当你的文档使用\usemodule[t-bibliography]时ConTeXt 会尝试在CONTEXTROOT指向的texmf-context/tex/context/modules下查找模块。由于CONTEXTROOT未定义它退回到默认路径通常是/usr/local/texlive/2023/texmf-dist/tex/context/modules而那里根本没有 LMTX 的模块。结果就是! I cant find file t-bibliography.mkiv错误。这个错误不会在编译第一行就出现而是在解析到\usemodule指令时才触发排查起来极其耗时。因此CONTEXTROOT不是可选项而是 ConTeXt 运行时的“生命线”。实操心得在团队协作中建议将CONTEXTROOT的设置写入项目 README.md。例如“本项目要求 ConTeXt LMTX安装后请确保环境变量 CONTEXTROOT 指向您的 LMTX 根目录如 export CONTEXTROOT/opt/context”。这样新成员 clone 代码后能立刻意识到环境配置是项目启动的第一步而非编译失败后的补救措施。5. 首个 Hello World 的深度拆解不只是编译成功当context --version返回正确版本后别急着庆祝。真正的考验是第一个.tex文件能否成功编译。但这里有个巨大陷阱网上所有“Hello World”教程都教你写\starttext Hello World! \stoptext然后运行context hello.tex。这确实能输出 PDF但它掩盖了 ConTeXt 最核心的初始化机制。这个极简文件之所以能工作是因为 ConTeXt 在后台自动加载了cont-new.tex这个默认格式format而cont-new.tex本身又隐式调用了数十个基础模块如page,section,itemize。一旦你稍作修改比如加入\setuphead[section][stylebold]就会触发! Undefined control sequence错误——因为section模块并未显式加载。所以一个真正“生产就绪”的 Hello World必须显式声明所有依赖% hello.tex \environment environment % 加载项目级环境配置稍后详解 \usemodule[page] % 显式加载页面布局模块 \usemodule[section] % 显式加载章节结构模块 \usemodule[itemize] % 显式加载列表模块 \starttext \startsection[title{Welcome to ConTeXt LMTX}] This is your first document compiled with the modern ConTeXt engine. \stopsection \startitemize \item You are using LuaTeX as the backend engine. \item All modules are loaded explicitly for clarity. \item The \type{\environment} command links to project settings. \stopitemize \stoptext这个文件的关键在于三处设计\environment environment它告诉 ConTeXt当前文档要继承environment.tex文件中的所有设置。这个environment.tex必须与hello.tex在同一目录内容可以极简% environment.tex \enableregime[utf-8] \mainlanguage[en] \setuppapersize[A4] \setuplayout[widthmiddle, heightmiddle, backspace2.5cm, topspace2.5cm]这样做的好处是当你有十个文档时只需修改environment.tex里的\setuppapersize所有文档自动适配新纸张尺寸无需逐个文件修改。\usemodule[...]的显式声明强迫你思考“这个文档到底需要哪些能力”。page模块提供\setuplayout、\setuppagenumberingsection提供\startsection、\setupheaditemize提供\startitemize。这种显式依赖让文档具备了“可审计性”——任何人打开.tex文件一眼就能看出它依赖哪些模块便于团队代码审查。\type{...}命令的使用这是 ConTeXt 的特色命令用于在正文中显示代码片段如\environment它会自动应用等宽字体和语法高亮。在第一个文档中就用上它既是功能演示也是对后续技术写作的暗示ConTeXt 天然适合编写技术文档。编译这个增强版 Hello World 的命令是context --luatex hello.tex注意--luatex参数不可省略。如果省略LMTX 会尝试用旧引擎立即报错! LuaTeX is required for this format。成功编译后生成的hello.pdf不仅包含文字还会在页脚显示自动生成的页码来自page模块章节标题为粗体来自section模块的\setuphead设置列表项带圆点符号来自itemize模块。这才是 ConTeXt “所见即所得”的真正含义——不是 WYSIWYG 的拖拽界面而是代码与输出之间清晰、可追溯的因果链。踩坑记录我第一次编译时遇到! I cant write on file hello.log错误。排查发现是hello.tex文件被 IDE如 VS Code以只读模式锁定。解决方案关闭所有编辑器或在终端中用chmod 644 hello.tex修改文件权限。ConTeXt 编译时需要写入.log、.tuctypescript cache、.aux等临时文件任何文件锁都会导致中断。6. 模块管理与字体注册让 ConTeXt 真正为你所用安装完成、环境变量就绪、首个文档编译成功这只是 ConTeXt 工程的起点。真正的生产力提升来自于按需加载模块和无缝集成字体。这两件事决定了你的文档是“能用”还是“好用”。6.1 模块Module不是插件而是可编程的排版单元ConTeXt 的模块.mkiv文件与传统软件插件有本质区别它不是二进制黑盒而是纯文本的 ConTeXt 指令集合可以直接阅读、修改、调试。例如t-filter.mkiv模块的核心逻辑只有 20 行 Lua 代码定义了如何调用外部pygmentize程序并解析其 LaTeX 输出。这意味着当你遇到模块不满足需求时不是等待作者更新而是直接 fork 源码、修改几行、保存重编译即可。模块的安装有两种方式全局安装推荐运行context --generate命令。它会扫描CONTEXTROOT\tree\texmf-context\tex\context\modules目录下的所有.mkiv文件为每个模块生成对应的.tmatypescript map缓存文件。这是接力安装first-setup.bat自动完成的步骤无需手动干预。本地安装项目专用将模块文件如my-custom-header.mkiv直接放在项目目录下然后在.tex文件中用\usemodule[my-custom-header]加载。这种方式适合快速原型验证但不推荐长期使用——因为模块更新时你需要手动同步每个项目的副本。我强烈建议建立自己的模块仓库。例如在D:\context\my-modules下创建my-brand-colors.mkiv% my-brand-colors.mkiv \unprotect \definecolor[brand-primary][r0.117,g0.306,b0.545] % #1d4ed8 \definecolor[brand-secondary][r0.965,g0.980,b0.992] % #f6fafc \definecolor[brand-accent][r0.855,g0.251,b0.478] % #d9407a \protect然后在environment.tex中添加\usemodule[my-brand-colors]。这样所有项目都能通过\setuphead[chapter][colorbrand-primary]统一应用品牌色且颜色值只在一处定义修改成本为零。6.2 字体注册告别“字体找不到”的幽灵错误ConTeXt 对字体的处理比 LaTeX 更激进它不依赖操作系统字体缓存而是要求所有字体文件必须显式注册到 ConTeXt 的字体数据库。这意味着即使你的 Windows 系统已安装了思源黑体ConTeXt 也无法直接使用\definefontfamily[mainface][ss][Source Han Sans SC]除非你先注册它。注册流程分三步准备字体文件将.ttf或.otf文件放入CONTEXTROOT\fonts\truetypeWindows或~/context/fonts/truetypemacOS/Linux目录。例如把SourceHanSansSC-Regular.otf放入D:\context\fonts\truetype。更新字体数据库在终端运行context --make。这个命令会扫描fonts目录生成texmf-cache/fonts/conf/trees下的字体映射文件。在文档中声明在environment.tex中添加\definefontfamily[mainface][rm][Source Han Sans SC] \definefontfamily[mainface][ss][Source Han Sans SC] \definefontfamily[mainface][tt][Source Code Pro] \setupbodyfont[mainface,12pt]关键细节在于第 2 步context --make必须在字体文件放入fonts目录之后运行且每次新增字体都必须重新运行。我曾因忘记这一步在文档中写了\definefontfamily却始终编译出默认 Computer Modern 字体浪费两小时排查environment.tex语法错误最后才发现是字体未注册。实用技巧用context --listfonts | grep Source命令快速验证字体是否注册成功。如果返回空说明注册失败如果返回Source Han Sans SC regular等信息则注册成功。这个命令比翻查日志高效十倍。7. 常见故障排查链路从报错信息反推根本原因ConTeXt 的错误提示以“精准但晦涩”著称。一个! Undefined control sequence可能由十几种不同原因引发。以下是我在真实项目中总结的四大高频故障及其完整排查链路按发生概率排序7.1 故障context: command not foundLinux/macOS或context is not recognizedWindows表象终端无法识别context命令。完整排查链路检查CONTEXTROOT是否设置echo $CONTEXTROOTLinux/macOS或echo %CONTEXTROOT%Windows。若为空说明环境变量未生效检查PATH是否包含bin目录echo $PATH | grep contextLinux/macOS或echo %PATH%Windows确认D:\context\tree\texmf-context\bin\win64出现在路径中检查bin目录下是否存在可执行文件ls -l $CONTEXTROOT/tree/texmf-context/bin/unix/contextLinux/macOS或dir D:\context\tree\texmf-context\bin\win64\context.*Windows。若不存在说明接力安装未完成需重运first-setup.sh/bat检查文件权限Linux/macOSls -l $CONTEXTROOT/tree/texmf-context/bin/unix/context确认有x执行权限。若无运行chmod x $CONTEXTROOT/tree/texmf-context/bin/unix/context。根因定位90% 的案例是第 1 步CONTEXTROOT未设置或第 2 步PATH未刷新需新开终端。7.2 故障! I cant find file xxx.mkiv表象编译时提示找不到某个模块文件如t-bibliography.mkiv。完整排查链路确认模块名拼写t-bibliography不是t-biblio或bibliographyConTeXt 模块名区分连字符和大小写检查模块是否已下载进入$CONTEXTROOT/tree/texmf-context/tex/context/modules目录用find . -name *bibliography*Linux/macOS或dir /s *bibliography*Windows搜索。若无结果说明模块未安装手动触发模块安装运行context --updatet-bibliography。这个命令会强制从镜像站下载并安装指定模块检查模块缓存运行context --generate重建所有模块的.tma缓存文件。根因定位70% 的案例是模块未下载接力安装中途断网30% 是缓存损坏。7.3 故障! LuaTeX error (file xxx): Font xxx at 600 not found表象编译时提示字体缺失即使字体文件已放入fonts目录。完整排查链路确认字体文件路径ls $CONTEXTROOT/fonts/truetype/Linux/macOS或dir D:\context\fonts\truetype\Windows确认.ttf/.otf文件存在检查字体注册状态运行context --make观察输出是否包含processing font ...日志。若无说明注册未触发验证字体数据库运行context --listfonts | grep YourFontName确认字体名出现在列表中检查文档中字体名\definefontfamily[mainface][rm][Your Font Name]中的Your Font Name必须与context --listfonts输出的名称完全一致包括空格、连字符、大小写。例如Source Han Sans SC不能写成SourceHanSansSC。根因定位95% 的案例是第 2 步context --make未执行或第 4 步字体名不匹配。7.4 故障编译卡死在resolving阶段CPU 占用 100%表象运行context filename.tex后终端长时间无响应top显示context进程 CPU 占用 100%。完整排查链路检查.tex文件是否有无限循环查找\starttext ... \stoptext是否被意外注释或是否存在\doifelse{\somevariable}{true}{\dosomething}中somevariable未定义导致递归检查外部命令调用如果用了t-filter模块确认pygmentize是否已安装且在PATH中。context会阻塞等待pygmentize返回若pygmentize未安装context将无限等待检查网络代理某些企业网络会拦截context对contextgarden.net的元数据请求。运行context --verbose filename.tex观察日志中是否有resolving ...后长时间停顿。若有尝试临时关闭代理强制终止并清理缓存CtrlC中断编译然后删除项目目录下的.tuc、.log、.aux等临时文件再重试。根因定位60% 的案例是外部命令如pygmentize缺失30% 是网络代理干扰10% 是文档逻辑错误。经验总结ConTeXt 的报错信息本身是可靠的但它的“沉默”无输出比报错更危险。养成习惯任何编译异常第一反应不是改代码而是加--verbose参数重跑让日志暴露真实卡点。context --verbose会输出每一行指令的执行状态是定位问题的黄金开关。8. 项目级工作流搭建从单文件到可持续维护的文档系统安装 ConTeXt 的终点是构建一个可扩展、可协作、可自动化部署的文档工作流。这不再是个人工具配置而是团队级基础设施建设。以下是我在三个不同规模项目中沉淀出的标准化结构8.1 目录结构用约定代替配置所有项目根目录必须包含以下四个核心文件/目录形成最小可行结构my-project/ ├── environment.tex # 项目级全局设置纸张、字体、颜色、章节样式 ├── project.mkiv # 项目主文件定义文档结构和模块依赖 ├── content/ # 所有章节内容文件chapter-01.tex, chapter-02.tex... │ ├── chapter-01.tex │ └── chapter-02.tex └── assets/ # 图片、代码片段、外部数据文件 ├── diagrams/ └── code-samples/project.mkiv是灵魂所在它用 ConTeXt 的项目机制替代了传统 LaTeX 的\input堆砌% project.mkiv \startproject[title{My Product Documentation}, author{Team Docs}] \environment environment \usemodule[page] \usemodule[section] \usemodule[t-bibliography] \usemodule[t-filter] \product content/chapter-01 \product content/chapter-02 \product content/chapter-03 \stopprojectcontent/chapter-01.tex则保持纯粹内容% content/chapter-01.tex \startchapter[title{Getting Started}] This is the first chapter content. \stopchapter这种分离让协作变得简单设计师专注environment.tex的视觉规范技术作者只管content/下的.tex文件无需接触任何排版指令。8.2 自动化构建用 Makefile