LaWrite
一款基于模板的所见即所得学术论文编辑器——你只需撰写内容,模板保证排版,导出的 .zip 文件可直接提交。
- 类型
- 网站
- 角色
- 独立开发
- Status
- 进行中
- Tech
- Next.js 16 Lexical React 19 TypeScript Tailwind v4 Radix UI KaTeX Framer Motion JSZip next-intl Playwright
- Started
- 2026年2月
LaWrite 是一款基于 Next.js 和 Lexical 构建的模板优先学术论文编辑器。你选择一个预设模板(APA 第 7 版、IEEE 等),专注于撰写内容,然后导出一个 .zip 文件,其中的 LaTeX 源码会与模板的排版完全匹配。
核心理念:你只负责写内容。模板保证排版。导出即可提交。
用户流程
首页 → 模板选择 → 编辑器 → 导出 .zip(准备提交)
↑ |
└── 仪表盘 ←───────────┘
(管理现有文档,创建新文档)
1. 选择模板 (/{locale}/templates) — 从 public/templates/{id}/starter.zip 加载预设,自动创建一个项目,进入编辑器。
2. 编辑 (/app/editor/[projectId]) — 可视化结构 + 内容编辑(标题、段落、表格、图片、数学公式)。编辑器不会尝试预览精确的打印布局;它保证结构的完整性。每 2 秒防抖自动保存到 IndexedDB。
3. 导出 — 生成包含 .tex 文件和图片的 .zip。导出的 LaTeX 严格遵循所选模板的前言、文档类和钩子。100% 语义完整性。
4. 仪表盘 (/app/dashboard) — 项目的网格/列表视图,继续编辑、从模板创建新项目、搜索、删除。
预设模板
| 模板 | 文档类 | 字体 | 页边距 | 状态 |
|---|---|---|---|---|
| APA 第 7 版 | apa7 | 12pt | 1in | 已启用 |
| 通用文章 | article | 11pt | 1in | 进行中 |
| CTex 中文排版 | ctexart | 12pt | 25mm | 进行中 |
每个模板都附带自己的前言、元数据字段定义(驱动标题页表单)、导出钩子、一套 LaTeX↔Lexical 转换规则集,以及一个初始 .zip 文件。
可扩展性:无需编写组件即可注册新模板
TitlePage 和 Abstract 是由元数据定义驱动的通用组件。添加新模板只需三步,无需编写 React 代码:
- 在
src/templates/definitions/下创建一个TemplateDefinition对象(包含前言、元数据字段、导出钩子)。 - 在
src/lib/registerTemplates.ts中注册它。 - 将
starter.zip放入public/templates/{id}/目录。
就这样。你在 metadata.fields 中声明的字段会自动出现在标题页表单中(inputType: 'textarea' 会渲染为多行输入框)。前言、包以及 \maketitle / \printbibliography 钩子驱动着导出的 LaTeX。
技术栈
- 框架:Next.js 16.1.6(使用 Turbopack)
- 编辑器核心:Lexical 0.39.0
- UI:React 19, Tailwind v4, Radix UI
- 数学公式:KaTeX 0.16.28
- 动效:Framer Motion 12
- 文件处理:JSZip 3.10.1
- 国际化:next-intl 4.8.1
- 端到端测试:Playwright 1.58.1
亮点
- 基于模式的标题页 — 无需为每个模板编写 React 组件。
metadata.fields数组描述表单,一个通用组件负责渲染。添加 IEEE、NeurIPS、ACM SIG 等模板只需修改配置。 - 语义优先编辑,而非视觉优先 — 编辑器专注于正确的文档结构。排版布局推迟到导出时由模板的 LaTeX 前言处理。这与 Overleaf 的实时预览方法相反,但这是正确的权衡:你不可能意外破坏出版商强制要求的间距规则。
- 离线优先 — 每 2 秒自动保存到 IndexedDB,意味着你可以在飞机上写作,落地后导出功能依然可用。