使用 biblatex 和 ulem 包在参考书目中添加下划线标题

使用 biblatex 和 ulem 包在参考书目中添加下划线标题

biblatex我想使用带有 Biber 后端的包和包来为参考书目中的所有标题添加下划线ulembiblatex似乎破坏了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 链接形式找到此文档:

http://www.ctan.org/pkg/ulem

我在另一种情况下遇到了类似的下划线问题。我最终想出的解决方案对我来说勉强可以接受,对您来说可能也不行,它是一种临时解决方案,可以循环显示要加下划线的文本,并分别处理每个单词。这意味着每个单词都有下划线,但单词之间的空格没有。在参考书目格式中,这可能不合适。

这个组合看起来是这样的:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%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 知之甚少,所以我不知道这个解决方案对您有何价值,甚至是否有价值。

相关内容