这个自定义的 \makeauthorbold 宏可以变得更强大吗?

这个自定义的 \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}
  }
}

它存储在外部.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{},没有问题。我的猜测如下:

  1. 它们\makeauthorbold{}可以变得更加坚固。

  2. 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 将特定作者设为粗体(不要只采纳第一个答案,货比三家看看还有哪些其他选择)。

相关内容