我可以使用 Biblatex 以编程方式排版 .bib 文件数据吗?

我可以使用 Biblatex 以编程方式排版 .bib 文件数据吗?

在改进 Biblatex 样式的文档时,我想打印样式精美的逐字 .bib 条目,并将其放在每个条目的输出旁边,从而并列因果关系。这可以为每个条目手动完成,但我希望定义自定义 Biblatex 引用命令来排版 .bib 条目,使其与文件中显示的完全相同,这样可能会更容易。自定义引用命令不仅可以节省繁琐的工作,而且还有助于自动化文档。

不幸的是,我不确定如何访问字段中的文字数据,如果这是可能的。我猜想 Biber 在 Biblatex 看到数据之前就已经在处理和解析数据了,而我的用例可能很复杂,因为我想要将未处理的 .bib 数据与风格化的、处理过的 Biblatex 输出并列。这是我目前拥有的简化版本,以及两个条目的输出:

\documentclass[a4paper]{article}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage{xcolor}
\usepackage[style=mla,backend=biber]{biblatex}

\usepackage{filecontents}

\begin{filecontents}{documentation.bib}
@article{Tibullus:2002ub,
    author = {Tibullus},
    date = {2002/2003},
    journal = {Chicago Review},
    number = {4},
    pages = {102--106},
    title = {How to Be Tibullus},
    translator = {Wray, David},
    volume = {48}}

@article{Evacuation:wj,
    date = {2016-07-15},
    entrysubtype = {newspaper},
    journal = {The Boston Globe},
    title = {Evacuation Order Lifted at Nice Airport},
    url = {www.bostonglobe.com/news/world/2016/07/15/evacuation-progress-nice-airport/KO4BytWK4wFUOxjEkSpKTN/story.html}}
\end{filecontents}

\addbibresource{documentation.bib}

\DeclareCiteCommand{\samplebib}[\texttt]
  {}%
  {\usebibmacro{citeindex}%
   \renewcommand*{\newunitpunct}{\addcomma\newline}%
   \renewcommand*{\multinamedelim}{\addspace{}and\addspace{}}%
   \usebibmacro{cite:mla:bib}}
  {}%
  {}

\newcommand{\entrycolor}{\color{teal}}
\newcommand{\fieldcolor}[1]{{\color{purple}#1}}
\newcommand{\fieldindent}{{\color{white} ~~~}}

\newcommand{\fieldcite}[1]{
  \iffieldundef{#1}%
    {}%
    {\printtext{\fieldindent\fieldcolor{#1} = \{\printfield[noformat]{#1}\}}}%
  \ifnameundef{#1}%
    {}%
    {\printtext{\fieldindent\fieldcolor{#1} = \{\printnames[family-given][-\value{listtotal}]{#1}\}}}%
  \iflistundef{#1}%
    {}%
    {\printtext{\fieldindent\fieldcolor{#1} = \{\printlist{#1}\}}}%
}

\makeatletter
\newbibmacro*{cite:mla:bib}{%
  {\entrycolor\printtext{@}\printfield{entrytype}}\{\printfield{entrykey}%
  \newunit%
  \fieldcite{author}%
  \newunit%
  \fieldcite{date}%
  \newunit%
  \fieldcite{day}%
  \newunit%
  \fieldcite{entrysubtype}%
  \newunit%
  \fieldcite{institution}%
  \newunit%
  \fieldcite{journaltitle}%
  \newunit%
  \fieldcite{journal}%
  \newunit%
  \fieldcite{month}%
  \newunit%
  \fieldcite{number}%
  \newunit%
  \fieldcite{options}%
  \newunit%
  \fieldcite{pages}%
  \newunit%
  \fieldcite{title}
  \newunit%
  \fieldcite{translator}
  \newunit%
  \fieldcite{url}
  \newunit%
  \fieldcite{volume}
  \newunit%
  \fieldcite{year}%
  \newline%
  \}
  }
\makeatother

\begin{document}

\begin{refsection}
\noindent\samplebib{Tibullus:2002ub}
\printbibliography[heading=none]
\end{refsection}

\begin{refsection}
\noindent\samplebib{Evacuation:wj}
\printbibliography[heading=none]
\end{refsection}

\end{document}

bibtex 文档的输出

输出显示date条目现在消失了,根据需要替换为yearmonth和,没有任何范围。同样,字段也用 -- 进行转换,尽管这种转换问题较少。其他条目也会有类似的替换,但它们归结为同一个问题。(我理解为什么这是默认设置,并且没有任何抱怨!)是否可以坚持要求 Biblatex 为每个字段显示文字 .bib 输入,或者这些值是否超出范围?也许更重要的是,我是否忽略了一种更好的方法,即以编程方式从现有的 .bib 文件中排版 Bibtex 数据以用于文档?dayjournaljournaltitle

答案1

从 bbl 重建 bib 文件实际上是不可能的,因为 biber 进行了一些预处理,您无法在 LaTeX 端恢复这些预处理。

因此我将使用 listing 包来逐字逐句地包含 bib 文件。

可以通过行号来选择文件的一部分,或者 --- 如果行号不够稳定 --- 您可以使用范围标记,如清单文档 5.7 任意行范围标记中所述。

答案2

除了自己预处理文件之外,您还可以使用比布工具,它允许从.bib文件中提取单个条目(以及许多其他内容)。

您可以从 LaTeX 中调用 Bibtool,使用\write18它将条目保存到临时文件中,然后\lstinputlisting在该文件上使用。请注意,这需要使用 进行编译-shell-escape

Bibtool 对文件进行了一些处理,例如在文件开头添加换行符,并将引用键转换为小写。您可以关闭该功能。

MWE,根据您的要点:

\documentclass[a4paper]{article}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage{xcolor}
\usepackage[style=mla,backend=biber]{biblatex}
\usepackage{listings}

\lstdefinelanguage{BibTeX}{%
  % keywordsprefix={@}%
  keywords={%
    @book,@article,@incollection,@suppbook,@mvbook,@collection,@review,@misc,%
    @thesis,@mvreference,@inreference,@mvlexicon,@inlexicon,@unpublished,%
    @commentary,@inbook,@incommentary,@mvcommentary,@seminarpaper,@lexicon,%
    @reference,@mvcollection,@bookinbook,@ancienttext,@classictext,@online,%
    @manual,@conferencepaper,@series%
  },
  emph={%
    author,title,location,publisher,date,shorttitle,translator,edition,preface,%
    related,relatedtype,editor,series,shortseries,number,journal,journaltitle,%
    shortjournal,volume,pages,type,booktitle,bookauthor,origlocation,%
    origpublisher,origdate,pubstate,origlanguage,maintitle,maineditor,part,%
    bookeditor,seriesseries,maintranslator,eprint,eprinttype,doi,url,%
    revdauthor,revdtitle,revdeditor,institution,type,shorthand,xref,%
    note,eprintdate,volumes,shortmaintitle,options,eprintclass,relatedoptions,%
    editortype,crossref,editora,editorb,editorc,editoratype,editorbtyle,%
    editorctype,entrysubtype,sorttitle,titleaddon,witheditor,witheditortype,%
    withtranslator,withtranslatortype,eventtitle,venue,eventdate,shortauthor%
  },
  sensitive=false,
  breaklines=true,
  %breakatwhitespace=true,
  morecomment=[l][basicstyle]{=\ \{}
}

\lstset{%
 language=BibTeX,
 backgroundcolor=\color{gray!5},
 basicstyle=\ttfamily\small,
 keywordstyle=\color{teal},
 emphstyle=\color{purple}
}

\lstset{rangeprefix=\%\[\[\ ,% percent + double left square brace + space 
        rangesuffix=\ \]\]}% space + double right square bracket 
        
\addbibresource{documentation.bib}

\newcommand{\sidebyside}[1]{%
\begin{refsection}%
\nocite{#1}%
\immediate\write18{bibtool -- suppress.initial.newline=true -- preserve.key.case=on -X "^#1$" documentation.bib -o tmpsingle.bib}%
\lstinputlisting{tmpsingle.bib}%
\printbibliography[heading=none]
\end{refsection}
}

\begin{document}
\sidebyside{Tibullus:2002ub}

\sidebyside{Evacuation:wj}
\end{document}

结果:

在此处输入图片描述

备注:仅在 Linux 上测试,我不确定命令行调用是否会像在 Windows 或 Mac 上那样工作 - 但如果不行,那么可能可以轻松调整。

相关内容