我希望能够在命令中定义作者列表,并在参考书目或引文中突出显示它们。我正在使用比布拉特克斯使用我的乳胶文档(我最近无法更新我的操作系统,并且我正在使用包: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
这里有几个问题。首先,您的代码使用了旧的名称格式 和first
,last
两年来biblatex
一直使用given
和代替family
Biblatex 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}{}{}
在旧版本中,#2
in\ifstrequal{#2}{\authorgivenname}
不是一个宏而是一个字符串,\authorgivenname
但它仍然是一个宏,所以你应该尝试
\ifdefstring{\authorgivenname}{#2}
以供比较。
除了这个解决方案,我建议您尝试我的回答使用 biblatex 将特定作者设为粗体而是。优点是您可以像在文件中一样输入名称,.bib
并且答案会giveninits
自动响应。