我正在尝试为自定义数据模型添加一些多语言支持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}
由于.dbx
文件通常是在多个项目中保持不变的文件,并且可能只生成一次,因此我仍然认为使用外部脚本语言生成此类文件不是一个坏主意。您可以节省每次运行 LaTeX 时循环引起的开销。