我正在使用\citeall
自定义条目格式化程序列出 bib 文件中的所有条目,但我想有条件地格式化特定期刊的条目。为此,我尝试使用\ifthenelse
字符串与 的结果进行比较\citefield{key}{journaltitle}
,但它不起作用。代码片段:
\newcommand{\completecite}[1]{%
\ifstrequal{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
每次输入都会输出“FALSE”,尽管
\newcommand{\completecite}[1]{%
\citefield{#1}{journaltitle}
}
\citeall[\completecite]
有许多输出为“CoRR”。我认为问题在于字符串\citefield{#1}{journaltitle}
正在与“CoRR”进行比较,而我想要的是与\citefield
调用宏的结果。
我尝试过\expandafter
各种其他更复杂的字符串比较示例,但都不起作用。我也修改过xstring
、xifthen
和pdftexcmds
包。哎呀,甚至使用 etoolbox\ifdefstring
的
\newcommand{\completecite}[1]{%
\ifdefstring{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
没有用。
答案1
您遇到的问题与此问题类似:为什么 \ifx 认为 \MakeUppercase{1} 和 \MakeLowercase{1} 不同?
\citefield
是一个打印字段内容的命令,而不是返回文本的函数(TeX 的语言基于宏扩展,因此实际上并没有函数本身,这是一个完全不同的问题)。
更熟悉 BibLaTeX 内部结构的人可能能够找到一种合理的方法来提取期刊标题(并且我猜想如果您能够更明确地说明您的最终目标,那么可能存在一些预先准备好的东西可以做您想做的事情)。
答案2
作为唐·霍塞克解释他的回答,biblatex
的\...cite...
命令用于排版,它们不会扩展为(或返回)可排版文本本身。这意味着使用普通的 TeX 工具,您既不能比较也不能替换\...cite...
命令生成的输出部分和简单文本。
可以比较 中的字段内容biblatex
,但这必须在不同的级别进行,即在“biblatex
上下文”中。通常这不是问题,因为如果您想影响引文或参考书目的输出,无论如何您都必须在该上下文中工作。
这是一个使用 的非常简单的例子\iffieldequalstr
。我们使用\AtEveryBibitem
来挂钩到biblatex
上下文:通常,您会在修改的 bibmacro 中使用这样的测试。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber]{biblatex}
\AtEveryBibitem{%
\iffieldequalstr{journaltitle}{CoRR}
{T}
{F}}
\begin{filecontents}{\jobname.bib}
@article{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
journal = {CoRR},
date = {1980},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
\cite{sigfridsson,appleby}
\printbibliography
\end{document}
可能还有其他方法可以比通过对某些字段进行字符串比较(这总是有点棘手)更好地检测某些类别的条目。如果您要查找的属性无法从现有数据中轻松确定,则通常需要定义一个新选项或明确设置一个关键字。
如果你参考 arXiv CoRR (https://arxiv.org/corr),那么我认为,就像 arXiv 本身一样,CoRR 并不是真正的期刊。对于这样的条目,我会使用@online
(cf.biblatex 书目条目中没有期刊标题字段的 @article 格式)。