LaWrite

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 首页主视觉

LaWrite 是一款基于 Next.js 和 Lexical 构建的模板优先学术论文编辑器。你选择一个预设模板(APA 第 7 版、IEEE 等),专注于撰写内容,然后导出一个 .zip 文件,其中的 LaTeX 源码会与模板的排版完全匹配。

核心理念:你只负责写内容。模板保证排版。导出即可提交。

用户流程

首页 → 模板选择 → 编辑器 → 导出 .zip(准备提交)
              ↑                     |
              └── 仪表盘 ←───────────┘
                 (管理现有文档,创建新文档)

1. 选择模板 (/{locale}/templates) — 从 public/templates/{id}/starter.zip 加载预设,自动创建一个项目,进入编辑器。

2. 编辑 (/app/editor/[projectId]) — 可视化结构 + 内容编辑(标题、段落、表格、图片、数学公式)。编辑器不会尝试预览精确的打印布局;它保证结构的完整性。每 2 秒防抖自动保存到 IndexedDB。

LaWrite 编辑器视图,显示正在撰写的论文

3. 导出 — 生成包含 .tex 文件和图片的 .zip。导出的 LaTeX 严格遵循所选模板的前言、文档类和钩子。100% 语义完整性。

4. 仪表盘 (/app/dashboard) — 项目的网格/列表视图,继续编辑、从模板创建新项目、搜索、删除。

预设模板

模板文档类字体页边距状态
APA 第 7 版apa712pt1in已启用
通用文章article11pt1in进行中
CTex 中文排版ctexart12pt25mm进行中

每个模板都附带自己的前言、元数据字段定义(驱动标题页表单)、导出钩子、一套 LaTeX↔Lexical 转换规则集,以及一个初始 .zip 文件。

可扩展性:无需编写组件即可注册新模板

TitlePage 和 Abstract 是由元数据定义驱动的通用组件。添加新模板只需三步,无需编写 React 代码:

  1. src/templates/definitions/ 下创建一个 TemplateDefinition 对象(包含前言、元数据字段、导出钩子)。
  2. src/lib/registerTemplates.ts 中注册它。
  3. 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,意味着你可以在飞机上写作,落地后导出功能依然可用。