设计问题:引用命令

设计问题:引用命令

我不知道这是否是讨论基本设计问题的论坛,但一段时间以来,我一直在思考\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可以接受几个逗号分隔的键并具有可选的后记参数不同,此外所有的\cites 都记录在.aux文件中,因此实际实现比 复杂得多\ref,但想法是一样的)。

对于简单形式的数字引用来说,这种设置非常自然

[1] 和 [1, 2]

因为它们在许多 STEM 领域很常见。

可选参数\bibitem可用于覆盖自动生成的数字标签,这对于以下形式的字母标签很方便

[SR98] 和 [SR98, Nus78]

尽管您必须手动提供标签。

BibTeX

普通的 BibTeX 样式只是自动生成一个thebibliography用于 LaTeX 的环境。因此,它可以帮助您自动计算条目的字母标签。但 BibTeX 很少干涉和本身的实现\citethebibliography这意味着引文的输出基本保持不变。

理论上,可以使用可选参数\bibitem将完整的作者年份标签(形式为“Sigfridsson and Ryde 1998”)传递给 LaTeX。此外,thebibliography可以重新定义以删除参考书目中的标签,并且可以删除方括号,以便\cite可以用来获得

Sigfridsson 和 Ryde 1998 和 Sigfridsson 和 Ryde 1998,Nussbaum 1978

这就是apalike.bst标准apalike.styBibTeX 所做的。但这可能不令人满意,因为 LaTeX 实际上并不知道此处引用的作者和年份,它只知道整个标签。因此很难制作一种打印

Sigfridson 和 Ryde 1998

在某一时刻输出一些略有不同的东西,例如

Sigfridson 和 Ryde (1998)

在另一点上。

有一些软件包可以很轻松地cite修改命令的输出\citecite也可以做其他好的事情),但它们无法真正改变只有一个引用标签、因此实际上只有一个\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}

Sigfridsson 和 Ryde [1998]//[Sigfridsson 和 Ryde, 1998, 380]//[Sigfridsson 和 Ryde, 1998]//[Sigfridsson 和 Ryde, 1998, 380]//Sigfridsson 和 Ryde [1998]//Sigfridsson 和 Ryde [1998, 380]

相关内容