每次在参考书目中出现作者姓名时,将其设为粗体

每次在参考书目中出现作者姓名时,将其设为粗体

我正在写简历。我想在参考书目中的每个条目中突出显示我的名字。我尝试过简单地用 或 替换{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

biblatex3.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}

相关内容