BibTeX:请求帮助修改 .bst 样式文件

BibTeX:请求帮助修改 .bst 样式文件

我使用 BibTeX 来编写参考书目,一切都按预期运行。对于格式化输出,我使用 natdin,它几乎完全满足我的要求,除了一两件小事:

它用于--表示页面范围,并且我希望在破折号之前和之后有一个空格,即使用\,--\,。当我查看 .bst 文件时,我发现了以下内容:

FUNCTION {n.dashify}
{ 't :=
  ""
    { t empty$ not }
    { t #1 #1 substring$ "-" =
        { t #1 #2 substring$ "--" = not
            { "--" *
              t #2 global.max$ substring$ 't :=
            }
            {   { t #1 #1 substring$ "-" = }
                { "-" *
                  t #2 global.max$ substring$ 't :=
                }
              while$
            }
          if$
        }
        { t #1 #1 substring$ *
          t #2 global.max$ substring$ 't :=
        }
      if$
    }
  while$
}

不幸的是,我不知道这到底是做什么的,或者如何修改它才能实现我想要的效果。

以下是 MWE:

\documentclass[paper=a4]{scrartcl}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,ngerman]{babel}
\usepackage[square]{natbib}

\usepackage{lipsum}

\begin{document}
    \section{Lorem Ispum}
        According to \citet{Nescio.2000} we find that 
        \lipsum[1]

    \bibliography{test}
    \bibliographystyle{natdin} 
\end{document}

随附的 test.bib 文件包含

@article{Nescio.2000,
 author = {Nescio, Nomen and Public, John Q. and Else, Somebody},
 year = {2000},
 title = {What Miscellaneous Anomaly is This? A Field Guide for the Utterly Confused},
 pages = {95--105},
 volume = {08/15},
 journal = {Internationale Zeitschrift für Tetrapilotomie und Potiosektion}
 }

natdin 在 CTAN 上广泛可用且按原样使用。

正如您在渲染的示例中看到的,我得到了S. 95-105我真正想要的东西S.~95\,--\,105

答案1

n.dashify函数既可用于页码范围,也可用于 ISBN 号等其他元素,因此为了让样式按您希望的方式工作,我们需要在样式中将这两种用途分开。最简单的方法是创建一个用于页码范围的函数版本(我们将其称为n.dashify),然后创建一个新版本(如上一个版本,n.dashify我们将其称为)n.dashify.plain。此外,我们需要将处理非页码范围的函数更改为使用该n.dashify.plain函数,而不是使用我们的新函数。

首先,复制一份natdin.bst并将其放在您的本地texmf文件夹中(在 TeX Live 系统上,这通常是~/texmf/tex/bibtex/bst~/Library/texmf/tex/bibtex/bst在 Mac 上))。

然后,复制n.dashify文件中的原始函数并赋予其新名称: n.dashify.plain

n.dashify接下来,用以下函数替换旧函数:

FUNCTION {n.dashify}
{ 't :=
  ""
    { t empty$ not }
    { t #1 #1 substring$ "-" =
        { t #1 #2 substring$ "--" = not
            { "\,--\," *
              t #2 global.max$ substring$ 't :=
            }
            {   { t #1 #1 substring$ "-" = }
                { "" *
                  t #2 global.max$ substring$ 't :=
                }
              while$
             "\,--\," * }
          if$
        }
        { t #1 #1 substring$ *
          t #2 global.max$ substring$ 't :=
        }
      if$
    }
  while$
}

现在文件中应该有两个n.dashify类型函数.bstn.dashifyn.dashify.plain

最后,更改以下两个函数(格式化 URL 和 ISSN/ISBN)以使用该n.dashify.plain函数:

FUNCTION { format.doi.urn }
{ urn empty$
     { doi empty$
          { "" }
          { "DOI" doi n.dashify.plain tie.or.space.connect }
       if$
     }
     { "URN" urn n.dashify.plain tie.or.space.connect }
  if$
}

FUNCTION { format.isbn.issn }
{ isbn empty$
     { issn empty$
          { "" }
          { "ISSN" issn n.dashify.plain tie.or.space.connect }
       if$
     }
     { "ISBN" isbn n.dashify.plain tie.or.space.connect }
  if$
}

这是示例文档。我复制了 bib 条目以显示表单n--m和文件n-m中的页面条目的行为.bib(请参阅上面评论中的讨论),并添加了一些 ISBN 编号以检查一切是否按预期工作。

\begin{filecontents}{\jobname.bib}
@article{Nescio.2000,
 author = {Nescio, Nomen and Public, John Q. and Else, Somebody},
 year = {2000},
 title = {What Miscellaneous Anomaly is This? A Field Guide for the Utterly Confused},
 pages = {95--105},
 volume = {08/15},
 journal = {Internationale Zeitschrift für Tetrapilotomie und Potiosektion},
 isbn = {1-84356-028-3}
 }
@article{Nescio.2000b,
 author = {Nescio, Nomen and Public, John Q. and Else, Somebody},
 year = {2000},
 title = {What Miscellaneous Anomaly is This? A Field Guide for the Utterly Confused},
 pages = {95-105},
 volume = {08/15},
 journal = {Internationale Zeitschrift für Tetrapilotomie und Potiosektion},
 issn = {1-84356-028-3}
 }
\end{filecontents}
\documentclass[paper=a4]{scrartcl}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,ngerman]{babel}
\usepackage[square]{natbib}

\usepackage{lipsum}

\begin{document}
    \section{Lorem Ispum}
        According to \citet{Nescio.2000b,Nescio.2000} we find that 
        \lipsum[1]

    \bibliography{\jobname}
    \bibliographystyle{natdin-copy} 
\end{document}

代码输出

相关内容