我正在为法律引文创建 Biblatex 书目样式。在一种特殊情况下,我需要jurisdiction
根据做出判决的特定机构对引文(即法院判决)进行不同的格式化。具体来说,如果机构是,commission
我需要禁止打印该number
字段,否则我需要打印它。
我已经熟悉在其他情况下使用 来测试此类事物的方式\iffieldequals
;但在这种情况下我无法让它工作 - 大概是因为该institution
字段是一个文字列表,因此我需要对列表使用适当的测试(虽然在实践中,institution
我想要测试的字段将由一个仅包含一个项目的列表组成:条目commission
)。
我尝试过多种方法:尝试创建一个我自己的列表,该列表仅由commission
和 测试组成\iflistequals
,尝试使用 中的各种列表测试函数etoolbox
,甚至edef
使用 来比较临时宏\ifx
。到目前为止,没有任何进展——我认为我已经达到或超出了我对条件和扩展的相当谦虚的理解的极限。在每种情况下,当我希望条件执行为真时,条件正在执行错误分支。
是否有一个习惯用法可以测试特定字符串(最好但不一定“保留”为宏定义,以简化自定义)是否存在于文字列表字段中?我意识到我可以通过使用自定义字段或关键字代替字段来解决这个问题institution
;但我宁愿保持参考书目文件在语义上或多或少正确,并且institution
从这些术语来看,这是要测试的“正确”字段。
由于我的理智告诉我最接近的“正确”方法是使用\iflistequals
它,所以我将其作为我的例子,以防我在测试之前做错了什么。
\newcommand\commission{}
\listadd{\commission}{commission}
% in bibmacro expanded by driver
\iflistequals{institution}{\commission}%
{}
{\printfield{number}}
更完整的 M(N)WE 如下:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{unique,
title = {Title},
number = {Number},
institution = {commission}
}
\end{filecontents}
\begin{filecontents}{\jobname.bbx}
\RequireBibliographyStyle{verbose}
\newcommand{\commission}{}
\listadd{\commission}{commission}
\DeclareBibliographyDriver{misc}{%
\usebibmacro{begentry}%
\printfield{title}\setunit{\addspace}%
\iflistequals{institution}{\commission}%
{}
{\printfield{number}}
\usebibmacro{finentry}}
\end{filecontents}
\usepackage[backend=biber,bibstyle=\jobname,citestyle=verbose]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\cite{unique}
\end{document}
答案1
我猜想根本问题是etoolbox
内部列表和biblatex
文字列表的格式不同。解决此问题的一种方法是使用\printlist
via提供的列表项处理\DeclareListFormat
。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{ref1,
title = {Title},
number = {Number},
institution = {commission}}
@misc{ref2,
title = {Title},
number = {Number},
institution = {commissioner}}
@misc{ref3,
title = {Title},
number = {Number},
institution = {school and commission}}
@misc{ref4,
title = {Title},
number = {Number},
institution = {commission and school}}
\end{filecontents}
\begin{filecontents}{\jobname.bbx}
\RequireBibliographyStyle{verbose}
\newcommand{\commission}{commission}
\DeclareListFormat{list:number}{%
\ifnumless{\value{listcount}}{\value{liststop}}
{\ifdefstring{\commission}{#1}{\listbreak}{}}
{\ifdefstring{\commission}{#1}{}{\printfield{number}}}}
\DeclareBibliographyDriver{misc}{%
\usebibmacro{begentry}%
\printfield{title}\setunit{\addspace}%
\printlist[list:number]{institution}%
\usebibmacro{finentry}}
\end{filecontents}
\usepackage[bibstyle=\jobname,citestyle=verbose]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\cite{ref1}, \cite{ref2}, \cite{ref3}, \cite{ref4}
\printbibliography
\end{document}