
Я использую \citeall
с пользовательским форматировщиком записей для перечисления всех записей в моем файле bib, но я хотел бы условно отформатировать записи из определенного журнала. Чтобы сделать это, я пробовал использовать \ifthenelse
для сравнения строк с результатом \citefield{key}{journaltitle}
, но это не работает. Фрагмент:
\newcommand{\completecite}[1]{%
\ifstrequal{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
выдает "ЛОЖЬ" для каждой записи, хотя
\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
Это похоже на проблему, обсуждаемую вПрименить замену строки к цитате, возвращаемой \cite.
КакДон Хосекобъяснено вего ответ, 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
(ср.Формат @article без поля названия журнала в библиографических записях biblatex).