![每次在参考书目中出现作者姓名时,将其设为粗体](https://linux22.com/image/242146/%E6%AF%8F%E6%AC%A1%E5%9C%A8%E5%8F%82%E8%80%83%E4%B9%A6%E7%9B%AE%E4%B8%AD%E5%87%BA%E7%8E%B0%E4%BD%9C%E8%80%85%E5%A7%93%E5%90%8D%E6%97%B6%EF%BC%8C%E5%B0%86%E5%85%B6%E8%AE%BE%E4%B8%BA%E7%B2%97%E4%BD%93.png)
我正在写简历。我想在参考书目中的每个条目中突出显示我的名字。我尝试过简单地用 或 替换{myname}
,{\bf myname}
但{{\bf myname}}
它们会失败并出现各种错误,尤其是在排序时。
这个帖子给出了几乎符合我要求的解决方案。链接帖子中的解决方案是使用:
\newcommand{\myname}[1]{\textbf{#1}}
包装所讨论名称的所有实例。
编辑:删除了错误示例,因为它是由 .bst 文件中不相关的错误引起的。下面选择的答案现在直接回答了上面提出的唯一问题。
答案1
在我找到的解决方案中,您需要为此修改 bibtex 样式文件并实现新的 TeX 宏。假设您使用普通书目样式。定位plain.bst
(您可以使用命令kpsewhich plain.bst
来实现)并将其复制到本地 tex 目录,例如 myplain.bst
。在myplain.bst
定位函数中format.names
。在此函数中替换行
{ s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
经过
{ "\FormatName{" s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ * "}" * 't :=
现在在您的 tex 文件中,首先将样式更改为myplain.bst
并插入以下宏定义:
\def\FormatName#1{%
\def\myname{Elmar Zander}%
\edef\name{#1}%
\ifx\name\myname
\textbf{#1}%
\else
#1%
\fi
}
现在应该可以了。(当然,别忘了用你的名字替换我的名字 ;-)
注1: format.name$
是一个内置函数,它接受前面三个参数,即:包含作者姓名的字符串 ( s
)、要格式化的姓名编号 ( nameptr
) 和格式化字符串 ( "{ff~..."
),并根据此格式字符串格式化作者姓名。由于 bibtex 是面向堆栈的,因此需要先将参数推送到堆栈上,然后format.name$
将它们从堆栈中弹出,计算结果并将其推送回堆栈。格式字符串中的“ff、ll、vv、jj”分别代表名字、姓氏、“von”或“de”之类的内容以及“jr./junior”之类的内容(请参阅 bibtex 发行版中包含的 btxhak.pdf)。单字母版本“f”、“l”等将为您提供缩写形式。bibtex*
中的运算符连接两个字符串。同样,字符串需要先在堆栈上,然后将结果推送回堆栈顶部。
笔记2:您可以在 bst 文件中使用 FormatName 宏:按以下方式修改begin.bib
函数myplain.bst
FUNCTION {begin.bib}
{
"\def\FormatName#1{%" write$
" \edef\name{#1}%" write$
" \ifx\name\myname" write$
" \textbf{#1}%" write$
" \else%" write$
" #1%" write$
" \fi" write$
"}" write$
preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{" longest.label * "}" * write$ newline$
}
只需将\def\myname{...}
宏保留在您的 tex 文件中即可。这样您就可以轻松更改要突出显示的名称(如果有)。
注3:FormatName 命令可能会在处理姓和名之间的空格时出现问题,并且它也无法同时找到“Elmar Zander”和“E. Zander”。如果上述方法对您不起作用,您可以使用字符串包然后定义FormatName如下:
\def\FormatName#1{%
\IfSubStr{#1}{Zander}{\textbf{#1}}{#1}%
}
答案2
您可以使用 BibLaTeX 完成此操作,无需进行太多黑客操作,只需在序言中输入以下内容:
\newcommand{\makeauthorbold}[1]{%
\DeclareNameFormat{author}{%
\ifnumequal{\value{listcount}}{1}
{\ifnumequal{\value{liststop}}{1}
{\expandafter\ifstrequal{##1}{#1}{\textbf{##1\addcomma\addspace ##4\addcomma\isdot}}{##1\addcomma\addspace ##4\addcomma\isdot}}
{\expandafter\ifstrequal{##1}{#1}{\textbf{##1\addcomma\addspace ##4}}{##1\addcomma\addspace ##4}}}
{\ifnumless{\value{listcount}}{\value{liststop}}
{\expandafter\ifstrequal{##1}{#1}{\textbf{\addcomma\addspace ##1\addcomma\addspace ##4}}{\addcomma\addspace ##1\addcomma\addspace ##4}}
{\expandafter\ifstrequal{##1}{#1}{\textbf{\addcomma\addspace ##1\addcomma\addspace ##4\addcomma\isdot}}{\addcomma\addspace ##1\addcomma\addspace ##4\addcomma\isdot}}%
}%
}%
}
\makeauthorbold{Smith}
\IfSubStr
通过使用字符串也可以使用 package 代替\ifstrequal
一个,使多个名称变为粗体,如下所示:
\usepackage{xstring}
\newcommand{\makeauthorsbold}[1]{%
\DeclareNameFormat{author}{%
\ifnumequal{\value{listcount}}{1}
{\ifnumequal{\value{liststop}}{1}
{\expandafter\IfSubStr{#1}{##1}{\textbf{##1\addcomma\addspace ##4\addcomma\isdot}}{##1\addcomma\addspace ##4\addcomma\isdot}}
{\expandafter\IfSubStr{#1}{##1}{\textbf{##1\addcomma\addspace ##4}}{##1\addcomma\addspace ##4}}}
{\ifnumless{\value{listcount}}{\value{liststop}}
{\expandafter\IfSubStr{#1}{##1}{\textbf{\addcomma\addspace ##1\addcomma\addspace ##4}}{\addcomma\addspace ##1\addcomma\addspace ##4}}
{\expandafter\IfSubStr{#1}{##1}{\textbf{\addcomma\addspace ##1\addcomma\addspace ##4\addcomma\isdot}}{\addcomma\addspace ##1\addcomma\addspace ##4\addcomma\isdot}}%
}%
}%
}
\makeauthorsbold{Smith,Doe}
唯一需要注意的是,如果作者的名字是某个名字的子字符串,那么这也会使其变为粗体。例如,“Do”最终也会变为粗体。
更新:对于 biblatex 3.3 及以上版本,请使用下面 Lawrence Crosby 的答案。
答案3
从biblatex
3.3开始cgogolin 的回答不再有效。这是由于\DeclareNameFormat
宏的变化(请参阅https://github.com/plk/biblatex/issues/372进行讨论)。最终我修改了 cgogolin 的宏,让它工作起来,解决办法如下:
\newcommand{\makeauthorbold}[1]{%
\DeclareNameFormat{author}{%
\ifthenelse{\value{listcount}=1}
{%
{\expandafter\ifstrequal\expandafter{\namepartfamily}{#1}{\mkbibbold{\namepartfamily\addcomma\addspace \namepartgiveni}}{\namepartfamily\addcomma\addspace \namepartgiveni}}
%
}{\ifnumless{\value{listcount}}{\value{liststop}}
{\expandafter\ifstrequal\expandafter{\namepartfamily}{#1}{\mkbibbold{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni}}{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni}}
{\expandafter\ifstrequal\expandafter{\namepartfamily}{#1}{\mkbibbold{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni\addcomma\isdot}}{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni\addcomma\isdot}}%
}
\ifthenelse{\value{listcount}<\value{liststop}}
{\addcomma\space}{}
}
}
这是我第一次尝试编写 LaTeX 宏,所以我希望代码风格不会偏离惯例太远。希望这能帮助那些使用较新版本软件包的人biblatex
。
(编辑:将 else 块添加到最后ifthenelse
)
答案4
user2087764 的多作者案例需要更新,结合 Lawrence Crosby 和 Werner 的更正:
\usepackage{xstring}
\usepackage{etoolbox}
\newboolean{bold}
\newcommand{\makeauthorsbold}[1]{%
\DeclareNameFormat{author}{%
\setboolean{bold}{false}%
\renewcommand{\do}[1]{\expandafter\ifstrequal\expandafter{\namepartfamily}{####1}{\setboolean{bold}{true}}{}}%
\docsvlist{#1}%
\ifthenelse{\value{listcount}=1}
{%
{\expandafter\ifthenelse{\boolean{bold}}{\mkbibbold{\namepartfamily\addcomma\addspace \namepartgiveni}}{\namepartfamily\addcomma\addspace \namepartgiveni}}%
}{\ifnumless{\value{listcount}}{\value{liststop}}
{\expandafter\ifthenelse{\boolean{bold}}{\mkbibbold{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni}}{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni}}%
{\expandafter\ifthenelse{\boolean{bold}}{\mkbibbold{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni\addcomma\isdot}}{\addcomma\addspace \namepartfamily\addcomma\addspace \namepartgiveni\addcomma\isdot}}%
}
\ifthenelse{\value{listcount}<\value{liststop}}
{\addcomma\space}{}
}
}
\makeauthorsbold{Smith,Doe}