再次将 BibTool 与 BibLaTeX 结合使用

再次将 BibTool 与 BibLaTeX 结合使用

我已经安装了 BibTool,它似乎可以用于将格式化的参考书目打印到终端。我正尝试从使用 BibLaTeX 编译的文档中的 .aux 文件中提取参考书目。作为 MWE,这里有这样一个文档:

\documentclass[12pt, oneside, article, a4paper]{memoir}

\usepackage[backend=biber, natbib, style=authoryear-comp]{biblatex}
\ExecuteBibliographyOptions{alldates=short, language=british, sortcites}

\usepackage{kantlipsum}

\title{BibTool MWE}
\author{Thomas Hodgson}
\date{11 May 2013}
\bibliography{bibtool_mwe}

\begin{document}
\maketitle

\kant

\citet{Melville2007}

\printbibliography
\end{document}

这将编译并生成如下所示的 bib tool_mwe.aux 文件:

\relax 
\providecommand*{\memsetcounter}[2]{}
\abx@aux@sortscheme{nyt}
\@writefile{toc}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{lof}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{lot}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\abx@aux@cite{Melville2007}
\abx@aux@page{1}{3}
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{References}{3}}
\abx@aux@page{2}{3}
\memsetcounter{lastsheet}{3}
\memsetcounter{lastpage}{3}

并且,如果有必要的话,这里是 .bib 文件:

@book{Melville2007,
    Author = {Melville, Herman},
    Booktitle = {Moby-Dick},
    Date-Added = {2013-05-12 09:35:11 +0000},
    Date-Modified = {2013-05-12 09:37:33 +0000},
    Location = {London},
    Publisher = {Vintage},
    Title = {Moby-Dick},
    Year = {2007}}

当我在命令行中输入以下内容时,BibTool 会生成一个空白行,当我使用 ctrl-D 保留它时,它会生成一个 .bib 文件,但它是空的。

bibtool -x bibtool_mwe.aux -o test.bib

有一段时间我以为这是同样的问题问题。我也在使用 BibLaTeX。但只有当我遇到 BibTool 的语法错误时,我才会收到类似的错误消息。无论如何,我的问题无法按照该问题的答案所建议的方式解决,因为我的 .aux 文件与那里描述的文件不同。

答案1

只需按如下方式运行biber

biber mainfile --output_format bibtex

你的 tex 文件在哪里mainfile.tex?然后你将获得一个文件

mainfile_biber.bib

包含相关的 bib 条目。

答案2

我写了,或者至少采纳了这个问题的答案问题在 Stack Overflow 上,以下内容(使用 Python)从 .bcf 文件中提取正则表达式:

def xmltocitekeys(file):

    from xml.dom import minidom

    xmldoc = minidom.parse(file)
    taglist = xmldoc.getElementsByTagName('bcf:citekey')
    keylist = []

    for x in taglist:
        keylist.append(str(x.childNodes[0].nodeValue))

    print('\|'.join(keylist))

然后可以将输出与 BibTool 一起使用,例如:

bibtool -X "output" -o extract.bib -i bibliography.bib

顺便说一句,我需要在 BibTool 中设置一个选项以保留我的 citekeys 的大写。

答案3

Biber可以在“工具”模式下为您完成此操作。将其放入您的文件中(或放入您随后使用该选项biber.conf告知的任何文件中):biber-g

<config>
  <sourcemap>
    <maps datatype="bibtex" map_overwrite="1">
      <map>
        <map_step map_field_source="entrykey" map_match="^(?!(?:key1|key2))" map_final="1"/>
        <map_step map_entry_null="1"/>
      </map>
    </maps>
  </sourcemap>
</config>

biber并像这样调用(假设您的.bib文件名为“foo.bib”):

biber --tool foo.bib

或者如果您不使用默认biber.conf文件:

biber -g <conf_file> --tool foo.bib

这将输出另一个.bib文件,foo_bibertool.bib其中仅包含带有“key1”和“key2”的条目。您可以相应地更改正则表达式以选择所需的内容。我将在 biber 中添加一个“map_not_match”选项,以方便下一个版本,这样您就不必使用负正则表达式。此配置文件本质上会遍历您传递的 .bib 文件并忽略与正则表达式匹配的任何条目。

这完全独立于任何 .bcf 或 .aux 等。请参阅 biber 手册第 3.12 节。

相关内容