Skip to content

[0628] 修复 frame 和 framed 结构 LaTeX 导出的递归转译问题#3557

Open
JackYansongLi wants to merge 5 commits into
mainfrom
jacky/200_27/fix_frame_export_0628
Open

[0628] 修复 frame 和 framed 结构 LaTeX 导出的递归转译问题#3557
JackYansongLi wants to merge 5 commits into
mainfrom
jacky/200_27/fix_frame_export_0628

Conversation

@JackYansongLi
Copy link
Copy Markdown
Contributor

@JackYansongLi JackYansongLi commented May 28, 2026

[0628] 修复 frame 递归转译问题,并重构 framed 块级与行内 LaTeX 导出

相关文档

  • 0605.md - 参考的 stack 到 substack LaTeX 导出任务文档

任务相关的代码文件

  • TeXmacs/progs/convert/latex/tmtex.scm
  • TeXmacs/plugins/latex/progs/convert/latex/tmtex.scm
  • TeXmacs/progs/convert/latex/latex-drd.scm
  • TeXmacs/plugins/latex/progs/convert/latex/latex-drd.scm
  • TeXmacs/progs/convert/latex/latex-command-drd.scm
  • TeXmacs/plugins/latex/progs/convert/latex/latex-command-drd.scm
  • TeXmacs/tests/0628.scm
  • TeXmacs/tests/tex/0628_frame_export.tex
  • TeXmacs/tests/tmu/0628.tmu

如何测试

确定性测试(单元与集成测试)

xmake run 0628

非确定性测试(文档验证)

  1. 打开 Mogan STEM,导入 TeXmacs/tests/tmu/0628.tmu
  2. 导出为 LaTeX,确认 frameframed(包含块级和行内装饰)均能完美、安全地导出。

如何提交

提交前执行以下最少步骤:

一个 PR 至少分为两个 commit:

  1. 第一个 commit 更新 devel/0628.md 任务文档
  2. 第二个 commit 为代码改动(包含测试与实现)
xmake run 0628

What

  1. 修复 frame 结构在导出 LaTeX 时其内部子节点没有被递归转译的问题。
  2. 重构 framed 的 LaTeX 导出,在行内时自动输出为标准的 \fbox,在块级(段落)时直接输出为标准的 mdframed 环境(\begin{mdframed} ... \end{mdframed})。
  3. 彻底避免在导出的 LaTeX 导言区中生成非标准的自定义宏(如 tmframed 及其 \newmdenv 定义)。

Why

  • 对于 frame:原本的实现直接把 (car l) 作为 fbox 的内容输出,而没有调用 (tmtex (car l)) 进行递归转译。当 frame 内包含数学公式等标签时,子节点的内容会被直接输出为原始 s-expression tree,导致生成的 LaTeX 代码报错崩溃。
  • 对于 framed:以往的实现会为 framed 创建自定义的 tmframed 宏并通过 \newmdenv 定义在 LaTeX 导言区。然而,这对于 LaTeX 用户来说极其不友好(污染了导言区且代码冗余)。同时,如果将 framed 作为行内标签使用,生成块级环境 \begin{tmframed} 会导致段落换行破坏排版。

How

  1. 修改 tmtex-frame,使其对子节点使用 (tmtex (car l)) 进行正确的递归转译:
    (define (tmtex-frame s l)
      `(fbox ,(tmtex (car l)))
    )
  2. 重构 tmtex-ornamented。当匹配到 "framed" 时,如果其子节点不以 documentpara 等块级标记开头,则识别为行内并转译为标准的行内 fbox;如果是块级,则直接翻译为标准的 mdframed 环境,剔除自定义 tmframed 的生成:
    (define (tmtex-ornamented s l)
      (if (== s "framed")
          (if (not (and (pair? (car l)) (in? (caar l) '(document para))))
              `(fbox ,(tmtex (car l)))
              `((!begin "mdframed") ,(tmtex (car l)))
          )
          ...
      )
    )
  3. latex-command-drd.scm 中注册 begin-mdframed 作为合法环境,并在 latex-drd.scmlatex-needs% 依赖映射表中注册其与 "mdframed" 宏包的关联,使得导出时能够完美、自动地在导言区引入 \usepackage{mdframed}

@JackYansongLi JackYansongLi changed the title [0628] 修复 frame 结构 LaTeX 导出的递归转译问题 [0628] 修复 frame 和 framed 结构 LaTeX 导出的递归转译问题 May 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant