如何在Quarto生成的参考文献中为特定作者设置加粗格式?
加粗实验室作者姓名:Quarto 出版物页面解决方案
我用Quarto搭建了研究组网页,其中包含实验室出版物页面。已经通过适配.csl文件满足了多数格式需求(比如按时间顺序而非字母顺序排列文献),但最后一个需求卡了壳:要把本实验室作者的姓名设为加粗格式,外部合作者姓名保持常规字重。
尝试过的无效方法
- 在.bib文件中直接使用富文本标签,例如
author = <b>Skeeter</b>,执行quarto render后,HTML文件中会输出转义后的标签<b>Skeeter</b>,无法显示为加粗效果 - 使用
\textbf{Skeeter}格式,该方法可用于标题加粗,但受作者解析排序机制限制,无法作用于作者姓名 - 改用CSL JSON格式存储文献信息,仍存在相同问题
需求说明
理想方案需同时支持将publications.qmd渲染为HTML和PDF格式,单独修改HTML文件无法解决PDF的格式适配问题。
最终解决方案
基于@shafee提供的Lua过滤器,创建bold-author.lua文件并存放在项目主目录,然后在QMD文件的YAML头部配置需要加粗的作者信息:
filters: - section-bibliographies - bold-author.lua bold-auth-name: - family: Knox given: S. H. - family: Skeeter given: J.
原过滤器存在无法匹配双名首字母作者的问题,我对其进行了小幅修改,适配了双名首字母的作者格式,修改后的Lua过滤器代码如下:
str = pandoc.utils.stringify local function highlight_author_filter(auths) return { Para = function(el) if el.t == "Para" then for k,_ in ipairs(el.content) do for key, val in ipairs(auths) do local first_part = val.family .. "," local full = val.family .. ", " .. val.given given_initials = {} for w in val.given:gmatch("%S+") do table.insert(given_initials,w) end if #given_initials == 1 then if el.content[k].t == "Str" and el.content[k].text == first_part and el.content[k+1].t == "Space" and el.content[k+2].t == "Str" and el.content[k+2].text:find(given_initials[1]) then local _,e = el.content[k+2].text:find(given_initials[1]) local rest = el.content[k+2].text:sub(e+1) el.content[k] = pandoc.Strong { pandoc.Str(full) } el.content[k+1] = pandoc.Str(rest) table.remove(el.content, k+2) end elseif #given_initials == 2 and #el.content >= k+4 and el.content[k+4].text ~= nil then if el.content[k].t == "Str" and el.content[k].text == first_part and el.content[k+1].t == "Space" and el.content[k+2].t == "Str" and el.content[k+2].text:find(given_initials[1]) and el.content[k+4].text:find(given_initials[2]) then local _,e = el.content[k+4].text:find(given_initials[2]) local rest = el.content[k+4].text:sub(e+1) el.content[k] = pandoc.Strong { pandoc.Str(full) } el.content[k+1] = pandoc.Str(rest) table.remove(el.content, k+4) table.remove(el.content, k+3) table.remove(el.content, k+2) end end end end end return el end } end local function get_auth_name(auths) return { Meta = function(m) for key, val in ipairs(m['bold-auth-name']) do local auth = { ["family"] = str(val.family), ["given"] = str(val.given) } table.insert(auths, auth) end end } end local function highlight_author_name(auths) return { Div = function(el) if el.classes:includes("references") then return el:walk(highlight_author_filter(auths)) end return nil end } end function Pandoc(doc) local bold_auth_name = {} doc:walk(get_auth_name(bold_auth_name)) return doc:walk(highlight_author_name(bold_auth_name)) end
内容的提问来源于stack exchange,提问作者June Skeeter
相关产品推荐
相关产品推荐

