通过修改 apalike 样式使用 BibTeX 为特定作者姓名添加粗体字体

通过修改 apalike 样式使用 BibTeX 为特定作者姓名添加粗体字体

当某个特定的作者姓名出现在文中参考文献中时,我想将其以粗体显示。

我正在遵循这个答案建议修改*.bst文件以适应我的引用风格。更具体地说,答案是修改函数format.names

我的问题是,对于我的特定风格,apalike我不知道如何更改format.names。我尝试将highlight.if.custom.author(应用的自定义函数\textbf)放在不同的行上format.names,但这要么导致 BibTeX 错误,要么使所有作者姓名消失。

有关期望结果的详细信息:

  • 在下面的 MWE 中,当它由 产生时,我想以粗体显示“Koehn, P.” \bibentry
  • 如果可能的话,我不想在常规引用(例如\citep)中使用粗体字体,并且我的链接仍应该是彩色的。
  • 如果可能的话,我也不希望最后的参考书目包含粗体字体。

平均能量损失

Tex 文件:

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{natbib}
\usepackage{bibentry}
\usepackage[colorlinks=true, allcolors=blue]{hyperref}

\nobibliography*

\title{MWE}

\begin{document}

\maketitle

\section{MWE}

Here is a sentence with a regular reference \citep{Koehn2017}. \\

\noindent Here is a list of all contributions, some by an important author in \textbf{bold}:

\begin{itemize}
    \item \bibentry{Koehn2017}
    \item \bibentry{Lison2016}
    \item \bibentry{koehn2005epc}
\end{itemize}


\clearpage

\bibliographystyle{apalike}
\bibliography{bibliography}

\end{document}

参考书目文件bibliography.bib

@InProceedings{Koehn2017,
  author =  {Koehn, Philipp
     and Knowles, Rebecca},
  title = {{Six Challenges for Neural Machine Translation}},
  booktitle = "Proceedings of the First Workshop on Neural Machine Translation",
  year =    "2017",
  publisher =   "Association for Computational Linguistics",
  pages =   "28--39",
  location =    "Vancouver, Canada"
}
@InProceedings{Lison2016,
  author =  {Lison, Pierre and
            Tiedemann, Jörg},
  title = {{OpenSubtitles2016: Extracting Large Parallel Corpora from Movie and TV Subtitles}},
  booktitle = "Proceedings of the 10th International Conference on Language Resources and Evaluation (LREC 2016)",
  year =    "2016",
  publisher =   "European Language Resources Association (ELRA)",
  editor = {Nicoletta Calzolari (Conference Chair) and Khalid Choukri and Thierry Declerck and Sara Goggi and Marko Grobelnik and Bente Maegaard and Joseph Mariani and Helene Mazo and Asuncion Moreno and Jan Odijk and Stelios Piperidis},
  pages = "923--929",
  location = {Portorož, Slovenia}
}

@inproceedings{koehn2005epc,
  added-at = {2010-11-10T15:46:05.000+0100},
  address = {Phuket, Thailand},
  author = {Koehn, Philipp},
  biburl = {https://www.bibsonomy.org/bibtex/205e5fa13fd7ba7992aedfe3514379a1f/unhammer},
  booktitle = {{Conference Proceedings: the tenth Machine Translation Summit}},
  interhash = {abd06b551527865eb50e21508841b6de},
  intrahash = {05e5fa13fd7ba7992aedfe3514379a1f},
  keywords = {Corpus Europarl MT Master},
  organization = {AAMT},
  pages = {79--86},
  publisher = {AAMT},
  timestamp = {2010-11-10T15:46:05.000+0100},
  title = {{Europarl: A Parallel Corpus for Statistical Machine Translation}},
  url = {http://mt-archive.info/MTS-2005-Koehn.pdf},
  year = 2005
}

更改apalike.bst

FUNCTION {custom.author}
{ "Koehn, P." }

FUNCTION {highlight}
{ duplicate$ empty$
      { pop$ "" }
      { "\textbf{" swap$ * "}" * }
   if$
}

FUNCTION {highlight.if.custom.author}
{ duplicate$ purify$ custom.author purify$ =
    { highlight }
    'skip$
  if$
}

背面链接至 MWE

https://www.overleaf.com/read/vmbzpdtqrqnm

答案1

快完成了!我修改了format.names函数,让它说

FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't :=   % last name first
      t highlight.if.custom.author 't :=
      nameptr #1 >
        { namesleft #1 >
            { ", " * t * }
            { numnames #2 >
                { "," * }
                'skip$
              if$
              t "others" =
                { " et~al." * }
                { " and " * t * }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

也就是说,你插入行t highlight.if.custom.author 't :=

这会将特殊作者在所有地方都显示为粗体。控制其显示位置最好在 LaTeX 中完成。为此,请在 的.tex序言中输入

\def\specialAuthor#1{#1}

并将\textbf中的替换.bst\specialAuthor

现在,对于我们想要加粗格式的列表,将其像这样括起来:

\def\specialAuthor#1{\textbf{#1}}
\begin{itemize}
    \item \bibentry{Koehn2017}
    \item \bibentry{Lison2016}
    \item \bibentry{koehn2005epc}
\end{itemize}
\def\specialAuthor#1{#1}

这里我们暂时为特殊作者更改了样式。如果您希望将样式更改专门用于\bibentry,请在评论中询问我,但如果您像在 MWE 中一样使用它,我更喜欢上面的代码片段。

希望这个答案对你有帮助!有吗?

编辑:

有关 bibtex 代码的更多信息。首先,我必须提到 TameTheBest 手册,它全是关于这种奇怪的 bibtex 语言的:http://tug.ctan.org/info/bibtex/tamethebeast/ttb_en.pdf,这是开始深入探索的绝佳资源。

Bibtex 语言是一种非常奇怪的语言,它有一个核心概念:堆栈。如果我说“"aa" "bb" *那么我已经将两个字符串放入堆栈中”。然后*执行“那么”,它会消耗堆栈的最后两个元素,并将它们的连接放在堆栈上。

然后,你可以将该连接的值赋给某个​​对象。例如

"aa" "bb" * 'myvar :=

连接"aa"and "bb"( "aabb"),然后将变量myvar放入堆栈,然后:=执行。然后将堆栈中的倒数第二个元素分配给堆栈中的最后一个元素。

现在回到这篇文章: 的format.names任务是整理一份格式化的作者列表。例如,您会发现,输入“,”和截断为“et al.”是有逻辑的。

在我添加的那一行之前的一行中,t指定了作者的姓名,格式已经是格式化的,例如“Koehn, P.”现在我的行​​:

t highlight.if.custom.author 't :=

我将值放在t堆栈上。然后highlight.if.custom.author调用函数,查看堆栈上的内容,并将其替换为额外格式的字符串。(即,\specialAuthor如果需要,则添加。)

然后我再次将其放入t堆栈,但前面加了一个重音;我们不需要t堆栈上的值,而是捕获的变量t本身。这是因为我们接下来有:=,它将这个新格式化的作者姓名分配给t

您会看到,后面的行,例如", " * t *t再次被使用。我们正在构建所有作者的字符串,当前构建的是堆栈中的最后一项。因此,", " *附加", "到当前构建的字符串。接下来,我们的t被声明,它也被附​​加。

再加一个额外解释:

nameptr #1 >
{
    ...
}
't
if$

首先nameptr #1 >将变量的值放入堆栈:我们是在处理第一个作者(数字 1),第二个作者(数字 2),......?接下来,将数字“1”添加到堆栈中。然后,计算“>”。它检查是否nameptr大于1。如果是,则将1(true),否则将0(false)放入堆栈(并消耗比较值)。

接下来是三件事,一个组{...},一个捕获变量't,和if$。 if 函数回顾三项。它在那里找到我们之前1的 或0。如果 ,1它执行它后面的堆栈项(此处为“组”),如果 ,0它扩展我们捕获的't。假设是后一种情况。然后,我们捕获的扩展被评估为t被放置在堆栈上。

对于任何其他名称,我们都位于第二个名称或更多,并且我们需要更复杂的逻辑,例如,andet al.插入。这是由组中的代码完成的,它将其值附加到我们为案例放入堆栈的字符串中,当时情况nameptr仍然是1

注意使用 时捕获的重要性if$:例如,使用 而不是'tthere had been skip$(意思是:什么也不做),然后我们的 bibtex 语言执行skip$,当它到达 时if$,它的堆栈上只有两个项目! 已经skip$消失了!因此,要么你必须对事物进行分组,要么作为一种快捷方式,通过在它前面加上 来捕获它'。在这种情况下,'skip$将作为函数放在堆栈上,并且确实被识别为 -clause else

这些都是相当多的解释,希望它能让你有所领悟。请参阅野兽,驯服野兽,了解更多信息!:)

相关内容