使用 biblatex 将特定作者的名字作为命令突出显示参考书目和引文

使用 biblatex 将特定作者的名字作为命令突出显示参考书目和引文

我希望能够在命令中定义作者列表,并在参考书目或引文中突出显示它们。我正在使用比布拉特克斯使用我的乳胶文档(我最近无法更新我的操作系统,并且我正在使用包:biblatex 2013/11/25 v2.8a 可编程书目(PK/JW/AB))。

到目前为止,我已经能够创建一个新的宏,每次打印作者姓名时都会调用该宏。但是,当我将作者姓氏和名字与我使用定义的值进行比较时\newcommand,我总是在 if 语句中得到 false 的评估。这是我到目前为止得到的结果(灵感来自 [1], [2] 和 [3]):

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@inproceedings{boldref, 
  AUTHOR = {InBold, to Put and Author, Non bold  and Highlight, Shine and  Ano, therOne},
  TITLE = {The title},
  BOOKTITLE = {The conference},
  PAGES = {65--78},
  YEAR = 2014}
\end{filecontents}

\usepackage{xpatch}
\usepackage[normalem]{ulem}
\usepackage{color}
\usepackage[backend=biber,bibencoding=utf8,style=numeric-comp,maxbibnames=99,firstinits=true]{biblatex}

\addbibresource{\jobname.bib}


\newcommand{\authorgivenname}{t. P.} 
\newcommand{\authorfamilyname}{InBold} 
\newcommand{\authorbibname}{\authorfamilyname, \authorgivenname} 

\newbibmacro*{name:emph}[2]{%
    First arugment: #1 =? \authorfamilyname \\
    Second argument: #2 =? \authorgivenname \\
    \ifstrequal{#2}{\authorgivenname}
    {
        \textcolor{green}{Evaluated to true: #1, #2} \\
    }
    {
        \textcolor{red}{Evaluated to false: #1, #2} \\
    }
}

\xpretobibmacro{name:last}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:first-last}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:last-first}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}    
\xpretobibmacro{name:delim}{\begingroup\normalfont}{}{}    

\xapptobibmacro{name:last}{\endgroup}{}{}
\xapptobibmacro{name:first-last}{\endgroup}{}{}
\xapptobibmacro{name:last-first}{\endgroup}{}{}    
\xapptobibmacro{name:delim}{\endgroup}{}{} 


\begin{document}
\nocite{*}

\noindent\fullcite{boldref}

\end{document}

如果我让这段代码工作,我的想法是将其更改\textcolor{green}{Evaluated to true: #1, #2}\bfseries,并且作者姓名将以粗体显示。我怀疑这与每个元素的展开时间有关。我说得对吗?我该如何修复它?此外,我如何扩展它以与元素列表而不是仅与一位作者进行比较?

我还注意到,当调用宏时,变量#1#2已经被其他宏处理name:emph,并给出缩写名称(如果在 biblatex 的配置中要求的话)。这意味着我必须根据 biblatex 中firstinits选项的配置声明不同的作者姓名。

非常感谢。

PS:我读过其他向参考书目条目添加元素的选项([1] 或者 [4]),但我不希望这样,因为我使用不支持添加字段的程序自动生成参考书目文件 (.bib)。我也尝试在 [5] 但我甚至无法编译该示例。

答案1

这里有几个问题。首先,您的代码使用了旧的名称格式 和firstlast两年来biblatex一直使用given和代替familyBiblatex 3.3 名称格式

所以你需要

\xpretobibmacro{name:family}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:given-family}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:family-given}{\begingroup\usebibmacro{name:emph}{#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}{}{} 

第二个问题与\ifstrequal{#2}{\authorgivenname}中的有关name:emph。您实际上需要的是\ifdefstrequal\ifstrequal直接将其两个参数作为字符串进行比较,并且不扩展任何内容。所以\ifstrequal{hallo}{hallo}是真的,但\def\hallo{hallo} \ifstrequal{\hallo}{hallo}不是真的。\authorgivenname已经是一个宏,#2最终将是宏\namepartgiven,所以我们在这里比较两个宏。这是用 完成的\ifdefstrequal

你的第三个问题是, 的名字首字母InBold, to Put实际上不是t. P.,而是t\bibinitperiod\bibinitdelim P\bibinitperiod。因此

\newcommand{\authorgivenname}{t\bibinitperiod\bibinitdelim P\bibinitperiod} 

有效。或者,您必须“规范化”这些命令以进行名称比较,如下所示在奥黛丽的回答中使用 biblatex 将特定作者设为粗体

在全

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@inproceedings{boldref, 
  AUTHOR = {InBold, to Put and Author, Non bold  and Highlight, Shine and  Ano, therOne},
  TITLE = {The title},
  BOOKTITLE = {The conference},
  PAGES = {65--78},
  YEAR = 2014}
\end{filecontents}

\usepackage{xpatch}
\usepackage{color}
\usepackage[backend=biber,bibencoding=utf8,style=numeric-comp,maxbibnames=99,firstinits=true]{biblatex}

\addbibresource{\jobname.bib}

\newcommand{\authorgivenname}{t\bibinitperiod\bibinitdelim P\bibinitperiod} 
\newcommand{\authorfamilyname}{InBold} 
\newcommand{\authorbibname}{\authorfamilyname, \authorgivenname} 

\newbibmacro*{name:emph}[2]{%
    First arugment: #1 =? \authorfamilyname \\
    Second argument: #2 =? \authorgivenname \\
    \ifdefstrequal{\authorgivenname}{#2}
    {
        \textcolor{green}{Evaluated to true: #1, #2} \\
    }
    {
        \textcolor{red}{Evaluated to false: #1, #2} \\
    }
}

\xpretobibmacro{name:family}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:given-family}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:family-given}{\begingroup\usebibmacro{name:emph}{#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}{}{} 


\begin{document}
\def\hallo{hallo}
\ifstrequal{\hallo}{hallo}{a}{b}

\nocite{*}
\noindent\fullcite{boldref}
\end{document}

事实证明,你的biblatex姓名已经超过 4 岁了。在这种情况下,你无需担心新姓名格式,可以继续使用

\xpretobibmacro{name:last}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:first-last}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}
\xpretobibmacro{name:last-first}{\begingroup\usebibmacro{name:emph}{#1}{#2}}{}{}    
\xpretobibmacro{name:delim}{\begingroup\normalfont}{}{}    

\xapptobibmacro{name:last}{\endgroup}{}{}
\xapptobibmacro{name:first-last}{\endgroup}{}{}
\xapptobibmacro{name:last-first}{\endgroup}{}{}    
\xapptobibmacro{name:delim}{\endgroup}{}{} 

在旧版本中,#2in\ifstrequal{#2}{\authorgivenname}不是一个宏而是一个字符串,\authorgivenname但它仍然是一个宏,所以你应该尝试

\ifdefstring{\authorgivenname}{#2}

以供比较。


除了这个解决方案,我建议您尝试我的回答使用 biblatex 将特定作者设为粗体而是。优点是您可以像在文件中一样输入名称,.bib并且答案会giveninits自动响应。

相关内容