![BST 问题 - 出版商和地址之间未插入逗号](https://linux22.com/image/471385/BST%20%E9%97%AE%E9%A2%98%20-%20%E5%87%BA%E7%89%88%E5%95%86%E5%92%8C%E5%9C%B0%E5%9D%80%E4%B9%8B%E9%97%B4%E6%9C%AA%E6%8F%92%E5%85%A5%E9%80%97%E5%8F%B7.png)
我正在个性化 IEEEtran.bst 文件以使其适用于另一本期刊,该期刊多年来一直有参考书目规则(但没有 latex 类)。当我准备 latex 类来排版手稿时,我也在尝试完成 BST 文件。
但我有一个无法解决的具体问题。
具体来说,IEEEtran.bst 文件有一段代码,从第 1150 行开始,定义了一个类似 的函数FUNCTION {format.address.org.or.pub.date}
。这里应用了用于排版地址、组织和出版商以及出版日期的所有样式,以及它们的顺序。
从现在开始我正在编辑我的问题,以添加 MWE。
我更改了该功能,因为我要映射的参考书目样式对项目和标点符号的排序有不同的规则。但是,现在我遇到了一个问题。
具体来说,我需要改变“出版商”和“地址”的排版方式以输出。也就是说,从地址: 出版商输出字符串至出版商、地址
经过大量测试后,如果我不指定组织和/或发布者,我就可以引入检查来抑制多余的逗号,就像在原始 IEEEtran 中一样。
然而,我修改后的样式将产生输出字符串出版者地址即附加两个条件,这显然是错误的,而且令人感到可怕。
以下是我进行过重大修改的代码部分(仅针对该特定功能)。可以在 CTAN 上轻松找到原始 IEEEtran.bst 以供比较:
FUNCTION {format.address.org.or.pub.date}
{ 't :=
""
year empty$
{ "empty year in " cite$ * warning$ }
{ skip$ }
if$
address empty$ t empty$ and
year empty$ and month empty$ and
{ skip$ }
{ this.to.prev.status
this.status.std
cap.status.std
t empty$
{ skip$ }
{ punct.comma 'prev.status.punct :=
t *
}
if$
address "address" bibinfo.check *
year empty$ month empty$ and
{ skip$ }
{
month empty$
{ year empty$
{ skip$ }
{ ", " * year "year" bibinfo.check * }
if$
}
{ ", " * month "month" bibinfo.check *
year empty$
{ skip$ }
{ ", " * year "year" bibinfo.check * }
if$
}
if$
}
if$
}
if$
}
作为 MWE,您可以使用以下微小的 .tex 文件以及 BST 文件(您可以从此处下载)对其进行测试 测试bst.bst和一个测试文件文件)
\documentclass[notitlepage]{article}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\title{Template}
\author{John Doe}
\begin{document}
\cite{*}
\bibliographystyle{testbst}
\bibliography{testbib}
\end{document}
为了提供一个非常简单的例子,我们假设 bib 文件中有两个条目:
@InCollection{Grattan1994,
author = {K. T. V. Grattan},
title = {Measurement: system of scales and units},
booktitle = {Concise Encyclopedia of Measurement and Instrumentation},
publisher = {Pergamon Press},
year = {1994},
editor = {L. Finkelstein and K. T. V. Grattan},
pages = {209 - 214},
address = {Oxford},
isbn = {0-08-036212-5},
}
@InProceedings{Lighthill1950,
author = {M. J. Lighthill},
title = {Contribution to the theory of heat transfer through a laminar boundary layer},
booktitle = {Proc. of Royal Society},
year = {1950},
volume = {A202},
number = {3},
pages = {359-377},
address = {London},
publisher = {Publisher},
}
这些将按照附图所示进行渲染
您可以在其中清楚地看到发布者/地址问题。
我尽了最大努力在它们之间添加一个“逗号”+“空格”,但毫无成效。多亏了这些努力,我终于解决了多余逗号的问题,但现在我发现了另一个问题……也许这是最后一个问题 ;)
我希望我的解释足以让你们中某个人(肯定比我更专业)帮助我找到这个问题。
答案1
我已经自主解决了这个问题。
为了社区的利益,我在这里发布了解决方案。重点是,对于 IEEEtran.bst,我反转了写入发布者和地址的代码。
具体来说,IEEEtran.bst 样式打印字符串地址: 出版商在 .bbl 文件中,如果我们只关注函数中感兴趣的行,FUNCTION {format.address.org.or.pub.date}
它们是这样的:
address empty$ t empty$ and
year empty$ and month empty$ and
{ skip$ }
{ this.to.prev.status
this.status.std
cap.status.std
address "address" bibinfo.check *
t empty$
{ skip$ }
{ punct.period 'prev.status.punct :=
space.large 'prev.status.space :=
address empty$
{ skip$ }
{ ": " * }
if$
t *
}
if$
经过一些测试后,我能够反转并获取输出字符串 ** PublisherAddress**,用这些行替换上面的行:
address empty$ t empty$ and
year empty$ and month empty$ and
{ skip$ }
{ this.to.prev.status
this.status.std
cap.status.std
t empty$
{ skip$ }
{ punct.comma 'prev.status.punct :=
t *
}
if$
address "address" bibinfo.check *
我最初的问题是“如何在发布者和地址之间引入“逗号+空格”?
我之前忽略的一点是 BST 语言中连接的使用,它是通过运算*
符和使用 RPN 获得的。
因此,考虑到这t
是在堆栈上承载“Publisher”值的变量,只需将所需的字符串(在我的情况下为“,”)连接到从堆栈获取的值就足够了。在实践中:
address empty$ t empty$ and
year empty$ and month empty$ and
{ skip$ }
{ this.to.prev.status
this.status.std
cap.status.std
t empty$
{ skip$ }
{ punct.comma 'prev.status.punct :=
%t * % here we concatenate t with the previous strings
t * ", " * % now we take the result of the concatenation and concatenate with ", "
}
if$
address "address" bibinfo.check *
我希望我的帖子的答案能够帮助其他正在努力学习 BST 语言的人。
干杯
费德里科