在本质上是出版物列表的上下文中,我调用以下宏:
\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}
}
}
它存储在外部.tex
,通过 在序言中引用\input{<file name>}
,并在文档主体中通过以下方式调用:
\makeauthorbold{<author last name>}
在出版物列表中,实际上是多个出版物列表(想象每个工作组成员都有一个),参考书目按以下方式打印
% point to member a publication list
\newcommand\bibnamea{.../member_a.bib}
% add bib resource and define section title / heading
\addbibresource{\bibnamea}%
\def\sectiona{Member a publications}%
% print publication list for member a
\begin{numberedpublist}{\sectiona}{\bibnamea}{keyword={<keyword(s) to help filter>}}%
\end{numberedpublist}%
其中numberedpublist
环境定义如下
% define an environment for a numbered publication list
\newenvironment{numberedpublist}[3]
{%
\section*{#1}%
\begin{refsection}[#2]%
\nocite{*}%
\printbibliography[heading=none,env=bibenvnumberedpublist,#3]%
\end{refsection}%
}%
{}%
它也有相应的bibenvironment
定义,名为“bibenvnumberedpublist”(为简单起见省略)。
最终会得到一个包含 3 个参数的环境:bib 资源、标题以及您希望 bib 项目具有的关键字,以便它们有资格显示。通过使用\nocite*{}
,您无需处理任何 bibtexkeys;所有具有正确关键字的条目都会被打印出来。
问题是由于某种原因,\makeauthorbold{}
调用会导致错误,例如:
\begin{refsection} on input line 999 ended by \end{numberedpublist}
当我不使用时\makeauthorbold{}
,没有问题。我的猜测如下:
它们
\makeauthorbold{}
可以变得更加坚固。numberedpublist
我混合环境定义的 方式\refsection
可能\section
很古怪。
答案1
\makeauthorbold
当我们缩进位的定义时,这个问题更容易被发现(至少对我来说) 。
\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}
}
}
查看最后一个\ifthenelse
,读者会注意到它缺少分支<false>
。代码仅包含
\ifthenelse{<condition>}
{<true>}
而正确的语法应该是
\ifthenelse{<condition>}
{<true>}
{<false>}
<false>
当 LaTeX 尝试抓取某个参数时,却抓取了其他“看起来”像缺失参数的东西,那么缺失的参数在某些时候会导致错误。这可能会引发连锁反应。biblatex
不久前,在 bugtracker 上讨论过一个结构非常相似的问题:https://github.com/plk/biblatex/issues/874。对一些内部结构的更改意味着此错误在较新版本中可能产生比biblatex
以前更严重的后果。
语法修正后的版本如下
\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}
{}%
}
}
仔细检查输出后发现,此版本在列表中姓氏后的逗号方面存在一些不一致之处(如果有多个作者,则名字后面有一个逗号)。
该代码还完全绕过了所使用的任何常规名称格式化例程,biblatex
并且似乎打印了太多的逗号。
您可以在以下网址找到一些更优雅的粗体名称替代品使用 biblatex 将特定作者设为粗体(不要只采纳第一个答案,货比三家看看还有哪些其他选择)。