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

使用pandoc API的writeEPUB3生成EPUB3时注释重复且缺失索引

问题

通过Haskell代码调用Pandoc API生成EPUB3时,输出结果与Pandoc CLI的输出不一致。最小示例中,注释虽能以弹窗形式正常显示,但会在水平线后重复出现且无索引编号,导致注释列表无法与文本关联。尝试过style.css、epub.css等样式文件但未解决问题,且不清楚写入器的样式文件搜索路径。现咨询以下问题:

  1. 如何配置样式仅保留弹窗注释?
  2. 如何同时保留弹窗注释与带索引的注释?
  3. 能否用标题替换注释前的水平线?

使用pandoc -o note.epub c6note.md可生成仅含弹窗注释的EPUB,示例Markdown代码:

---
title: a single note 
---

a single note [^3] here 

[^3]: the note!

测试用Haskell代码:

import Text.Pandoc  
import Data.ByteString.Lazy (toStrict)
import qualified Data.Text as T
import System.IO (writeFile)
import qualified Data.ByteString.Lazy as BL
import qualified Text.Pandoc.Class as PC

main :: IO ()
main = do
    mdfile   <- readFile "c6note.md"  
    let readerOpts = def { readerExtensions = enableExtension Ext_footnotes (readerExtensions def) }    
    res <- runIO  $ do 
        pan1 <-  readMarkdown readerOpts (T.pack mdfile)   
        ep3p  <- writeEPUB3 def pan1
        return ep3p
    case res of 
        Left err -> putStrLn . show $ err 
        Right ep -> 
                BL.writeFile "c6note.epub" ep

解答

1. 仅保留弹窗注释

Pandoc CLI默认启用弹窗脚注,API调用需显式配置写入器选项。修改writeEPUB3的参数,设置writerEPUBFootnoteStyle为EPUBFootnoteStylePopup,即可与CLI行为一致,仅保留弹窗注释,不再生成文末重复的无索引注释列表:

import Text.Pandoc.Writers.EPUB (EPUBFootnoteStyle(EPUBFootnoteStylePopup))

-- 主函数中修改写入器选项部分
let epubWriterOpts = def { writerEPUBFootnoteStyle = EPUBFootnoteStylePopup }
ep3p <- writeEPUB3 epubWriterOpts pan1

2. 同时保留弹窗注释与带索引的注释

要实现弹窗和文末带索引注释共存,需调整写入器选项并配合自定义样式:

  1. 配置写入器选项:设置脚注样式为文末注释,同时指定索引编号样式,并关联自定义样式文件:
import Text.Pandoc.Writers.EPUB (EPUBFootnoteStyle(EPUBFootnoteStyleEndnotes))
import Text.Pandoc.Footnotes (NumberStyle(NumberStyleArabic))

let epubWriterOpts = def { 
        writerEPUBFootnoteStyle = EPUBFootnoteStyleEndnotes,
        writerFootnoteOptions = def { footnoteOptionNumberStyle = NumberStyleArabic },
        writerEPUBStylesheet = Just "style.css" -- 指定样式文件路径,需放在代码运行目录下
    }
  1. 编写style.css:添加弹窗功能样式,让脚注引用悬停时显示注释内容:
a.footnote-ref {
    position: relative;
}
a.footnote-ref:hover::after {
    content: attr(data-footnote);
    position: absolute;
    bottom: 120%;
    left: 0;
    background-color: #ffffff;
    border: 1px solid #cccccc;
    border-radius: 4px;
    padding: 6px 10px;
    z-index: 10;
    width: 280px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

3. 用标题替换注释前的水平线

通过样式隐藏默认水平线,再给脚注列表添加自定义标题:

  1. 修改style.css:隐藏默认的脚注分隔水平线:
hr.footnotes-sep {
    display: none;
}
  1. 配置写入器选项:给脚注列表添加前缀标题,比如“注释”:
let epubWriterOpts = def { 
        writerEPUBFootnoteStyle = EPUBFootnoteStyleEndnotes,
        writerFootnoteOptions = def { 
            footnoteOptionNumberStyle = NumberStyleArabic,
            footnoteOptionPrefix = Just "<h2 class=\"footnote-title\">注释</h2>"
        },
        writerEPUBStylesheet = Just "style.css"
    }

可额外在样式文件中给标题添加自定义样式:

h2.footnote-title {
    font-size: 1.2em;
    margin-top: 2em;
    margin-bottom: 1em;
    color: #333333;
}

内容的提问来源于stack exchange,提问作者user855443

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 22:23:11