我不知道这是否是讨论基本设计问题的论坛,但一段时间以来,我一直在思考\cite
命令的演变。使用作者年份格式的 natbib,\citep
需要获得像 [Jones 2010] 这样的引文。如果使用普通格式,\cite
则会得到 Jones [2010]。使用较新的软件包,您还会有其他变体,例如\parencite
。
我觉得奇怪的是将默认引用格式设为变量。为什么不\cite
给你通常想要的东西,如果你想让作者姓名退出引用符号,你可以使用特殊符号来实现,如果切换到数字格式,这个符号就可以起作用?如果你使用数字格式,\cite
会给你一个简单的引用,所以如果你使用作者年份格式并更改它,那么像“根据琼斯 [2010]”这样的内容就会变成“根据 [42]”,读起来不太好。
比如这个怎么样?
\cite{key}
– 默认样式格式 ([Jones 2010], [42] 等)\citename{key}
– 作者姓名(例如 Jones – 带有样式定义的选项,例如何时使用 et al.)\citeyear{key}
- 年\citename[cite]{key}
– 作者姓名以及其他需要完成引用的内容 – 例如,Jones [2010] 或 Jones [42]。
目前的工作方式很麻烦,因为切换样式等应该不需要重新拼写引用标记。而且最简单的符号可以从正确切换到错误。
答案1
设计问题,特别是为什么这些问题总是有点难以回答,除非您是开发人员,或者有关于开发过程中决策过程的详尽文档。如果没有这种内部信息,答案通常可以归结为:因为事情就是这样。
至少在标准 LaTeX 和 BibTeX 中,引用和参考书目是紧密相关的,因此本次讨论将同时涉及这两者。
LaTeX 内核
在标准 LaTeX 类中,参考书目环境thebibliography
基本上是环境的稍微扩展版本,enumerate
它使用\bibitem
而不是\item
。\cite
或多或少是\ref
一个由 生成的标签\bibitem
(与通常的\ref
\cite
可以接受几个逗号分隔的键并具有可选的后记参数不同,此外所有的\cite
s 都记录在.aux
文件中,因此实际实现比 复杂得多\ref
,但想法是一样的)。
对于简单形式的数字引用来说,这种设置非常自然
[1] 和 [1, 2]
因为它们在许多 STEM 领域很常见。
可选参数\bibitem
可用于覆盖自动生成的数字标签,这对于以下形式的字母标签很方便
[SR98] 和 [SR98, Nus78]
尽管您必须手动提供标签。
BibTeX
普通的 BibTeX 样式只是自动生成一个thebibliography
用于 LaTeX 的环境。因此,它可以帮助您自动计算条目的字母标签。但 BibTeX 很少干涉和本身的实现\cite
。thebibliography
这意味着引文的输出基本保持不变。
理论上,可以使用可选参数\bibitem
将完整的作者年份标签(形式为“Sigfridsson and Ryde 1998”)传递给 LaTeX。此外,thebibliography
可以重新定义以删除参考书目中的标签,并且可以删除方括号,以便\cite
可以用来获得
Sigfridsson 和 Ryde 1998 和 Sigfridsson 和 Ryde 1998,Nussbaum 1978
这就是apalike.bst
标准apalike.sty
BibTeX 所做的。但这可能不令人满意,因为 LaTeX 实际上并不知道此处引用的作者和年份,它只知道整个标签。因此很难制作一种打印
Sigfridson 和 Ryde 1998
在某一时刻输出一些略有不同的东西,例如
Sigfridson 和 Ryde (1998)
在另一点上。
有一些软件包可以很轻松地cite
修改命令的输出\cite
(cite
也可以做其他好的事情),但它们无法真正改变只有一个引用标签、因此实际上只有一个\cite
命令的根本限制。
基于 BibTeX 的扩展包
“一个标签”方法的局限性使得人们想出了将条目的一些原始信息偷偷带回 LaTeX 的方法。样式不仅仅告诉 LaTeX 条目的标签是“Sigfridsson and Ryde 1998”,还告诉 LaTeX 该条目的作者列表是“Sigfridsson and Ryde”,年份是“1998”。这个想法使得可以实现具有不同\cite
输出的几个不同的类似命令。
执行此操作的包通常会重新定义\cite
(并且可能thebibliography
)并依赖于.bst
使用提供的接口传递作者和年份信息的特定样式。
一个很早以前就能实现这个功能的包是newapa
从 1985 年开始(至少根据 CTAN 页面,源代码提到 2.0 版本来自 1991 年 7 月),它定义了以下命令
% The ``newapa.bst'' BibTeX bibliography style creates citations with labels:
% \citeauthoryear{author-info}{abbrev. author-info}{year}
[...]
% \cite[optional notes]{Key(s)}
% -> (Authors1, Year1; Authors2, Year2; ..., optional notes)
% \citeA[optional notes]{key}
% -> Authors (Year, optional notes)
% Note: ONE AND ONLY ONE KEY.
% \citeA[pp.~3--5]{Apt88,Lloyd87} does not make sense at all.
% In this case, the outcome will look aweful.
% \citeB{keys}
% -> Authors1 (Year1), Authors2 (Year2), ...
% Note: \citeB[Notes]{keys} are given, notes will be ingored,
% because it does not make sense at all.
% \citeauthor[optional notes]{key}
% -> Authors1, Authors2, ..., optional notes
%
% The difference between `\shortciteXXX' and `\citeXXX':
% is that `\shortciteXXX' gives `First author et al.'
% if no. authors >= 3.
[... \shortcite ...]
% \citeyear[optional notes]{key}
% -> (Year, optional notes)
%
chicago
自 1992 年以来,它基于newapa
并遵循类似的方法,并定义
% The ``chicago'' BibTeX bibliography style creates citations with labels:
% \citeauthoryear{author-info}{abbrev. author-info}{year}
%
% These labels are processed by the following LaTeX commands:
%
% \cite{key}
% which produces citations with full author list and year.
% eg. (Brown 1978; Jarke, Turner, Stohl, et al. 1985)
% \citeNP{key}
% which produces citations with full author list and year, but without
% enclosing parentheses:
% eg. Brown 1978; Jarke, Turner and Stohl 1985
% \citeA{key}
% which produces citations with only the full author list.
% eg. (Brown; Jarke, Turner and Stohl)
% \citeANP{key}
% which produces citations with only the full author list, without
% parentheses eg. Brown; Jarke, Turner and Stohl
% \citeN{key}
% which produces citations with the full author list and year, but
% can be used as nouns in a sentence; no parentheses appear around
% the author names, but only around the year.
% eg. Shneiderman (1978) states that......
% \citeN should only be used for a single citation.
% \shortcite{key}
% which produces citations with abbreviated author list and year.
% \shortciteNP{key}
% which produces citations with abbreviated author list and year.
% \shortciteA{key}
% which produces only the abbreviated author list.
% \shortciteANP{key}
% which produces only the abbreviated author list.
% \shortciteN{key}
% which produces the abbreviated author list and year, with only the
% year in parentheses. Use with only one citation.
% \citeyear{key}
% which produces the year information only, within parentheses.
% \citeyearNP{key}
% which produces the year information only.
%
这harvard
包定义(以及下面的其他命令和变体)
\citeasnoun
对于形式的引用Sigfridsson 和 Ryde (1998)
\cite
对于形式的引用(Sigfridsson 和 Ryde 1998)
\citeyear
(1998)
\citename
西格弗里德森和赖德
最后natbib
在许多其他命令(例如\citeyear
和\citeauthor
)中定义主要命令
\citet
Sigfridsson 和 Ryde (1998)
\citep
(Sigfridsson 和 Ryde,1998)
natbib
也明确弃用\cite
\citep
和都由和\citet
定义natbib
,因此不是标准的。\cite
应避免使用标准 LaTeX 命令,因为它的行为类似于\citet
作者年份引用,但类似于\citep
数字引用。
请注意,与之前提到的包不同,它natbib
同时支持作者年份和数字引用。
natbib.dtx
\cite
包含关于、\citet
和的历史的非常有趣的评论\citep
,我在此完整引用
% \begin{macro}{\citet}
% \changes{6.2}{1996 Jan 11}{Add macro for textual cite in numerical mode}
% \changes{6.5}{1997 Jan 30}{Make this standard textual citation, with notes}
% \changes{6.6}{1997 May 26}{Define with \cs{ifNAT@par} on}
% \changes{6.6}{1997 May 27}{Redefine for new coding of \cs{@citex}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% Textual citations are made with the |\citet| command, which has a starred
% form for full authors, and may have one or two optional arguments for notes.
%
% This command is equivalent to the older syntex |\cite|\marg{key} without
% optional arguments, at least in author--year mode. In numerical mode,
% it prints the authors and then the numerical reference, whereas |\cite|
% will only print the number. This simplifies the switching between the two
% modes with minimal changes in text. One wants to replace ``as shown by Jones
% et~al.\ (1990)'' with ``as shown by Jones et~al.\ [21]''; with |\cite|,
% one would get ``as shown by [21]''.
%
% This is such a practical idea, that I have decided to make it the standard
% means of textual citing. It now even allows optional notes in textual cites,
% something that I have been asked to provide, and which is impossible under
% the old syntex with |\cite|.
%
% Note that the flag |\ifNAT@swa| determines if the citation is textual or
% parenthetical, and |\ifNAT@full| whether abbreviated or full author names
% are to be printed.
% The flag |\ifNAT@par| enables the opening and closing parentheses; this is
% used only to suppress these for |\citealt| below.
%
% The flag |\NAT@ctype| controls what |\@citex| actually outputs: author and
% year (0), author only (1), year only (2). (For numerical mode, 0 yields
% author [number].)
%
% All the citation commands are placed inside a group; they start
% with |\begingroup|, with the corresponding |\endgroup| added to
% the |\@cite| command. This localizes the flag settings so that cites may
% be contained with cites, as
% \begin{quote}
% |\citep[cited in \citealp{xx}]{yy}|
% \end{quote}
% (Without the localization, the |\citealp| turns off the brackets before
% |\citep| comes to an end.)
% \begin{macrocode}
\newif\ifNAT@full\NAT@fullfalse
\newif\ifNAT@swa
\DeclareRobustCommand\citet
{\begingroup\NAT@swafalse\let\NAT@ctype\z@\NAT@partrue
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
\newcommand\NAT@citetp{\@ifnextchar[{\NAT@@citetp}{\NAT@@citetp[]}}
\newcommand\NAT@@citetp{}
\def\NAT@@citetp[#1]{\@ifnextchar[{\@citex[#1]}{\@citex[][#1]}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\citep}
% \changes{5.5}{1995 Mar 27}{Add macro as shorthand for \cs{cite[]}}
% \changes{6.5}{1997 Jan 30}{Make this standard parenthetical citation,
% with notes}
% \changes{6.6}{1997 May 26}{Define with \cs{ifNAT@par} on}
% \changes{6.6}{1997 May 27}{Redefine for new coding of \cs{@citex}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% Parenthetical citations are made with the |\citep| command, which has a
% starred form for full authors, and may have one or two optional arguments for
% notes.
%
% This command was originally added by special request to be a simplification
% for |\cite[]|\marg{key}, and I added it grudgingly. After I reprogrammed
% \thestyle\ to handle author--year and numerical citations with the same
% \texttt{.bst} file, I needed to add the |\citet| command, and this one
% became an obvious companion for parenthetical citations. I have now altered
% its coding to be the standard, being fully equivalent in functionality
% to the older syntax |\cite|\oarg{pre}\oarg{post}\marg{key}.
% \begin{macrocode}
\DeclareRobustCommand\citep
{\begingroup\NAT@swatrue\let\NAT@ctype\z@\NAT@partrue
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cite}
% \changes{5.0}{1994 May 18}{Add a second optional argument.}
% \changes{5.3}{1994 Sep 19}{Add starred version to print full author list.}
% \changes{5.4}{1994 Nov 24}{Replace \cmd{\if@tempswa} with \cmd{\ifNAT@swa}.}
% \changes{6.5}{1997 Jan 30}{Declare obsolete, retained for compatibility}
% \changes{6.6}{1997 May 27}{Redefine for new coding of \cs{@citex}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% The |\cite| command was originally used to produce both textual and
% parenthetical citations; with an option argument, even an empty one,
% the citation was parenthical. I now recommend the use of |\citet| and
% |\citep| instead, retaining |\cite| only for compatibility.
%
% In numerical mode, it must be parenthetical (|ifNAT@swa| \meta{true}) both
% with and without notes, so that it emulates the standard \LaTeX\ usage. In
% author--year mode, this flag depends on presence or absence of notes.
% \begin{macrocode}
\DeclareRobustCommand\cite
{\begingroup\let\NAT@ctype\z@\NAT@partrue\NAT@swatrue
\@ifstar{\NAT@fulltrue\NAT@cites}{\NAT@fullfalse\NAT@cites}}
\newcommand\NAT@cites{\@ifnextchar [{\NAT@@citetp}{%
\ifNAT@numbers\else
\NAT@swafalse
\fi
\NAT@@citetp[]}}
% \end{macrocode}
% \end{macro}
最初natbib
没有和\citep
,\citet
并且作者年份引用的行为\cite
会根据可选(页码/后注)参数的存在而改变。引入\citet
和\citep
意味着有一个一致的界面,即使样式从作者年份更改为数字,它也会保持稳定,但的行为\cite
保持相同以实现向后兼容。至于\cite
最初为什么会这样表现,我只能提供猜测:尝试重新定义是显而易见的选择\cite
,因为人们知道这一点。数字行为很可能出于兼容性原因与标准 LaTeX 保持一致(并且因为它很有意义)。作者年份行为可能源于不想为“(Nussbaum, 1978)”和“Nussbaum (1978)”引入不同的命令。如果存在可选的论据,则引用指的是来源中的特定点,在这种情况下,“(Nussbaum, 1978, p. 30)”形式通常比“Nussbaum (1978, p. 30)”更合适。如果没有论据,则可以轻松标记为更简单的文本引用“Nussbaum (1978)”。
当我们谈论参考书目样式的演变时,应该提到的另一个引用包是jurabib
.bst
,尤其是因为我将它视为传统 BibTeX样式与之间的纽带biblatex
。但说到 时,它就相当无趣了\cite
。该包定义\cite
为提供不带括号的引文和\footcite
脚注中的引文。此外,它还模拟了natbib
和\citep
。\citet
它的\citefield
命令可能是一个新功能。
biblatex
biblatex
比前面提到的软件包出现得晚得多,完全重新实现了引用和参考书目处理。biblatex
还附带了另一组引用命令等
\cite
Sigfridsson 和 Ryde 1998 // [2]
\parencite
(Sigfridsson 和 Ryde 1998)//[2]
\textcite
Sigfridsson 和 Ryde (1998) // Sigfridsson 和 Ryde [2]
它还定义了\autocite
(我强烈推荐)以便更轻松地在引用样式之间切换。
简单回顾一下:标准 LaTeX 仅具有数字和字母引用\cite
功能\cite
。有相当多的额外软件包可以增强 LaTeX 的引用和参考书目界面,并且每个软件包都定义了一组略有不同的命令,其行为也略有不同。
每个软件包作者都有他们自己做事的理由,从方便性而非美观考虑,到实际限制和向后兼容性……
“为什么没有给你你通常想要的东西?”这个问题的答案\cite
是,从一开始就不清楚人们通常想要什么。有些人在引用时可能只想要“[2]”,有些人可能更喜欢“Sigfridsson and Ryde [2]”。
您也可能对。。。有兴趣通用 `\cite` 命令或定义新的 cite 命令. 但解决您的问题的答案可能只是遵循文档中的明确建议natbib
并停止使用\cite
:使用\citet
或\citep
。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{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}
\cite{sigfridsson}
\cite[380]{sigfridsson}
\citep{sigfridsson}
\citep[380]{sigfridsson}
\citet{sigfridsson}
\citet[380]{sigfridsson}
\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}