答案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}
非常感谢乌尔丽克·菲舍尔在评论中提出了许多改进建议,并通过这些改进帮助我更好地理解代码。
许多人(尤其是本网站上的许多人)认为下划线是打字机时代的遗留,并会建议使用其他方法来突出显示文本。尝试使用粗体或添加符号来突出显示条目...