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

如何在Quarto生成的参考文献中为特定作者设置加粗格式?

加粗实验室作者姓名:Quarto 出版物页面解决方案

我用Quarto搭建了研究组网页,其中包含实验室出版物页面。已经通过适配.csl文件满足了多数格式需求(比如按时间顺序而非字母顺序排列文献),但最后一个需求卡了壳:要把本实验室作者的姓名设为加粗格式,外部合作者姓名保持常规字重。

尝试过的无效方法

  • 在.bib文件中直接使用富文本标签,例如 author = <b>Skeeter</b>,执行quarto render后,HTML文件中会输出转义后的标签&lt;b&gt;Skeeter&lt;/b&gt;,无法显示为加粗效果
  • 使用\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:27:50