在Pandoc中生成引用时突出显示一位特定作者

时间:2019-07-03 15:34:42

标签: latex pandoc biblatex pandoc-citeproc

我正在使用Pandoc为我的网站生成出版物列表。我仅将其用于与出版物一起生成html,以便随后可以将原始html粘贴到jekyll中。这部分工作正常。

当我tty生成html以便我的名字在所有条目中显示为黑体字时,就会出现复杂问题。我正在尝试为此使用this solution,当我将其应用于要生成的纯Latex文档时,它可以工作。但是,当我尝试应用相同的Pandoc时,会生成没有任何黑体字的html。

这是我的Pandoc文件:

---
bibliography: /home/tomas/Dropbox/cv/makerefen4/selectedpubs.bib
nocite: '@'
linestretch: 1.5
fontsize: 12pt
header-includes: |
    \usepackage[
    backend=biber,
    dashed=false,
    style=authoryear-icomp,
    natbib=true,
    url=false,
    doi=true,
    eprint=false,
    sorting=ydnt, %Year (Descending) Name Title
    maxbibnames=99
    ]{biblatex}
    \renewcommand{\mkbibnamegiven}[1]{%
      \ifitemannotation{highlight}
        {\textbf{#1}}
        {#1}}
    \renewcommand*{\mkbibnamefamily}[1]{%
      \ifitemannotation{highlight}
        {\textbf{#1}}
        {#1}}
...

这是我的Makefile的相关部分:

PANDOC_OPTIONS=--columns=80    
PANDOC_HTML_OPTIONS=--filter=pandoc-citeproc --csl=els-modified.csl --biblatex
再次:此代码可以很好地生成引用。它只是没有按照预期的方式加粗字体。

有什么想法吗?

编辑

围兜条目看起来像这样

@MISC{test,
  AUTHOR    = {Last1, First1 and Last2, First2 and Last3, First3},
  AUTHOR+an = {2=highlight},
}

版本是  -Biblatex 3.12  -Biber 2.12

1 个答案:

答案 0 :(得分:1)

您可以使用 lua 过滤器来修改 AST。以下内容对我有用,可以在参考文献 (see here) 中突出显示姓氏和首字母 (Smith, J.)。您可以用 pandoc.Underline 或 pandoc.Emph 替换 pandoc.Strong。用您的姓名/首字母替换 Smith 和 J.,将其另存为 myname.lua 并使用以下内容:

pandoc --citeproc --bibliography=mybib.bib --csl.mycsl.csl --lua-filter=myname.lua -o refs.html refs.md 

即把过滤器放在最后。

local highlight_author_filter = {
  Para = function(el)
    if el.t == "Para" then
    for k,_ in ipairs(el.content) do
      if el.content[k].t == "Str" and el.content[k].text == "Smith,"
      and el.content[k+1].t == "Space"
      and el.content[k+2].t == "Str" and el.content[k+2].text:find("^J.") then
          local _,e = el.content[k+2].text:find("^J.")
          local rest = el.content[k+2].text:sub(e+1) 
          el.content[k] = pandoc.Strong { pandoc.Str("Smith, J.") }
          el.content[k+1] = pandoc.Str(rest)
          table.remove(el.content, k+2) 
      end
    end
  end
  return el
  end
}

function Div (div)
  if 'refs' == div.identifier then
    return pandoc.walk_block(div, highlight_author_filter)
  end
  return nil
end

注意事项:

  1. 如果您使用作者日期格式 csl,则上述方法有效。如果您想使用数字格式 csl(例如 ieee.csl 或自然.csl),您需要在过滤器中用 Span 替换 Para,即:
  Span = function(el)
    if el.t == "Span" then
  1. 如果您还想使用 multiple-bibliographies lua filter,它应该放在作者高亮过滤器之前。并且 'refs' 应该是 'refs_biblio1' 或 'refs_biblio2' 等,具体取决于您如何定义它们:
function Div (div)
  if 'refs' or 'refs_biblio1’ or 'refs_biblio2’ == div.identifier then

对于pdf输出,如果您使用数字格式csl,您还需要在pandoc命令中添加-V csl-refs

  1. 如果按照 csl 的顺序格式化,过滤器会突出显示 Smith, J.。一些 csl 会为第一作者使用这种格式,然后切换到 J. Smith 使用其他格式,因此您必须相应地调整过滤器,添加额外的 if el.content[k].t == "Str”…etc。首先转换为 .json 有助于检查 AST 中的格式是否正确。