BibTeX 书目中的作者元数据和natbib

BibTeX 书目中的作者元数据和natbib

我想从biblatex仅使用一个简单功能(即命令)的文档中删除对的依赖\textcite。因此,我可以定义类似

\newcommand\textcite[2][]{\csname theauthorsof#2\endcsname\ \cite[#1]{#2}}

然后,对于\textcite{LABEL}我的文档中的每个文档,添加如下定义:

\newcommand\theauthorsofLABEL{AUTHOR}

我如何才能自动创建这些命令?可以使用biblatexbiber生成上述作者信息。但是,结果应该硬编码到我的新 tex 文件中,以便生成的文档只需要老式的 bibtex。

答案1

这个答案由三部分组成。

  1. .bst第一部分说明了为什么仅从 LaTeX 内部自动提取任何给定样式的元数据很困难,并解释了如何natbib(使用兼容样式)做到这一点。
  2. usebib第二部分展示了使用在 LaTeX 内部直接将文件解析.bib为键值数据的包来解决非名称字段不同的可能解决方案。
  3. 显示一个概念验证.bst文件,该文件可以提取相关元数据并将其写入宏,以便它们可用于\textcite问题中提出的伪造。

BibTeX 书目中的作者元数据和natbib

对于所有可能的 BibTeX 样式,没有简单的方法可以在 LaTeX 中执行此操作。但是,如果您愿意使用natbib而不是纯 LaTeX,那么使用\citetnatbib兼容样式就可以正常工作。

主要障碍是 BibTeX 样式仅格式化参考书目并将简单的thebibliography环境转储到文件中.bbl。由 生成的参考书目unsrt可能看起来像

\begin{thebibliography}{1}

\bibitem{sigfridsson}
Emma Sigfridsson and Ulf Ryde.
\newblock Comparison of methods for deriving atomic charges from the
  electrostatic potential and moments.
\newblock {\em Journal of Computational Chemistry}, 19(4):377--395, 1998.

\end{thebibliography}

请注意,这只是要排版的文本。没有可用于 LaTeX 格式的作者元数据。您必须解析整个条目才能提取作者数据。虽然这并非不可能(我猜),但我不想使用 LaTeX 代码来做到这一点(另外,您无法确定文件生成的格式.bst:参考书目条目可能看起来截然不同)。

natbib的作者年份引文(以及作者编号\citet)通过将作者和年份信息以机器可读格式传递给 LaTeX 来工作。使用 处理的相同条目unsrtnat将输出为(缩短)

\begin{thebibliography}{1}

\bibitem[Sigfridsson and Ryde(1998)]{sigfridsson}
Emma Sigfridsson and Ulf Ryde.
\newblock Comparison of methods for deriving atomic charges from the
  electrostatic potential and moments.
\newblock \emph{Journal of Computational Chemistry}, 19\penalty0 (4):\penalty0
  377--395, 1998.
\newblock \doi{10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P}.

\end{thebibliography}

Sigfridsson and Ryde(1998)可选参数中的位是\bibitemLaTeX 将用来重现文档中的作者和年份信息。

如果您的.bst文件没有提供这些元数据,那么几乎不可能在 LaTeX 端获取它们。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[numbers]{natbib}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{sigfridsson,
  author  = {Sigfridsson, Emma and Ryde, Ulf},
  title   = {Comparison of methods for deriving atomic charges from the
             electrostatic potential and moments},
  journal = {Journal of Computational Chemistry},
  year    = 1998,
  volume  = 19,
  number  = 4,
  pages   = {377-395},
  doi     = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
}
\end{filecontents}

\begin{document}
\citet{sigfridsson}
\bibliographystyle{unsrtnat}
\bibliography{\jobname}
\end{document}

因此,除了使用natbib和作者年份兼容的样式之外,唯一的解决方案就是破解.bst样式以提供必要的信息(这在很多情况下是可能的并且很简单,但并不比natbib一开始使用更容易或更便携)或者需要不同的外部工具来处理.bib.bbl提取必要的元数据(再次,这似乎需要更多的工作 - 见下文)。


usebib

该包usebib允许我们.bib直接从 LaTeX 中读取文件中的数据。对于这种情况,它可能非常有用,但不幸的是,名称字段需要由 BibTeX 解析,而这种名称解析超出了 的范围usbib,因此

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{usebib}
\newbibfield{author}
\bibinput{\jobname}

\begin{document}
\usebibentry{sigfridsson}{author}
\end{document}

无法产生令人满意的结果。我不想在 LaTeX 中解析名称,尽管使用 LaTeX3 及其 RegExp 模块可以实现类似的操作(RegExp 很有趣,但它们通常不能很好地处理任意 LaTeX 语法,因为它们对分组和括号级别的理解很差,但对于简单的名称来说可能就足够了)。


.bib使用 BibTeX直接从

由于其biblatex工作方式,它不能轻易地将格式化数据写入外部文件。Biber 可能是一种选择,但它不能被编程来轻松地完成这些事情(而且 Biber 决定不进行格式化,它只稍微消化原始数据)。我会说 BibTeX 是你最好的选择,因为 BibTeX 完全有能力解析名称列表、格式化它们并将其写入文件以供以后使用 LaTeX。

以下是一个概念证明,展示了如何使用 BibTeX 为您创建名称宏。当然,输出不会响应biblatex原始文档中可能已激活的任何选项或语言设置。所有这些都硬编码在 中.bst

节省

ENTRY
  { author
    editor
    key
    year
    organization
  }
  {}
  { short.list }

STRINGS { s t }

FUNCTION {not}
{   { #0 }
    { #1 }
  if$
}

FUNCTION {and}
{   'skip$
    { pop$ #0 }
  if$
}

FUNCTION {or}
{   { pop$ #1 }
    'skip$
  if$
}

FUNCTION {field.or.null}
{ duplicate$ empty$
    { pop$ "" }
    'skip$
  if$
}

INTEGERS { len }

FUNCTION {chop.word}
{ 's :=
  'len :=
  s #1 len substring$ =
    { s len #1 + global.max$ substring$ }
    's
  if$
}

INTEGERS { nameptr namesleft numnames }

FUNCTION {format.full.names}
{'s :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
      "{vv~}{ll}" format.name$ '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$
}

FUNCTION {author.editor.full}
{ author empty$
    { editor empty$
        { "" }
        { editor format.full.names }
      if$
    }
    { author format.full.names }
  if$
}

FUNCTION {author.full}
{ author empty$
    { "" }
    { author format.full.names }
  if$
}

FUNCTION {editor.full}
{ editor empty$
    { "" }
    { editor format.full.names }
  if$
}

FUNCTION {make.full.names}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.full
    { type$ "proceedings" =
        'editor.full
        'author.full
      if$
    }
  if$
}

FUNCTION {format.lab.names}
{ 's :=
  s #1 "{vv~}{ll}" format.name$
  s num.names$ duplicate$
  #2 >
    { pop$ " et~al." * }
    { #2 <
        'skip$
        { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
            { " et~al." * }
            { " and " * s #2 "{vv~}{ll}" format.name$ * }
          if$
        }
      if$
    }
  if$
}

FUNCTION {author.key.label}
{ author empty$
    { key empty$
        { cite$ #1 #3 substring$ }
        'key
      if$
    }
    { author format.lab.names }
  if$
}

FUNCTION {author.editor.key.label}
{ author empty$
    { editor empty$
        { key empty$
            { cite$ #1 #3 substring$ }
            'key
          if$
        }
        { editor format.lab.names }
      if$
    }
    { author format.lab.names }
  if$
}

FUNCTION {author.key.organization.label}
{ author empty$
    { key empty$
        { organization empty$
            { cite$ #1 #3 substring$ }
            { "The " #4 organization chop.word #3 text.prefix$ }
          if$
        }
        'key
      if$
    }
    { author format.lab.names }
  if$
}

FUNCTION {editor.key.organization.label}
{ editor empty$
    { key empty$
        { organization empty$
            { cite$ #1 #3 substring$ }
            { "The " #4 organization chop.word #3 text.prefix$ }
          if$
        }
        'key
      if$
    }
    { editor format.lab.names }
  if$
}

FUNCTION {calc.short.authors}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
        'editor.key.organization.label
        { type$ "manual" =
            'author.key.organization.label
            'author.key.label
          if$
        }
      if$
    }
  if$
  'short.list :=
}

FUNCTION {write.fncitedata}
{ "\expandafter\def\csname fncite@" swap$ * "@" * write$
  cite$ write$
  "\endcsname{%" write$
  newline$
  "" swap$ * "}" * write$
}

FUNCTION {output.bibinfo}
{ calc.short.authors
  short.list "labelname" write.fncitedata
  newline$
  make.full.names
  duplicate$ "" =
    'pop$
    { "fullname" write.fncitedata }
  if$
  newline$
  year
  duplicate$ empty$
    'pop$
    { "year" write.fncitedata }
  if$
  newline$
  newline$
}

% avoid a warning
FUNCTION {article}{}
FUNCTION {book}{}
FUNCTION {booklet}{}
FUNCTION {inbook}{}
FUNCTION {incollection}{}
FUNCTION {inproceedings}{}
FUNCTION {conference}{}
FUNCTION {manual}{}
FUNCTION {mastersthesis}{}
FUNCTION {misc}{}
FUNCTION {phdthesis}{}
FUNCTION {proceedings}{}
FUNCTION {techreport}{}
FUNCTION {unpublished}{}
FUNCTION {default.type} { misc }

READ

ITERATE {output.bibinfo}

作为citeauthor.bst

在文档中将该文件用作普通 BibTeX 样式

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{sigfridsson,
  author  = {Sigfridsson, Emma and Ryde, Ulf},
  title   = {Comparison of methods for deriving atomic charges from the
             electrostatic potential and moments},
  journal = {Journal of Computational Chemistry},
  year    = 1998,
  volume  = 19,
  number  = 4,
  pages   = {377-395},
  doi     = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
}
\end{filecontents}

\begin{document}
\nocite{sigfridsson,geer,aksin}
\bibliographystyle{citeauthor}
\bibliography{\jobname}
\end{document}

这将产生.bbl类似

\expandafter\def\csname fncite@labelname@sigfridsson\endcsname{%
Sigfridsson and Ryde}
\expandafter\def\csname fncite@fullname@sigfridsson\endcsname{%
Sigfridsson and Ryde}
\expandafter\def\csname fncite@year@sigfridsson\endcsname{%
1998}

您可以将其复制到文档的前言部分,并按如下方式使用

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}

\expandafter\def\csname fncite@labelname@sigfridsson\endcsname{%
Sigfridsson and Ryde}
\expandafter\def\csname fncite@fullname@sigfridsson\endcsname{%
Sigfridsson and Ryde}
\expandafter\def\csname fncite@year@sigfridsson\endcsname{%
1998}

\newcommand\textcite[1]{\csname fncite@labelname@#1\endcsname\ \cite{#1}}

\begin{document}
\textcite{sigfridsson}

\begin{thebibliography}{1}
\bibitem{sigfridsson}
Emma Sigfridsson and Ulf Ryde.
\newblock Comparison of methods for deriving atomic charges from the
  electrostatic potential and moments.
\newblock {\em Journal of Computational Chemistry}, 19(4):377--395, 1998.
\end{thebibliography}
\end{document}

相关内容