![使用 biblatex 和 ulem 包在参考书目中添加下划线标题](https://linux22.com/image/297751/%E4%BD%BF%E7%94%A8%20biblatex%20%E5%92%8C%20ulem%20%E5%8C%85%E5%9C%A8%E5%8F%82%E8%80%83%E4%B9%A6%E7%9B%AE%E4%B8%AD%E6%B7%BB%E5%8A%A0%E4%B8%8B%E5%88%92%E7%BA%BF%E6%A0%87%E9%A2%98.png)
biblatex
我想使用带有 Biber 后端的包和包来为参考书目中的所有标题添加下划线ulem
。biblatex
似乎破坏了ulem
的换行功能。请考虑以下 MWE:
\documentclass{article}
\begin{filecontents}{MWE.bib}
@book{key,
author = {Super, Max},
title = {An extraordinary long and meaningless example book title, but unfortunately not correctly wrapped}
}
\end{filecontents}
\usepackage[normalem]{ulem}
\usepackage[backend=biber]{biblatex}
\addbibresource{MWE.bib}
\DeclareFieldFormat*{title}{\uline{#1}}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
有什么解决方法吗?任何帮助都值得感激。
答案1
我找到了两种方法。使用\usefield
(biblatex.pdf,第 177 页)
第一种方式:重新定义bibmacro{title}
bibmacro{title}
在文件biblatex.def中定义如下:
\newbibmacro*{title}{%
\ifboolexpr{
test {\iffieldundef{title}}
and
test {\iffieldundef{subtitle}}
}
{}
{\printtext[title]{%
\printfield[titlecase]{title}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{subtitle}}%
\newunit}%
\printfield{titleaddon}}
我将bibmacro{title}
序言中的重新定义为:
\renewbibmacro*{title}{%
\ifboolexpr{
test {\iffieldundef{title}}
and
test {\iffieldundef{subtitle}}
}
{}
{\printtext{%
\printtext[titlecase]{\usefield{\uline}{title}}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{subtitle}}%
\newunit}%
\printfield{titleaddon}}
妇女权利委员会:
\documentclass{article}
\begin{filecontents}{MWE.bib}
@book{key,
author = {Super, Max},
title = {An extraordinary long and meaningless example book title, and fortunately correctly wrapped},
subtitle={A short subtitle},
}
\end{filecontents}
\usepackage[normalem]{ulem}
\usepackage[backend=biber]{biblatex}
\addbibresource{MWE.bib}
\renewbibmacro*{title}{%
\ifboolexpr{
test {\iffieldundef{title}}
and
test {\iffieldundef{subtitle}}
}
{}
{\printtext{%
\printtext[titlecase]{\usefield{\uline}{title}}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{subtitle}}%
\newunit}%
\printfield{titleaddon}}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
编辑
第二种方式: 使用\DeclareFieldFormat
我发现其他形式的使用\DeclareFieldFormat
,没有必要重新定义bibmacro{title}
。
中使用的格式\printfield{title}
是titlecase
(在 的定义中bibmacro{title}
)。然后必须重新定义此格式。这很重要,因为我使用\currentfield
并且它仅在使用 时定义\printfield
,而不是与 一起使用\printtext
。
\DeclareFieldFormat*{titlecase}{
\ifdef{\currentfield}
{\ifcurrentfield{title}
{\usefield{\uline}{\currentfield}}%
{#1}}
{#1}}
例如,如果使用该格式,则是\ifdef{\currentfield}
为了避免麻烦。titlecase
\printtext
是\ifcurrentfield{title}
将格式仅应用于该title
字段。
最后,如果您想删除中的默认强调title
,则需要重新定义title format
使用的printtext
。
\DeclareFieldFormat*{title}{#1}
梅威瑟:
\documentclass{article}
\begin{filecontents}{MWE.bib}
@book{key,
author = {Super, Max},
title = {An extraordinary long and meaningless example book title, and fortunately correctly wrapped},
subtitle={A short subtitle},
year={2004},
}
\end{filecontents}
\usepackage[normalem]{ulem}
\usepackage[backend=biber]{biblatex}
\addbibresource{MWE.bib}
\DeclareFieldFormat*{title}{#1}
\DeclareFieldFormat*{titlecase}{%
\ifdef{\currentfield}
{\ifcurrentfield{title}
{\usefield{\uline}{\currentfield}}%
{#1}}
{#1}}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
答案2
以下是 ulem 文档中的一些片段,也许可以解释您所看到的内容:
与常规下划线不同,ulem 允许在带下划线的文本中换行和手动连字符;但它远非完美。它最适合简单的文本,如 LATEX:一种文档准备系统,可能需要在提交出版的手稿中加下划线。同样,当文本由显式括号分隔时,ulem 只能为 \em 提供带下划线的文本。
和:
每个单词都排版在带下划线的框中,因此自动连字符被禁用,但仍将遵循显式自由连字符 (-)。下划线内特别支持几个文本格式化命令:-、\、~、\、\newline、\linebreak、\nolinebreak、\penalty、\hskip、\hspace、\hfil、\hfill、\hss。不支持显示数学。特殊命令确实存在一个问题:它们会结束一个组,因此任何本地分配都会丢失。
和:
括号和宏替换的一个重要不兼容性:括号内或来自宏的所有文本都排版在一个框中(就像在 \mbox 中一样)。因此,括号将抑制其所包含文本的拉伸和换行。此外,如果特殊处理的命令 -、\、\newline 和 \linebreak 出现在额外的括号内,它们通常会被忽略。只有当括号界定命令参数而不引入分组级别时,它们才会起作用。(尽管界定命令参数的括号通常不暗示分组,但许多命令会添加自己的分组。)因此,您应该尝试将内部括号限制为短文本或界定命令的参数。对于紧急修复,请参阅下面残暴的“Marat/Sade”示例。括号内的语法空格永远不会造成问题,数学模式下的空格也不会。
您可从此处以 PDF 链接形式找到此文档:
我在另一种情况下遇到了类似的下划线问题。我最终想出的解决方案对我来说勉强可以接受,对您来说可能也不行,它是一种临时解决方案,可以循环显示要加下划线的文本,并分别处理每个单词。这意味着每个单词都有下划线,但单词之间的空格没有。在参考书目格式中,这可能不合适。
这个组合看起来是这样的:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%This odd bit plucks words individually
%from a group and undelines each word
%this allows for word-wrapping which otherwise
%does not work well. The trade off is that
%spaces between words are not underlined
%
\makeatletter
\def\mboxed#1{%
\@mboxed#1 \@empty
}
\def\@mboxed#1 #2{%
\uline{#1}\space % underline from package ulem
\ifx #2\@empty\else
\expandafter\@mboxed
\fi
#2%
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(我希望我能为这段代码承担责任,甚至给予实际作者适当的荣誉,但我找不到引导我找到它的链接。)
我在我的情况下是这样实现的:\newcommand{\role}1{\mboxed{#1}}
不幸的是,我对 Biblatex 知之甚少,所以我不知道这个解决方案对您有何价值,甚至是否有价值。