通常,在.bib
IEEE、ACM 等出版物的条目中,可以添加一个名为“ copyright
”的字段来包含版权信息。然后,在使用书籍类和 BibTeX 准备的 LaTeX 文档中,如果按原样使用以前出版的作品中的图表,您如何进行如下条目:
图 XX 经许可复制自
\cite{key}{copyright}
?
PS 我试图避免使用该biblatex
包。 有没有仅使用 BibTeX 的快速解决方案?
答案1
这是 的工作usebib
。您可以定义一个新的 bib 字段copyright
,然后使用以下命令打印该字段的内容
\usebibentry{<bib key>}{copyright}
完整示例(图片类似于 moewe 的答案)。
\begin{filecontents}{\jobname.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
year = {1980},
copyright = {IEEE},
}
\end{filecontents}
\documentclass{article}
\usepackage{usebib} % the main one
% the next two are just for the picture
\usepackage{graphicx}
\usepackage{duckuments}
% load the bib file
\newbibfield{copyright}
\bibinput{\jobname}
\begin{document}
\begin{figure}
\centering
\includegraphics{example-image-duck}
\caption{A duck}\label{fig:duck}
\end{figure}
Figure~\ref{fig:duck} is \textcopyright\usebibentry{appleby}{copyright}.
\bibliographystyle{plain}
\bibliography{\jobname}
\end{document}
在您的文档中,使用正确文件的名称.bib
而不是\jobname
。
答案2
这并非不可能,但需要对文件进行一些调整.bst
。事实证明,我忘记了usebib
(参见 egreg 的回答),它已经提供了一个用于从.bib
文件读取字段的接口。usebib
使用不同的方法,它.bib
直接使用键值语法解析文件。
困难之处在于 LaTeX.bib
本身并不直接读取文件。相反,BibTeX 会读取文件.bib
并在文件中生成已排序和格式化的参考书目.bbl
。.bbl
然后,LaTeX 会读取此文件并将其变成参考书目。(您可以在使用问号或粗体引用关键字代替引用编号。
由于 LaTeX 本身从不读取.bib
文件,因此将copyright
信息传送给 LaTeX 的一种方法是指示 BibTeX 将其包含在文件中.bbl
- 不是以在输出中可见的方式,而只是以 LaTeX 可以使用的方式。这种方法有一个困难:当您在文件中.bbl
写入时,文件会被读取和处理。很有可能这是在您想要引用版权数据之后。我们可以尝试通过执行获取作者年份引用的作者和年份数据的操作来解决这个限制:我们在文件中添加一个命令,执行时将数据写入文件。在下一次运行 LaTeX 时,版权数据将在文件中可用,并将在文档开头、在发布任何版权引用之前进行处理。然后,无论何时您想要引用版权信息,都可以使用这些数据。\bibliography
.tex
natbib
.bbl
.aux
.aux
第一步是修改.bst
文件以传递版权数据。具体需要修改的内容取决于文件.bst
,但对于大多数样式来说,该过程应该几乎相同。
在下面https://gist.github.com/moewew/0fefe855a269f5eed06a5b6260f23bfd您可以在 中找到包含版权数据plain.bst
的修改版本。必要的更改是plain-copy.bst
.bbl
- 添加
copyright
到第一个参数中的已知字段列表中ENTRY
确保数据已写出。
plain.bst
这是通过修改函数output.bibitem
来实现的FUNCTION {output.bibitem} { newline$ "\bibitem{" write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := }
到
FUNCTION {output.bibitem} { newline$ "\bibitem{" write$ cite$ write$ "}\makeatletter\cc@bbl@citecopyright{" write$ cite$ write$ "}{" write$ copyright write$ "}\makeatother" write$ newline$ "" before.all 'output.state := }
更改的补丁是
--- plain.bst 2010-12-09 04:18:56.000000000 +0100
+++ plain-copy.bst 2018-06-13 10:10:10.732783800 +0200
@@ -1,12 +1,11 @@
-% BibTeX standard bibliography style `plain'
- % Version 0.99b (8-Dec-10 release) for BibTeX versions 0.99a or later.
+% BibTeX standard bibliography style `plain-copy'
+ % based on `plain.bst' version 0.99b (8-Dec-10 release)
% Copyright (C) 1984, 1985, 1988, 2010 Howard Trickey and Oren Patashnik.
% Unlimited copying and redistribution of this file are permitted as long as
% it is unmodified. Modifications (and redistribution of modified versions)
% are also permitted, but only if the resulting file is renamed to something
% besides btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
% This restriction helps ensure that all standard styles are identical.
- % The file btxbst.doc has the documentation for this style.
ENTRY
{ address
@@ -31,6 +30,7 @@
type
volume
year
+ copyright
}
{}
{ label }
@@ -86,7 +86,11 @@
{ newline$
"\bibitem{" write$
cite$ write$
- "}" write$
+ "}\makeatletter\cc@bbl@citecopyright{" write$
+ cite$ write$
+ "}{" write$
+ copyright write$
+ "}\makeatother" write$
newline$
""
before.all 'output.state :=
然后,您需要在文档前言中添加一些宏。
\usepackage{etoolbox}
\makeatletter
\newcommand*{\cc@bbl@citecopyright}[2]{%
\if@filesw
\write\@auxout{\string\cc@aux@citecopyright{#1}{#2}}%
\fi}
\newcommand*{\cc@aux@citecopyright}[2]{%
\csgdef{cc@data@citecopyright@#1}{#2}}
\newcommand*{\citecopyright}[1]{%
\ifcsundef{cc@data@citecopyright@#1}
{\textbf{?}%
\PackageWarning{'citecopyright'}{%
Copyright field for #1 not found}}
{\csuse{cc@data@citecopyright@#1}}}
\makeatother
\cc@bbl@citecopyright
是文件的命令.bbl
,将其参数写入.aux
文件并调用\cc@aux@citecopyright
它们。\cc@aux@citecopyright
只是保存数据以供以后使用,以便\citecopyright
可以访问它。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{graphicx}
\usepackage{duckuments}
%\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
year = {1980},
copyright = {IEEE},
}
\end{filecontents}
\usepackage{etoolbox}
\makeatletter
\newcommand*{\cc@bbl@citecopyright}[2]{%
\if@filesw
\write\@auxout{\string\cc@aux@citecopyright{#1}{#2}}%
\fi}
\newcommand*{\cc@aux@citecopyright}[2]{%
\csgdef{cc@data@citecopyright@#1}{#2}}
\newcommand*{\citecopyright}[1]{%
\ifcsundef{cc@data@citecopyright@#1}
{\textbf{?}%
\PackageWarning{'citecopyright'}{%
Copyright field for #1 not found}}
{\csuse{cc@data@citecopyright@#1}}}
\makeatother
\begin{document}
\begin{figure}
\centering
\includegraphics{example-image-duck}
\caption{A duck}\label{fig:duck}
\end{figure}
Figure~\ref{fig:duck} reproduced with permission from \citecopyright{appleby} \cite{appleby}
\bibliographystyle{plain-copy}
\bibliography{\jobname}
\end{document}
该文件至少需要使用以下命令进行编译:
pdflatex test
bibtex test
pdflatex test
pdflatex test
你说你不想切换到biblatex
,但只是为了好玩,这里有一个biblatex
解决方案。
这里我们“仅”需要告诉 Biber 我们的新字段copyright
。这可以通过数据模型文件完成copyright.dbx
。我们将其声明copyright
为文字列表,并让所有数据类型都知道它。
然后您可以使用它\citelist{<key>}{copyright}
来获取版权信息。但我发现定义一个专用宏\citecopyright
并使用它更好。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{graphicx}
\usepackage{duckuments}
%\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
year = {1980},
copyright = {IEEE},
}
\end{filecontents}
\begin{filecontents}{copyright.dbx}
\ProvidesFile{copyright.dbx}[2018/06/13 Copyright field for biblatex]
\DeclareDatamodelFields[type=list, datatype=literal]{copyright}
\DeclareDatamodelEntryfields{copyright}
\end{filecontents}
\usepackage[backend=biber, style=numeric, datamodel=copyright]{biblatex}
\addbibresource{\jobname.bib}
\DeclareCiteCommand{\citecopyright}
{\boolfalse{citetracker}%
\boolfalse{pagetracker}%
\usebibmacro{prenote}}
{\printlist{copyright}}
{\multicitedelim}
{\usebibmacro{postnote}}
\begin{document}
\begin{figure}
\centering
\includegraphics{example-image-duck}
\caption{A duck}\label{fig:duck}
\end{figure}
Figure~\ref{fig:duck} reproduced with permission from \citecopyright{appleby} \cite{appleby}
\printbibliography
\end{document}