![BibTeX:请求帮助修改 .bst 样式文件](https://linux22.com/image/278269/BibTeX%EF%BC%9A%E8%AF%B7%E6%B1%82%E5%B8%AE%E5%8A%A9%E4%BF%AE%E6%94%B9%20.bst%20%E6%A0%B7%E5%BC%8F%E6%96%87%E4%BB%B6.png)
我使用 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
类型函数.bst
:n.dashify
和n.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}