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

如何为Jekyll站点开发处理BibTeX的自定义Liquid标签?

我来帮你搞定这个Jekyll自定义标签的需求,直接上可运行的代码和细节解释:

Jekyll自定义BibTeX处理标签实现

首先,把下面的代码放到你的Jekyll站点的_plugins目录下(没有的话新建一个),命名为bibtex_process_tag.rb:

module Jekyll
  class RenderBibTag < Liquid::Tag
    def initialize(tag_name, input, tokens)
      super
      # 清理输入的BibTeX字符串,去掉两端空白
      @raw_bibtex = input.strip
    end

    def render(context)
      # 复制原始字符串,避免修改原数据
      processed_bib = @raw_bibtex.dup

      # 这里可以根据你的需求添加替换/删除逻辑,举几个实用例子:
      ## 1. 删除指定字段(比如示例中的pages字段)
      processed_bib.gsub!(/,\s*pages=\{[^\}]+\}/, '')

      ## 2. 替换字段内容(比如修改期刊名称)
      processed_bib.gsub!(/journal=\{Putting the pieces together\}/, 'journal={Component-Based Software Engineering: Putting the Pieces Together}')

      ## 3. 给指定字段添加HTML格式(比如作者名加粗,适合网页展示)
      processed_bib.gsub!(/author=\{([^\}]+)\}/, 'author={<strong>\1</strong>}')

      # 把处理后的内容包裹成代码块,方便网页展示
      "<pre><code>#{processed_bib}</code></pre>"
    end
  end
end

# 注册标签,这样就能在模板/Markdown里调用了
Liquid::Template.register_tag('process_bib', Jekyll::RenderBibTag)

怎么使用这个标签?

在你的Markdown文章或者Jekyll模板里,直接用{% process_bib %}标签包裹你的BibTeX字符串就行:

{% process_bib @article{heineman2001component, title={Component-based software engineering}, author={Heineman, George T and Councill, William T}, journal={Putting the pieces together}, pages={5}, year={2001} } %}

关键细节解释

  • 初始化方法:initialize里通过super调用Liquid标签的父类初始化逻辑,然后把输入的BibTeX字符串清理后存为实例变量,供后面的处理使用。
  • 核心处理逻辑:render方法是标签的核心,这里用Ruby的gsub!方法结合正则表达式来实现替换和删除:
    • 删除字段的正则匹配了字段前的逗号和空白,确保删除后BibTeX格式不会混乱;
    • 替换字段内容可以精确匹配原始值,也可以用更灵活的正则匹配相似内容;
    • 如果需要生成网页格式的内容,可以给字段添加HTML标签,比如粗体、斜体。
  • 标签注册:最后一行Liquid::Template.register_tag把我们的标签类和process_bib这个调用名绑定,这样Jekyll就能识别这个自定义标签了。

进阶建议:用专业库处理复杂BibTeX

如果你的BibTeX条目有复杂的嵌套、特殊字符或者需要更严谨的解析,推荐用bibtex-ruby库来处理,比正则更可靠:

  1. 先在你的站点Gemfile里添加依赖:
gem 'bibtex-ruby'

然后运行bundle install安装。

  1. 修改标签代码为:
module Jekyll
  class RenderBibTag < Liquid::Tag
    require 'bibtex'

    def initialize(tag_name, input, tokens)
      super
      @raw_bibtex = input.strip
    end

    def render(context)
      # 用bibtex-ruby解析BibTeX字符串
      bib_entry = BibTeX.parse(@raw_bibtex).first

      # 删除pages字段
      bib_entry.delete(:pages)

      # 修改journal字段
      bib_entry[:journal] = 'Component-Based Software Engineering: Putting the Pieces Together'

      # 返回处理后的纯BibTeX字符串(或者包裹成HTML代码块)
      "<pre><code>#{bib_entry.to_s}</code></pre>"
    end
  end
end

Liquid::Template.register_tag('process_bib', Jekyll::RenderBibTag)

这种方法能精准处理各种BibTeX字段,不用担心正则匹配不到的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:36:30