跳转至

实时 TeX 预览(rtex)

基于 realtime-tex 0.0.5 的 LuaLaTeX 边打边看预览。编辑 .tex 时,当前段落由常驻 live engine 重排并回传 display list,整页/分页/交叉引用由后台完整编译更新。

范围

  • 仅 LuaLaTeX:TextEditor 工具栏的实时预览按钮只在引擎选择为 lualatex 时出现。
  • 仅 本地 Vault:rtex 需要本地 lualatex 子进程;远程 Vault / iOS / Android 不可用(模块按 target gate 掉)。
  • 正式 PDF 仍走 latexmk;实时预览是独立 tab,和编译 PDF 共用 root 输出路径。

Host 结构

src-tauri/src/features/rtex/

文件 作用
mod.rs RtexSessions(按 root 的会话表)、命令、事件转发、资源读取 allow-list
rtex_start 打开 Session,一个 root 一个会话;事件线程 poll(32ms) 后 emit_to("rtex:event")
rtex_edit / rtex_set_document 编辑器增量 / 全量同步(UTF-8 字节区间)
rtex_status lualatex + support files 检测
rtex_kpsewhich / rtex_read_tex_file 渲染器取字体/map/图片/layout PDF;只允许 kpsewhich 结果、项目根、.agentero/rtex、TeX Live 根

依赖:rtex-core(git tag v0.0.5,src-tauri/Cargo.toml),仅桌面非移动 target 编译。support files 从 realtime-tex/tex 复制到 src-tauri/rtex/tex,由 bundle.resources 打包;运行时设置 RTEX_TEXDIR。GUI 的 PATH 不含 TeX Live,prepare_environment 还会设置 RTEX_TEXLIVE_BIN 并把它的 bin 目录前置到 PATH。

build_dir 固定为 <vault>/.agentero/rtex/<root-hash>:.agentero 已被文件树、watcher、sync 和 LaTeX root 反向扫描忽略,后台 pass 的 aux/PDF 不会污染项目或触发刷新。

前端

src/lib/tex-live/

  • session.ts:会话表(root → session)、编辑器注册、文件 → session 映射、编辑队列。
  • byte-index.ts:CodeMirror UTF-16 偏移 → rtex UTF-8 字节偏移。按行缓存;一次 transaction 的所有 change 用旧文档计算后倒序发送。

src/components/viewer/texlive/

  • tex-live-viewer.tsx:画布预览、缩放/滚动、状态、PDF fallback。
  • render/render.ts、model.ts、type1.ts 移植自 realtime-tex 的 VS Code 插件(MIT);resources.ts 改为走上面的 Tauri 命令。

事件:

事件 处理
LayoutUpdate PreviewModel.applyLayout;更新页数/placement;加载字体/图片;degraded 页读 pdf_fallback
ParagraphUpdate 覆盖当前 unit;pagination_stale 等下一轮 layout 修正
EngineState / BackgroundScheduled 状态栏;不当作错误
Diagnostics 预览状态栏计数(后续可接 lint footer)

打开流程

  1. 编译引擎下拉选择「实时编译」(同时切到 LuaLaTeX),或点 .tex 编辑器工具栏的实时预览按钮。
  2. openTexLive flush 编辑器 → resolveTexRoot。
  3. 打开/复用 root PDF tab,置 texLive: true(texRoot 记录 .tex)。
  4. 预览组件启动 rtex_start,挂载编辑器并 set_document;之后每次 change 走 rtex_edit。
  5. 显式编译(文件树编译按钮 / 编译快捷键)通过 openTexPdf 清掉 texLive 回到编译 PDF;手动 ⌘S 的静默编译在 live tab 下跳过。

限制与排查

  • rtex 0.0.5 API/display list 仍可能变;升级时固定 tag 并核对 display-list.md。
  • 首次 session 要等完整 pass(小文档约 1–3 s,字体缓存冷启动更久);之后段落约毫秒级。
  • TikZ/旋转页/RTL 由 display list 无法完整描述,页面走 layout PDF;缺失字体也会降级。
  • 中文/ctex/luatexja 需要实测字体解析与速度。
  • 预览画布目前无文本选择/搜索;需要这些能力时切回编译 PDF。