是否可以通过编程方式创建 biblatex 数据模型条目?

是否可以通过编程方式创建 biblatex 数据模型条目?

我正在尝试为自定义数据模型添加一些多语言支持biblatex

我正在跟进这个答案并有一个功能原型。然而,当我开始迁移字段时,似乎为每个字段添加不同的语言是相当重复的,比如

\DeclareDatamodelFields[type=field, datatype=literal]{
  organization,%
  title,%
  country,%
  country-es,%
  country-en,%
  description,%
  description-es,%
  description-en%
}

我正在寻找一种方法来在其中放置一个循环(以某种方式),以便我可以自动创建每个字段的不同版本。

\DeclareDatamodelFields[type=field, datatype=literal]{
  organization,%
  title,
  % some language to support the following
  foreach f in (country, description)
    foreach l in (, -es, -en)
      print f l,
}

我没有找到有关 biblatex 使用什么语言来处理这些.dbx文件的信息。

我知道我可以使用一些外部程序来生成文件.dbx,然后直接使用它。但我正在寻找可以与 LaTeX 中的项目一起自动维护和编译的东西。

有什么建议么?

答案1

这些.dbx文件的处理方式与普通 LaTeX 一样简单,因此理论上您可以使用 LaTeX 提供的所有工具。但是\DeclareDatamodelFields和朋友使用 来处理它们的强制(第二个)参数\docsvlist{#2},这意味着输入不能是任意的,而必须是逗号分隔的字符串列表。因此循环之内 \DeclareDatamodelFields被排除,但构建循环没有问题外部\DeclareDatamodelFields

在 MWE 中有两个嵌套循环。外循环 ( \adn@dbx@fieldloop) 循环遍历字段名称,内循环 ( \adn@dbx@langloop) 循环遍历语言名称。使用 ,expl3您可能能够获得更自然的循环结构,而不是 强加的不寻常结构etoolbox

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

\usepackage{filecontents}
\begin{filecontents}{adn.dbx}
\ProvidesFile{adn.dbx}[2018/10/24 example for loops in dbx files]
\def\adn@dbx@langloop#1#2{%
  \DeclareDatamodelFields[type=field, datatype=literal]{#1-#2}}

\def\adn@dbx@fieldloop#1{%
  \DeclareDatamodelFields[type=field, datatype=literal]{#1}%
  \forcsvlist{\adn@dbx@langloop{#1}}{es,en}%
}

\forcsvlist{\adn@dbx@fieldloop}{country,description}
\end{filecontents}

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


\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
  author         = {Humphrey Appleby},
  title          = {On the Importance of the Civil Service},
  date           = {1980},
  description    = {Vanilla},
  description-es = {¡Hola!},
  description-en = {How do you do?},
  country        = {Plaincountry},
  country-es     = {Spain},
  country-en     = {England},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\renewbibmacro*{finentry}{%
  \printfield{description}%
  \newunit
  \printfield{description-es}%
  \newunit
  \printfield{description-en}%
  \newunit
  \printfield{country}%
  \newunit
  \printfield{country-es}%
  \newunit
  \printfield{country-en}%
  \newunit
  \finentry}

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

Appleby, Humphrey (1980)。《论公务员制度的重要性》。Vanilla。¡Hola!你好吗?平原国家。西班牙。英国。

由于.dbx文件通常是在多个项目中保持不变的文件,并且可能只生成一次,因此我仍然认为使用外部脚本语言生成此类文件不是一个坏主意。您可以节省每次运行 LaTeX 时循环引起的开销。

相关内容