我想从biblatex
仅使用一个简单功能(即命令)的文档中删除对的依赖\textcite
。因此,我可以定义类似
\newcommand\textcite[2][]{\csname theauthorsof#2\endcsname\ \cite[#1]{#2}}
然后,对于\textcite{LABEL}
我的文档中的每个文档,添加如下定义:
\newcommand\theauthorsofLABEL{AUTHOR}
我如何才能自动创建这些命令?可以使用biblatex
并biber
生成上述作者信息。但是,结果应该硬编码到我的新 tex 文件中,以便生成的文档只需要老式的 bibtex。
答案1
这个答案由三部分组成。
.bst
第一部分说明了为什么仅从 LaTeX 内部自动提取任何给定样式的元数据很困难,并解释了如何natbib
(使用兼容样式)做到这一点。usebib
第二部分展示了使用在 LaTeX 内部直接将文件解析.bib
为键值数据的包来解决非名称字段不同的可能解决方案。- 显示一个概念验证
.bst
文件,该文件可以提取相关元数据并将其写入宏,以便它们可用于\textcite
问题中提出的伪造。
BibTeX 书目中的作者元数据和natbib
对于所有可能的 BibTeX 样式,没有简单的方法可以在 LaTeX 中执行此操作。但是,如果您愿意使用natbib
而不是纯 LaTeX,那么使用\citet
和natbib
兼容样式就可以正常工作。
主要障碍是 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)
可选参数中的位是\bibitem
LaTeX 将用来重现文档中的作者和年份信息。
如果您的.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}