交叉引用条目的完整引用

交叉引用条目的完整引用

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}                                                               

正确的 pdflatex/biber 运行后,结果如下: 结果

我还有另一个(丑陋的)解决方法,它基于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}

进入。num04verba\mycomm

人们直观地想要在这里使用的字段crossrefxref无法使用,因为它们很特殊并且可能无法真正进入文件.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 命令中访问不同条目的条目数据,因此可能有一种方法可以以不同的方式(并且可能更优雅)解决您的问题,但为此我们必须知道您的实际用例是什么。

相关内容