使用pandoc API的writeEPUB3生成EPUB3时注释重复且缺失索引
问题
通过Haskell代码调用Pandoc API生成EPUB3时,输出结果与Pandoc CLI的输出不一致。最小示例中,注释虽能以弹窗形式正常显示,但会在水平线后重复出现且无索引编号,导致注释列表无法与文本关联。尝试过style.css、epub.css等样式文件但未解决问题,且不清楚写入器的样式文件搜索路径。现咨询以下问题:
- 如何配置样式仅保留弹窗注释?
- 如何同时保留弹窗注释与带索引的注释?
- 能否用标题替换注释前的水平线?
使用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. 同时保留弹窗注释与带索引的注释
要实现弹窗和文末带索引注释共存,需调整写入器选项并配合自定义样式:
- 配置写入器选项:设置脚注样式为文末注释,同时指定索引编号样式,并关联自定义样式文件:
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" -- 指定样式文件路径,需放在代码运行目录下 }
- 编写
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. 用标题替换注释前的水平线
通过样式隐藏默认水平线,再给脚注列表添加自定义标题:
- 修改
style.css:隐藏默认的脚注分隔水平线:
hr.footnotes-sep { display: none; }
- 配置写入器选项:给脚注列表添加前缀标题,比如“注释”:
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
相关产品推荐
相关产品推荐

