使用 biblatex 将特定作者设为粗体

使用 biblatex 将特定作者设为粗体

我正在用 LaTeX 写简历。我正在使用 LaTeX biblatex,并希望我的名字(且只有我的名字)在每个参考资料中都显示为粗体。有什么神奇的方法可以做到这一点吗?

类似的问题每次在参考书目中出现作者姓名时,将其设为粗体被问到,但答案使用了 BibTeX。虽然我使用 BibTeX 后端,但我使用biblatex

有什么建议么?

答案1

您可以修补中定义的name:lastname:first-last和宏。所有默认名称格式指令都使用这些宏,并采用四个参数:name:last-firstbiblatex.def

{<last name>}{<first name>}{<name prefix>}{<name affix>}

或者

{<last name>}{<first name (initials)>}{<name prefix>}{<name affix>}

下面我们仅匹配名字和姓氏部分。

\documentclass{article}
\usepackage{biblatex}
\usepackage{xpatch}% or use http://tex.stackexchange.com/a/40705

\makeatletter
\newbibmacro*{name:bold}[2]{%
  \edef\blx@tmp@name{\expandonce#1, \expandonce#2}%
  \def\do##1{\ifdefstring{\blx@tmp@name}{##1}{\bfseries\listbreak}{}}%
  \dolistloop{\boldnames}}
\newcommand*{\boldnames}{}
\makeatother

\xpretobibmacro{name:family}{\begingroup\usebibmacro{name:bold}{#1}{#2}}{}{}
\xpretobibmacro{name:given-family}{\begingroup\usebibmacro{name:bold}{#1}{#2}}{}{}
\xpretobibmacro{name:family-given}{\begingroup\usebibmacro{name:bold}{#1}{#2}}{}{}
\xpretobibmacro{name:delim}{\begingroup\normalfont}{}{}

\xapptobibmacro{name:family}{\endgroup}{}{}
\xapptobibmacro{name:given-family}{\endgroup}{}{}
\xapptobibmacro{name:family-given}{\endgroup}{}{}
\xapptobibmacro{name:delim}{\endgroup}{}{}

% just for demonstration
\ExecuteBibliographyOptions{maxnames=99,giveninits}
\DeclareNameAlias{default}{family-given/given-family}

\addbibresource{biblatex-examples.bib}
\forcsvlist{\listadd\boldnames}
  {{Herrmann, Wolfgang~A.}, {Herrmann, W.~A.}, {Herrmann, Wolfgang\bibnamedelima A.},
   {Herrmann, W\bibinitperiod\bibinitdelim A\bibinitperiod}}

\setlength{\parindent}{0pt}
\setlength{\parskip}{\baselineskip}
\begin{document}
\fullcite{herrmann}

\forcsvlist{\listadd\boldnames}
  {{{\"{O}}fele, Karl}, {{\"{O}}fele, K.}, {{\"{O}}fele, K\bibinitperiod}}
\fullcite{herrmann}

\renewcommand*{\boldnames}{}
\forcsvlist{\listadd\boldnames}
  {{Hoffmann, Stephan~D.}, {Hoffmann, S.~D.}, {Hoffmann, Stephan\bibnamedelima D.},
   {Hoffmann, S\bibinitperiod\bibinitdelim D\bibinitperiod}}
\fullcite{herrmann}
\end{document}

在此处输入图片描述

请注意,内部列表中的名称部分\boldnames etoolbox应遵循文件的格式bbl,这取决于后端。此处的示例涵盖 biber 和 BibTeX。使用 biber 您还可以使用以下字段执行匹配hash

\iffieldequalstr{hash}{<hash string>}

<hash string>可以在文件中找到bbl

如果您的姓名在文件中的格式一致,则bib另一种方法是在匹配之前规范化姓名标点符号。此示例允许您以 BibTeX 格式指定您的姓名,而不管后端是什么。

\documentclass{article}
\usepackage{biblatex}
\usepackage{xpatch}% or use http://tex.stackexchange.com/a/40705

\def\makenamesetup{%
  \def\bibnamedelima{~}%
  \def\bibnamedelimb{ }%
  \def\bibnamedelimc{ }%
  \def\bibnamedelimd{ }%
  \def\bibnamedelimi{ }%
  \def\bibinitperiod{.}%
  \def\bibinitdelim{~}%
  \def\bibinithyphendelim{.-}}    
\newcommand*{\makename}[3]{\begingroup\makenamesetup\xdef#1{#2, #3}\endgroup}

\newbibmacro*{name:bold}[2]{%
  \makename{\currname}{#1}{#2}%
  \makename{\findname}{\lastname}{\firstname}%
  \makename{\findinit}{\lastname}{\firstinit}%
  \ifboolexpr{ test {\ifdefequal{\currname}{\findname}}
            or test {\ifdefequal{\currname}{\findinit}} }{\bfseries}{}}

\newcommand*{\boldname}[3]{%
  \def\lastname{#1}%
  \def\firstname{#2}%
  \def\firstinit{#3}}
\boldname{}{}{}

\xpretobibmacro{name:family}{\begingroup\usebibmacro{name:bold}{#1}{#2}}{}{}
\xpretobibmacro{name:given-family}{\begingroup\usebibmacro{name:bold}{#1}{#2}}{}{}
\xpretobibmacro{name:family-given}{\begingroup\usebibmacro{name:bold}{#1}{#2}}{}{}
\xpretobibmacro{name:delim}{\begingroup\normalfont}{}{}

\xapptobibmacro{name:family}{\endgroup}{}{}
\xapptobibmacro{name:given-family}{\endgroup}{}{}
\xapptobibmacro{name:family-given}{\endgroup}{}{}
\xapptobibmacro{name:delim}{\endgroup}{}{}

% just for demonstration
\ExecuteBibliographyOptions{maxnames=99,giveninits}
\DeclareNameAlias{default}{family-given/given-family}

\addbibresource{biblatex-examples.bib}
\boldname{Herrmann}{Wolfgang~A.}{W.~A.}

\setlength{\parindent}{0pt}
\setlength{\parskip}{\baselineskip}
\begin{document}
\fullcite{herrmann}

\boldname{{\"O}fele}{Karl}{K.}
\fullcite{herrmann}

\boldname{Hoffmann}{Stephan~D.}{S.~D.}
\fullcite{herrmann}
\end{document}

在此处输入图片描述

此答案已更新,适用于 3.3 及以上版本biblatex。请参阅 旧版本的编辑历史biblatex。—— moewe

答案2

biblatex3.4/ biber2.5 以来,有一个通用的“注释”功能可以执行此类操作,例如:

\documentclass{article}
\usepackage{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@MISC{test,
  AUTHOR    = {Last1, First1 and Last2, First2 and Last3, First3},
  AUTHOR+an = {2=highlight},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\renewcommand*{\mkbibnamegiven}[1]{%
  \ifitemannotation{highlight}
    {\textbf{#1}}
    {#1}}

\renewcommand*{\mkbibnamefamily}[1]{%
  \ifitemannotation{highlight}
    {\textbf{#1}}
    {#1}}

\begin{document}
\nocite{*}
\printbibliography

\end{document}

在此处输入图片描述

您还可以在名称部分级别和顶级字段级别进行注释。有关详细信息,请参阅 biblatex PDF 手册。

答案3

因为我不能使用https://tex.stackexchange.com/a/73246/7561以及,以防其他人在寻找解决方案时遇到此问题,我正在更新答案。正如 Adam Liter 在该答案的评论中指出的那样,上一个答案中使用的选项已被弃用并且不起作用(至少对我来说)。

解决方案

相反,我重新定义了\mkbibnamegiven\mkbibnamefamily,并使用了与以前相同的想法。

基本上,您使用来\boldname定义要标记为粗体的名称,例如:\boldname{Lastname}{Givenname}{G.}

\newcommand*{\boldname}[3]{%
  \def\lastname{#1}%
  \def\firstname{#2}%
  \def\firstinit{#3}}
\boldname{}{}{}

然后,我们重新定义生成给定名称和姓氏的宏。主要思想是搜索上面定义的命名,如果找到(包括给定名称和姓氏),则将其加粗(使用\mkbibbold),如果没有找到,则保持原样。

% Patch new definitions
\renewcommand{\mkbibnamegiven}[1]{%
  \ifboolexpr{ ( test {\ifdefequal{\firstname}{\namepartgiven}} or test {\ifdefequal{\firstinit}{\namepartgiven}} ) and test {\ifdefequal{\lastname}{\namepartfamily}} }
  {\mkbibbold{#1}}{#1}%
}

\renewcommand{\mkbibnamefamily}[1]{%
  \ifboolexpr{ ( test {\ifdefequal{\firstname}{\namepartgiven}} or test {\ifdefequal{\firstinit}{\namepartgiven}} ) and test {\ifdefequal{\lastname}{\namepartfamily}} }
  {\mkbibbold{#1}}{#1}%
}

例子

完整示例:

% !BIB program = biber
\documentclass{article}
\usepackage[backend=biber,maxbibnames=99,defernumbers=true,sorting=ydnt,giveninits=true]{biblatex}

\begin{filecontents}{\jobname.bib}
@InProceedings{identifier1,
  Title                    = {Some Awesome Title},
  Author                   = {Some Author and Another Author},
  Booktitle                = {Some Book about the Future},
  Year                     = {2042},
  Pages                    = {1--42}
}

@InProceedings{identifier2,
  Title                    = {Some So-So Title},
  Author                   = {First Author and Second Author},
  Booktitle                = {An okay Booktitle},
  Year                     = {2000},
  Pages                    = {1--100}
}

  @Book{test1,
  author          = {Goossens, Michel and Mittelbach, Frank
    and Samarin, Alexander},
  title           = {The LaTeX Companion},
  publisher       = {Addison-Wesley},
  location        = {Reading, Mass.},
  year            = {1994},

}

@Book{test2,
  author          = {Mittelbach, F. and Goossens, Michel
    and Samarin, Alexander},
  title           = {The LaTeX Companion},
  publisher       = {Addison-Wesley},
  location        = {Reading, Mass.},
  year            = {1994},

}

@Book{test3,
  author          = {Mittelbach, Frank and Samarin, Alexander
    and Goossens, Michel},
  title           = {The LaTeX Companion},
  publisher       = {Addison-Wesley},
  location        = {Reading, Mass.},
  year            = {1994},
} 
\end{filecontents}
\addbibresource{\jobname.bib}

\def\makenamesetup{%
  \def\bibnamedelima{~}%
  \def\bibnamedelimb{ }%
  \def\bibnamedelimc{ }%
  \def\bibnamedelimd{ }%
  \def\bibnamedelimi{ }%
  \def\bibinitperiod{.}%
  \def\bibinitdelim{~}%
  \def\bibinithyphendelim{.-}}    
\newcommand*{\makename}[2]{\begingroup\makenamesetup\xdef#1{#2}\endgroup}

\newcommand*{\boldname}[3]{%
  \def\lastname{#1}%
  \def\firstname{#2}%
  \def\firstinit{#3}}
\boldname{}{}{}

% Patch new definitions
\renewcommand{\mkbibnamegiven}[1]{%
  \ifboolexpr{ ( test {\ifdefequal{\firstname}{\namepartgiven}} or test {\ifdefequal{\firstinit}{\namepartgiven}} ) and test {\ifdefequal{\lastname}{\namepartfamily}} }
  {\mkbibbold{#1}}{#1}%
}

\renewcommand{\mkbibnamefamily}[1]{%
  \ifboolexpr{ ( test {\ifdefequal{\firstname}{\namepartgiven}} or test {\ifdefequal{\firstinit}{\namepartgiven}} ) and test {\ifdefequal{\lastname}{\namepartfamily}} }
  {\mkbibbold{#1}}{#1}%
}

\boldname{Author}{Some}{S.}

\begin{document}

\nocite{*}
\printbibliography

\boldname{Goossens}{Michel}{M.}
\printbibliography

\boldname{Mittelbach}{Frank}{F.}
\printbibliography

\end{document}

展示

更新

增加了在加粗姓名之前检查名字和姓氏的支持。

答案4

adn 的最后一个答案仍然存在问题:使用字符串的子宏\boldname{Goossens}{Michel}{M.}仅独立搜索这些字符串(即“Goossens”、“Michel”和“M.”)。即:任何“M.”的出现将以粗体显示,无论它是否属于其他作者(例如“Martin”的出现将以“M.”显示)。改进搜索脚本,仅在检测到序列中的名称时才将其显示为粗体,这样可以解决此问题。在当前形式下,由于引用不止几个,因此其用途非常有限。

下面是一个显示问题的 MWE:

\documentclass{article}
\usepackage[backend=biber,maxbibnames=99,defernumbers=true,sorting=ydnt,giveninits=true]{biblatex}

\begin{filecontents}{\jobname.bib}
@InProceedings{identifier1,
  Title                    = {Some Awesome Title},
  Author                   = {Some Author and Another Author},
  Booktitle                = {Some Book about the Future},
  Year                     = {2042},
  Pages                    = {1--42}
}

@InProceedings{identifier2,
  Title                    = {Some So-So Title},
  Author                   = {First Author and Second Author},
  Booktitle                = {An okay Booktitle},
  Year                     = {2000},
  Pages                    = {1--100}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\def\makenamesetup{%
  \def\bibnamedelima{~}%
  \def\bibnamedelimb{ }%
  \def\bibnamedelimc{ }%
  \def\bibnamedelimd{ }%
  \def\bibnamedelimi{ }%
  \def\bibinitperiod{.}%
  \def\bibinitdelim{~}%
  \def\bibinithyphendelim{.-}}    
\newcommand*{\makename}[2]{\begingroup\makenamesetup\xdef#1{#2}\endgroup}

\newcommand*{\boldname}[3]{%
  \def\lastname{#1}%
  \def\firstname{#2}%
  \def\firstinit{#3}}
\boldname{}{}{}

% Patch new definitions
\renewcommand{\mkbibnamegiven}[1]{%
  \makename{\currname}{#1}%
  \makename{\findname}{\firstname}%
  \makename{\findinit}{\firstinit}%
  \ifboolexpr{ test {\ifdefequal{\currname}{\findname}}%
    or test {\ifdefequal{\currname}{\findinit}} }%
  {\mkbibbold{#1}}{#1}%
}

\renewcommand{\mkbibnamefamily}[1]{%
  \makename{\currname}{#1}%
  \makename{\findname}{\lastname}%
  \ifboolexpr{ test {\ifdefequal{\currname}{\findname}} }%
  {\mkbibbold{#1}}{#1}%
}

\boldname{Author}{Some}{S.}

\begin{document}

\nocite{*}
\printbibliography

\end{document}

它生成以下 PDF,其中:

(a)所有出现的“S.”都用粗体表示,但有一个代表“Second”,不属于“Some Author”这个名称,并且

(b)所有出现的“作者”都以粗体显示(即所有四位作者!),尽管只有一个与所需的作者“某位作者”匹配

名称匹配错误,如上所述

因此,我提出了另一种解决方案,它确实解决了这个问题(但是,它还有其他问题 - 如果有人能提出解决方案,我会很高兴)。该解决方案在每次在参考书目中出现作者姓名时,将其设为粗体(该链接也在该页面的第一篇文章中提供)。然而,(a)它与 一起工作biblatex,尽管 jlconlin 说它只与bibtex和 一起工作,(b)我对它进行了一些扩展,以提供一些没有它就无法获得的进一步的功能(但这些功能由 adn 给出的先前答案提供)。

该解决方案只是在文件中使用宏来bibtex代替实际作者的姓名。然后,宏确实起作用,但如果直接插入 .bib 文件中,\textbf{}文档将无法编译。\textbf{}

\documentclass{article}

\usepackage[backend=biber,maxbibnames=99,defernumbers=true,sorting=ydnt,giveninits=true]{biblatex}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@InProceedings{identifier1,
  Title                    = {Some Awesome Title},
  Author                   = {\MyName[someKey]{S. Author} and Another Author},
  Booktitle                = {Some Book about the Future},
  Year                     = {2042},
  Pages                    = {1--42}
}

@InProceedings{identifier2,
  Title                    = {Some So-So Title},
  Author                   = {First Author and Second Author},
  Booktitle                = {An okay Booktitle},
  Year                     = {2000},
  Pages                    = {1--100}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}

\newcommand{\MyName}[2][\empty]{  % \empty is default for the opt. argument
  \ifthenelse{\equal{#1}{\empty}} % test the opt. argument
    {\hspace*{-.75mm}#2}          % it's empty! just show mand. argument   
    {\hspace*{-.75mm}\textbf{#2}} % it's not empty! make mand. argument (the name) bold
}

\nocite{*}
\printbibliography

\end{document}

它生成以下 PDF: 在此处输入图片描述

可以看出:问题已经解决,因为确切地使用宏的作者以粗体显示。更准确地说:现在是一个可选参数,可以由用户选择的任何字符串实例化。此“键”可用于定义\MyName更具体的行为。例如,我使用biblatex关键字(在额外的关键字字段中给出 - 此处未给出)来提供几个参考部分,并按关键字划分。如果使作者姓名加粗应该取决于该关键字(对我来说就是这种情况),则可以将该逻辑放入 if-then 语句中。(在我的示例中,\MyName粗体显示任何给定关键字且非粗体,否则。这显然可以扩展以匹配任何特定键。

需要注意的是,此解决方案不支持缩写宏中给出的作者姓名。您会看到我传递了“S. Author”而不是\MyName“Some Author”,因为 latex/bibtex 无法从中生成“S. Author”。不过,我认为这不会降低此解决方案的实用性。

它的问题:全部放入\MyName宏中的名称比不使用宏时更靠右。也就是说,任何此类名称左侧都有大约 2mm 的空格。这与匹配的 if 情况无关,即无论它是否为粗体。这就是我\hspace在它前面添加负号的原因。然而,

(a) 这太脏了。没有 (la)tex 宏可以消除额外的空间吗?

(b)无法找到需要减去的正确空间,因为不同的条目的空间不同bibtex(有时这个自动插入的空间较大,有时较小)

相关内容