我正在用 LaTeX 写简历。我正在使用 LaTeX biblatex
,并希望我的名字(且只有我的名字)在每个参考资料中都显示为粗体。有什么神奇的方法可以做到这一点吗?
类似的问题每次在参考书目中出现作者姓名时,将其设为粗体被问到,但答案使用了 BibTeX。虽然我使用 BibTeX 后端,但我使用biblatex
。
有什么建议么?
答案1
您可以修补中定义的name:last
、name:first-last
和宏。所有默认名称格式指令都使用这些宏,并采用四个参数:name:last-first
biblatex.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
自biblatex
3.4/ biber
2.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}
可以看出:问题已经解决,因为确切地使用宏的作者以粗体显示。更准确地说:现在是一个可选参数,可以由用户选择的任何字符串实例化。此“键”可用于定义\MyName
更具体的行为。例如,我使用biblatex
关键字(在额外的关键字字段中给出 - 此处未给出)来提供几个参考部分,并按关键字划分。如果使作者姓名加粗应该取决于该关键字(对我来说就是这种情况),则可以将该逻辑放入 if-then 语句中。(在我的示例中,\MyName
粗体显示任何给定关键字且非粗体,否则。这显然可以扩展以匹配任何特定键。
需要注意的是,此解决方案不支持缩写宏中给出的作者姓名。您会看到我传递了“S. Author”而不是\MyName
“Some Author”,因为 latex/bibtex 无法从中生成“S. Author”。不过,我认为这不会降低此解决方案的实用性。
它的问题:全部放入\MyName
宏中的名称比不使用宏时更靠右。也就是说,任何此类名称左侧都有大约 2mm 的空格。这与匹配的 if 情况无关,即无论它是否为粗体。这就是我\hspace
在它前面添加负号的原因。然而,
(a) 这太脏了。没有 (la)tex 宏可以消除额外的空间吗?
(b)无法找到需要减去的正确空间,因为不同的条目的空间不同bibtex
(有时这个自动插入的空间较大,有时较小)