foo
我的(biblatex-biber 管理的)参考书目中有一个条目键,其中有一个crossref
字段指向另一个条目键。为了自动执行一系列文件的排版操作,我希望能够使用以下方式引用交叉引用的条目:
\citefull{\citefield{foo}{crossref}}
这种简单的语法不起作用,因为 biblatex 命令不可嵌套/扩展。有什么提示可以指导如何继续吗?
另外,这也可能很方便:
\citefull[\citefield{foo}{note}]{\citefield{foo}{crossref}}
我尝试过的方法:许多帖子都提到了这种嵌套/扩展限制,并提出了解决方法。因此我知道这在某种程度上可能的但我对代码的理解不够深入,无法适应我的需求。例如这个问题似乎非常密切相关。我最接近的是调整这个答案,应该是更多的比我需要的复杂,因为它处理名称列表,而我只想扩展一个整体字段。下面的调整确实num3
在调用 key num4
(其author
字段包含num3
)时打印了 key 的完整引用,就像我希望的那样。但是,我无法调用该crossref
字段(或自定义verba
字段)来代替该author
字段。
\documentclass{article}
\usepackage[american]{babel}
\usepackage[backend=biber,firstinits]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{num03,
title = {Title XX3},
author = {Author2 Authorsen2 and Author2a Authorsen2a},
}
@misc{num04,
title = {Title},
author = {num03},
verba = {num03},
crossref = {num03},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\newcommand*{\name}{}
\DeclareIndexNameFormat{getname}{%
\nameparts{#1}
\ifblank{\namepartgiveni}
{}
{\iffirstinits
{\xappto{\name}{\namepartgiveni\space}}
{\xappto{\name}{\namepartgiven\space}}}%
\ifblank{\namepartprefix}
{\xappto{\name}{\namepartfamily}}
{\xappto{\name}{\namepartprefix\space\namepartfamily}}}
\DeclareCiteCommand{\getauthor}
{\undef\name
\boolfalse{citetracker}%
\boolfalse{pagetracker}}
{\ifnameundef{author}
{}
{\ifboolexpr{ test {\ifnumgreater{\value{citecount}}{1}}
and not test {\ifundef{\name}} }
{\gappto{\name}{; }}
{}%
\indexnames[getname][1-99]{author}}}
{}
{}
\begin{document}
\getauthor{num04}
\fullcite{\name}
\end{document}
我还有另一个(丑陋的)解决方法,它基于execute
包含 的字段\nocite{num03}
。然后我进行调整printbilbiography
,它有点儿按我需要的方式进行...但这听起来确实不像是一种正确的做法!
答案1
不幸的是,输入数据的保存方式biblatex
意味着我们无法扩展地获取字段值(这有点令人沮丧),所以我们必须使用保存字段值的辅助宏。
\makeatletter
% {<command>}{<entrykey>}{<field>}
\newcommand*{\getfieldinto}[3]{%
\nocite{#2}%
\begingroup
\blx@getdata@cite{#2}%
\edef\my@tempa{\endgroup
\def\unexpanded{#1}{%
\blx@imc@iffieldundef{#3}
{}
{\csexpandonce{abx@field@#3}}}}%
\my@tempa}
\makeatother
其工作方式与问题中以可扩展的方式提取名称的代码类似,但在字段级别工作并且不太复杂,因为它不必处理名称处理的复杂性biblatex
。
\getfieldinto{<command>}{<entrykey>}{<field>}
<field>
将for的内容提取<entrykey>
到宏中<command>
。因此你可以像这样使用它
\getfieldinto{\mycomm}{num04}{verba}
进入。num04
verba
\mycomm
人们直观地想要在这里使用的字段crossref
和xref
无法使用,因为它们很特殊并且可能无法真正进入文件.bbl
(读取的条目数据biblatex
),因此像verba
(或自定义verb
字段)可能是最安全的选择。
\documentclass{article}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[backend=biber, giveninits]{biblatex}
\makeatletter
% {<command>}{<entrykey>}{<field>}
\newcommand*{\getfieldinto}[3]{%
\nocite{#2}%
\begingroup
\blx@getdata@cite{#2}%
\edef\my@tempa{\endgroup
\def\unexpanded{#1}{%
\blx@imc@iffieldundef{#3}
{}
{\csexpandonce{abx@field@#3}}}}%
\my@tempa}
\makeatother
\begin{filecontents}{\jobname.bib}
@misc{num03,
title = {Title XX3},
author = {Author2 Authorsen2 and Author2a Authorsen2a},
}
@misc{num04,
title = {Title},
verba = {num03},
note = {note},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\getfieldinto{\mykey}{num04}{verba}
\getfieldinto{\mynote}{num04}{note}
\fullcite[\mynote]{\mykey}
\end{document}
可以从 cite 命令中访问不同条目的条目数据,因此可能有一种方法可以以不同的方式(并且可能更优雅)解决您的问题,但为此我们必须知道您的实际用例是什么。