如何在 biblatex 中为整个 bibitem 加下划线?

如何在 biblatex 中为整个 bibitem 加下划线?

我想在使用 biblatex 时为整个 bibitem 加下划线。我试过了\AtEveryBibitem{\uline},但失败了。

我想做的事:

强调

答案1

这对于 来说会非常困难,biblatex因为\uline无法处理其参数中的复杂宏。但由于 的biblatex工作方式,我们不可避免地最终会将极其复杂的宏输入\uline。像 这样的简单事情\uline{\printtext{foo}}似乎工作正常,但当\uline{\printfield{title}}标题要用引号排版时已经中断。即使使用 ,一切都变得一团糟,换行失败(因为分组)\uline{\printnames{author}\setunit{\addspace}\printfield[emph]{title}}。 的“真正”参数\uline将复杂得多。

所以我猜这是 BibTeX 可以做得更好的情况之一。.bst文件的工作方式意味着\uline几乎可以直接对原始文本进行操作。如果我们另外避免分组和其他字体格式化命令,我们可以得到相当令人满意的结果。

大多数文件的总体思路是相似的.bst,但实际实现当然有所不同。在https://gist.github.com/moewew/4a4beb11a35ed43541cc8f238f7deca8plain.bst您可以找到对整个条目进行下划线的修改版本。

主要工作是通过将函数替换output.bibitem

FUNCTION {output.bibitem}
{ newline$
  "\bibitem{" write$
  cite$ write$
  "}" write$
  newline$
  "\uline{" write$
  ""
  before.all 'output.state :=
}

新线路刚刚好"\uline{" write$

函数fin.entry已更改为

FUNCTION {fin.entry}
{ add.period$
  write$
  "}" write$
  newline$
}

这里,"}" write$是新的。

在链接文件中,该emphasize函数变为无操作,所有其他引用\em也已被删除。这避免了分组并允许ulem正确换行。

将新文件另存为plain-ul.bst并使用如下方法

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[normalem]{ulem}

%\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
  author  = {Humphrey Appleby},
  title   = {On the Importance of the Civil Service and a very very very very long subtitle that hopefully shows us a line break},
  year    = {1980},
  publisher = {BBC},
}
\end{filecontents}

\begin{document}
\cite{appleby}
\bibliographystyle{plain-ul}
\bibliography{\jobname}
\end{document}

在此处输入图片描述


如果您想继续使用,biblatex您可能需要研究其他方法来产生下划线。我猜这种方法ulem注定会失败(至少如果您不使用低级命令重写参考书目驱动程序)。

正如 Ulrike 在评论中所建议的,LuaLaTeX 也许可以在这里为您提供帮助。

更新

现在有了 Marcel Krüger 的lua-ul套件,事情就变得简单多了。

\documentclass[british]{article}
\usepackage{fontspec}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}

\usepackage{lua-ul}

\makeatletter
% internal name from lua-ul
\AtEveryBibitem{\@underLine}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
\underLine{Lorem} ipsum \underLine{dolor} sit amet.
\cite{sigfridsson,worman,nussbaum,geer}
\printbibliography
\end{document}

Paul Isambert 的 TUGboat 文章使用 LuaTeX 可以做三件事,否则会非常痛苦实现了下划线,在这里我们也可以使用它。经过一些修改,这个八年前的代码仍然有效,并且给了我们

\documentclass[british]{article}
\usepackage{fontspec}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}

\addbibresource{biblatex-examples.bib}

\newattribute{\ulattr}

\usepackage{luacode}
\begin{luacode}
local HLIST = node.id("hlist")
local RULE = node.id("rule")
local GLUE = node.id("glue")
local KERN = node.id("kern")
local ULATTR = luatexbase.attributes["ulattr"]

function get_lines(head)
  for line in node.traverse_id(HLIST, head) do
    underline(line.list, line.glue_order,
      line.glue_set, line.glue_sign)
  end
  luatexbase.remove_from_callback("post_linebreak_filter",
                                  "get_lines")
  return head
end

local function good_item(item)
  if item.id == GLUE and
    (item.subtype == node.subtype("leftskip")
     or item.subtype == node.subtype("rightskip")
     or item.subtype == node.subtype("parfillskip")) then
      return false
  else
    return true
  end
end

function underline(head, order, ratio, sign)
  local item = head
  while item do
    if node.has_attribute(item, ULATTR)
      and good_item(item) then
        local item_line = node.new(RULE)
        item_line.depth = tex.sp("1.4pt")
        item_line.height = tex.sp("-1pt")
        local end_node = item
        while end_node.next and
          good_item(end_node.next) and
          node.has_attribute(end_node.next, ULATTR) do
            end_node = end_node.next
        end
        item_line.width = node.dimensions
          (ratio, sign, order, item, end_node.next)
        local item_kern = node.new(KERN, 1)
        item_kern.kern = -item_line.width
        node.insert_after(head, end_node,        
                          item_kern)
        node.insert_after(head, item_kern,
                          item_line)
        item = end_node.next
    else
      item = item.next
    end
  end
end
\end{luacode}

\newcommand{\luaunderline}[1]{%
  \quitvmode
  \setattribute{\ulattr}{1}%
  #1%
  \unsetattribute{\ulattr}%
  \directlua{%
    luatexbase.add_to_callback("post_linebreak_filter",
                               get_lines, "get_lines")}%
}

\newcommand{\luaunderlineswitch}{%
  \quitvmode\setattribute{\ulattr}{1}%
  \directlua{%
    luatexbase.add_to_callback("post_linebreak_filter",
                               get_lines, "get_lines")}%
}

\renewbibmacro{begentry}{\begingroup\luaunderlineswitch}
\renewbibmacro{finentry}{\finentrypunct\endgroup}

\begin{document}
\luaunderline{Lorem} ipsum {\luaunderlineswitch dolor} sit amet.
\cite{sigfridsson,worman,nussbaum,geer}
\printbibliography
\end{document}

在此处输入图片描述

非常感谢乌尔丽克·菲舍尔在评论中提出了许多改进建议,并通过这些改进帮助我更好地理解代码。


许多人(尤其是本网站上的许多人)认为下划线是打字机时代的遗留,并会建议使用其他方法来突出显示文本。尝试使用粗体或添加符号来突出显示条目...

相关内容