如何获取 bib 文件的名称以将其设置为 bib 字段的值?

如何获取 bib 文件的名称以将其设置为 bib 字段的值?

稍微改变一下话题如何神奇地将文件字段添加到 bib 文件中的每个条目中?

我有以下内容:

\DeclareSourcemap{
  \maps[datatype=bibtex,overwrite=true]{
    \map{
      \step[fieldsource=entrykey]
      \step[fieldset=file, fieldvalue={ref/}]
      \step[fieldsource=entrysubtype]
      \step[fieldset=file, origfieldval, append]
      \step[fieldset=file, fieldvalue={/}, append]
      \step[fieldsource=entrykey]
      \step[fieldset=file, origfieldval, append]
      \step[fieldset=file, fieldvalue={.pdf}, append]
    }
  }
}

围兜里写道:

@string { subtype = "thesubtype" } 

bib 文件的名称是thesubtype.bib

我不想(手动)在 bib 中设置 的值,而是subtype想以编程方式在 上设置它DeclareSourcemap。哪种方法可能比较好?

我猜一种方法可能是通过一些 python。我听说 lualatex 带来了 lua 语言,好奇这是否可以在这里使用。

答案1

文件名.bib无法用于源映射或其他操作。但至少在 Biber 处理的早期阶段,该名称是已知的\perdatasource(我推测它后来被遗忘了)。如果您认为访问文件名对公众来说是一个有用的功能,请说明确切地你想要的(你想让一个条目的文件名基本上作为一个普通.bib字段吗?你想在源映射中引用文件名吗?)并在https://github.com/plk/biber/issues


与此同时,这里有一个变通方法,使用\perdatasource和包含来\addbibresource将冗余度保持在最低限度。该解决方案利用了这一点,\perdatasource使我们能够一瞥.bib文件名。由于文档中的每个文件都需要一个这样的\perdatasource映射.bib,因此将源映射与\addbibresource直接组合起来似乎是很自然的。

注意\addentrysubtyperesource采用.bib文件名没有文件扩展名(与\addbibresource需要扩展名不同)。

还要注意的是,示例中有多个源映射,它们的顺序很重要。调用\addentrysubtyperesource应该在任何其他源映射构造之前进行。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}


\newcommand*{\addentrysubtyperesource}[1]{%
  \addbibresource{#1.bib}
  \DeclareSourcemap{
    \maps[datatype=bibtex,overwrite=true]{
      \map{
        \perdatasource{#1.bib}
        \step[fieldset=entrysubtype, fieldvalue={#1}]
      }
    }
  }
}

\addentrysubtyperesource{\jobname-one}
\addentrysubtyperesource{\jobname-two}


\DeclareSourcemap{
  \maps[datatype=bibtex,overwrite=true]{
    \map{
      \step[fieldsource=entrykey]
      \step[fieldset=file, fieldvalue={ref/}]
      \step[fieldsource=entrysubtype]
      \step[fieldset=file, origfieldval, append]
      \step[fieldset=file, fieldvalue={/}, append]
      \step[fieldsource=entrykey]
      \step[fieldset=file, origfieldval, append]
      \step[fieldset=file, fieldvalue={.pdf}, append]
    }
  }
}


% just to print the 'file' field
\DeclareFieldFormat{file}{file: \path{#1}}
\renewbibmacro{finentry}{\printfield{file}\finentry}

\usepackage{filecontents}
\begin{filecontents}{\jobname-one.bib}
@book{appleby,
  author  = {Humphrey Appleby},
  title   = {On the Importance of the Civil Service},
  date    = {1980},
}
\end{filecontents}
\begin{filecontents}{\jobname-two.bib}
@article{sigfridsson,
  author  = {Emma Sigfridsson},
  title   = {Chemistry},
  date    = {1998},
  journal = {Journal of Chemisty},
  volume  = {48},
  number  = {2},
  pages   = {135-164},
}
\end{filecontents}

\begin{document}
\cite{sigfridsson,appleby}
\printbibliography
\end{document}

Appleby, Humphrey (1980)。《论公务员制度的重要性》。文件:ref/kcfnmifilenames-one/appleby.pdf。//Sigfridsson, Emma (1998)。《化学》。载于:《化学杂志》48.2,第 135-164 页。文件:ref/kcfnmifilenames-two/sigfridsson.pdf。

相关内容