在改进 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}
输出显示date
条目现在消失了,根据需要替换为year
、month
和,没有任何范围。同样,字段也用 -- 进行转换,尽管这种转换问题较少。其他条目也会有类似的替换,但它们归结为同一个问题。(我理解为什么这是默认设置,并且没有任何抱怨!)是否可以坚持要求 Biblatex 为每个字段显示文字 .bib 输入,或者这些值是否超出范围?也许更重要的是,我是否忽略了一种更好的方法,即以编程方式从现有的 .bib 文件中排版 Bibtex 数据以用于文档?day
journal
journaltitle
答案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 上那样工作 - 但如果不行,那么可能可以轻松调整。