我想要一个工具,当给定一个.bib
文件和该文件中的一个密钥作为输入时,它会输出完整条目的纯文本版本。例如:
书目目录
@Article{tversky83,
author = {Amos Tversky and Daniel Kahneman},
title = {Extension versus intuitive reasoning: The conjunction fallacy in probability judgement},
journal = {Psychological Review},
year = 1983,
volume = 90,
pages = {293--315}}
命令行界面
me@computer > magictool bib.bib tversky83
> Tversky, Amos, and Daniel Kahneman. "Extensional versus intuitive reasoning: The conjunction fallacy in probability judgment." Psychological review 90 (1983): 293--315.
有这样的工具吗?如果没有,您能给我一些关于如何构建它的指点吗?大概它会涉及以与 bibtex 非常相似的方式解析 bib 文件。
答案1
免责声明:我不确定这是否是您要找的droid:)
工具。我是在午餐时间编写的,因此可能存在很多错误。但我们确实喜欢有问题的软件,不是吗?:)
介绍fred
1:
这里的想法完全符合 Seamus 的想法:给定一个 bibfile 和一个密钥,返回所需的条目(如果有)。fred
是用 Java 编写的,但在这里我创建了一个 shellscript 文件来为我调用它:
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd -P "$( dirname "$SOURCE" )" && pwd )"
java -jar "$DIR/fred.jar" $*
致谢约瑟夫·赖特感谢这个出色的脚本。
通常的调用方式fred
是:
$ java -jar fred.jar <bibfile> <key>
考虑以下.bib
文件:
@MISC{osi:1998,
author = {Bruce Perens and Eric Steven Raymond},
title = {Open Source Initiative},
year = {1998},
note = {Nonprofit corporation with global scope formed to educate about and
advocate for the benefits of open source and to build bridges among
different constituencies in the open source community.},
url = {http://www.opensource.org/}
}
@Article{tversky83,
author = {Amos Tversky and Daniel Kahneman},
title = {Extension versus intuitive reasoning: The conjunction fallacy
in probability judgement},
journal = {Psychological Review},
year = 1983,
volume = 90,
pages = {293--315}
}
现在让我们简单地fred
调用我的references.bib
文件:
我如何设置输出格式?fred
使用当地的(非全局)以 YAML 格式编写的配置文件,它决定了输出应该是什么样子。让我们看看我的示例config.yaml
文件:
types:
- type: MISC
format: '$!{author}. $!{title}.'
- type: ARTICLE
format: '$!{author}. "$!{title}". $!{journal} ${volume} (${year}): ${pages}.'
type
与 BibTeX 条目的类型(文章、书籍、技术报告等)相关,而format
保存用于打印条目的模板。模板是使用阿帕奇速度模板引擎。我可以添加一些更复杂的验证(例如,如果字段为空,则隐藏下一个标点符号),但对于一个简单的示例来说,模板会变得非常复杂。此模板的唯一“高级”部分是使用变量的“静默”回退,即变量${author}
将解析为author
BibTeX 条目的字段,如果字段不存在,则保持原样。如果我使用$!{author}
,则不会显示空变量。
现在让我们fred
再次运行:
重要的是要观察author
字段是否按原样处理。我必须包含一个静态方法来解析每个作者并相应地显示他们的名字。我将尝试在不久的将来为此功能编写一些辅助方法,但目前,这是我可以提供的 - 毕竟,我是在午餐时间写的。:)
如果我们尝试打印一个无效的密钥:
fred
有自己的GitHub 存储库, 在下面下载部分。请注意,fred
至少从 1.5 版开始,需要 Java 虚拟机。还提供了 shellscript 文件,请确保在同一文件夹中包含fred
和fred.jar
文件,并将其添加到系统路径。
希望你们喜欢这个简陋的工具。:)
答案2
这是一个 Perl 程序模板,可用于根据键提取条目的任何部分:
#! /usr/bin/env perl
use warnings;
use strict;
use feature qw(say);
use Text::BibTeX;
die "Usage $0 <bibfile> <key>\n" if @ARGV != 2;
my $fn=shift;
my $key=shift;
my $bibfile = new Text::BibTeX::File($fn);
while (my $entry = new Text::BibTeX::Entry($bibfile)) {
if (!$entry->parse_ok) {
warn "error in input";
next;
}
my $ckey = $entry->key;
if (defined $ckey) {
my $title="<no title found>";
if ($ckey eq $key) {
if ($entry->exists ('title')) {
$title = $entry->get ('title');
}
say "$key : '$title'";
exit;
}
}
}
say "Key '$key' was not found.";
我们这里以给定的键提取条目的标题为例。(注意:您必须libbtparse-dev
在 Ubuntu 上安装了运行的软件包…… sudo apt-get install libbtparse-dev
:)