You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:30:56