如何在Quarto网站的JSON数据中使用Markdown?
解决Quarto动态闪卡中Markdown/LaTeX无法渲染的问题
核心问题在于:Quarto的Markdown和LaTeX解析是编译阶段静态处理的,而你通过JavaScript动态插入DOM的文本,不会触发Quarto的解析流程,所以需要手动在前端完成Markdown转HTML和LaTeX渲染。
具体实现步骤
1. 引入前端Markdown解析库
选择轻量的marked.js解析Markdown文本(可下载到本地或使用CDN引入),在.qmd文件的include-after-body中添加引入:
--- format: html: include-after-body: - text: | <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script src = "flashcards.js"></script> <script src = "reveal.js"></script> ---
2. 修改reveal.js,加入Markdown解析和MathJax渲染
更新getRandomCard函数,用marked()解析闪卡的Markdown内容,插入DOM后触发MathJax重新渲染公式:
const question = document.querySelector('.question'); const answer = document.querySelector('.answer'); const check = document.querySelector('.check'); const next = document.querySelector('.next'); let card = -1; let solution = false; // 配置marked,启用GitHub风格Markdown解析 marked.setOptions({ breaks: true, gfm: true }); function getRandomCard() { let random; do { random = Math.floor(Math.random() * flashcards.length); } while (card == random); card = random; // 解析Markdown为HTML并插入DOM question.innerHTML = marked.parse(flashcards[card].Q); answer.innerHTML = marked.parse(flashcards[card].A); // 触发MathJax重新渲染LaTeX公式 if (window.MathJax) { MathJax.typeset([question, answer]); } } // 事件监听逻辑保持不变 check.addEventListener('click', function() { if (solution) { answer.style.display = 'none'; solution = false; } else { answer.style.display = 'block'; solution = true; } }); next.addEventListener('click', function() { answer.style.display = 'none'; solution = false; getRandomCard(); });
3. 处理JSON中的转义问题
在flashcards.js的JSON数据中,特殊字符需正确转义:
- 双引号用
\"转义 - 反斜杠用
\\转义 - LaTeX公式中的反斜杠需转义,比如
\alpha要写成\\alpha
示例flashcards.js:
var flashcards = [ { "Q":"**front1** $a^2$ $b + a$ [link](destination.qmd)", "A":"**back1** $\\alpha + \\beta = \\gamma$" }, { "Q":"front2", "A":"back2" } ]
为什么直接插入HTML无效?
你之前尝试直接插入Quarto编译后的HTML失败,原因是JSON字符串中的双引号冲突:HTML里的<a href="destination.qmd">中的双引号会和JSON键值对的双引号冲突,导致语法错误。用Markdown解析库可避免手动转义的麻烦,同时自动处理所有Markdown语法。
内容的提问来源于stack exchange,提问作者Lennart Oelschläger
相关产品推荐
相关产品推荐

