我如何修改我的 .bst 来将“and”和“\&”同时容纳为 bbl.and?

我如何修改我的 .bst 来将“and”和“\&”同时容纳为 bbl.and?

我曾用来makebst.tex生成与 AGPS v6 匹配的样式(PDF 风格指南简介),但是,我不知道如何获得两种“and”样式的文内引用。使用\citet{}我想要使用"and",但对于\citep{}我想要"\&"

例如

\citet{Smith2014}:史密斯和亚当斯(2014)

\citep{Smith2014}:(Smith & Adams 2014)

在我的.bst文件中,我创建了一个新函数bbl.amp用于"\&"我的参考列表。

FUNCTION {bbl.amp} { "\&"}

但是,似乎只有一个函数用于文内引用,format.full.names

FUNCTION {format.full.names}
{'s :=
 "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
      "{vv~}{ll}" format.name$
      't :=
      nameptr #1 >
        {
          namesleft #1 >
            { ", " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
              t "others" =
                {
                  " " * bbl.etal emphasize *
                }
                {
                  numnames #2 >
                    { "," * }
                    'skip$
                  if$
                  bbl.and
                  space.word * t *
                }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

这有点超出我的技能范围。如果我bbl.and用我的新东西代替bbl.amp,那么我就会遇到相反的问题,并且"\&"一直如此。

如能得到任何帮助,我们将不胜感激,欢呼。

答案1

一种可能的解决方案是定义一个新的命令来扩展为\&and取决于它是在\citep还是在中执行\citep

为此,第一步是定义bbl.amp函数如下:

FUNCTION {bbl.amp}
{ "\protect\myamp "}

\protect\myamp这会产生在文件中插入适当位置的效果.bbl,特别是我们需要在用于打印引用的可选参数中\bibitem使用它。natbib

下一步是确定我们是否处于括号引用中(\citep)。我们可以使用该etoolbox包创建一个切换按钮来指示我们处于这种情况。

\newtoggle{myamp}
\preto{\citep}{\toggletrue{myamp}}

myamp当我们输入括号引用时,上面的第二行将切换设置为true。

最后一步是提供 的定义\myamp

\newcommand{\myamp}{%
  \iftoggle{myamp}{\&\ }{and }%
  } 

在定义中我们使用了条件。条件确定切换是否my amp为真(因此我们处于括号引用中),然后指示打印“&”或“and”。然后我们滥用\setcitestyle将切换设置为假。

\setcitestyle{open={[},close={]\global\togglefalse{myamp}}}

以下是完整的 MWE 及其示例:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{natbib}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@book{Goossens1994LaTeX,
  author = {Michel Goossens and Frank Mittelbach},
  title = {The \LaTeX{} Companion, $2^{nd}$ Edition},
  publisher = {Addison-Wesley},
  year = {1994},
  url = {www.tex.stackexchange.com}
}
@book{Goossens1993LaTeX,
  author = {Frank Mittelbach and Michel Goossens},
  title = {The \LaTeX{} Companion, $2^{nd}$ Edition},
  publisher = {Addison-Wesley},
  year = {1993},
  url = {www.tex.stackexchange.com}
}

\end{filecontents*}
\newcommand{\myamp}{%
  \iftoggle{myamp}{\&\ }{and }%
  }

\setcitestyle{open={[},close={]\global\togglefalse{myamp}}}
\newtoggle{myamp}
\preto{\citep}{\toggletrue{myamp}}


\begin{document}

\verb|\citet|: \citet{Goossens1994LaTeX}

\verb|\citep|: \citep{Goossens1994LaTeX,Goossens1993LaTeX}

\verb|\citeauthor|: \citeauthor{Goossens1994LaTeX}

\verb|\citep|: \citep{Goossens1994LaTeX,Goossens1993LaTeX}

\verb|\cite|: \cite{Goossens1994LaTeX,Goossens1993LaTeX}

\verb|\citep*|: \citep*{Goossens1994LaTeX}

\verb|\citeauthor|: \citeauthor{Goossens1994LaTeX}

\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}

输出为:

在此处输入图片描述

相关内容