Сравнение строк по результату \citefield

Сравнение строк по результату \citefield

Я использую \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}

TAppleby, Humphrey (1980). «О важности государственной службы». В: CoRR.//FSigfridsson, Emma и Ulf Ryde (1998). «Сравнение методов получения атомных зарядов из электростатического потенциала и моментов». В: Journal of Computational Chemistry 19.4, стр. 377–395. doi: 10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P.


Могут быть и другие способы обнаружения определенных классов записей лучше, чем сравнение строк по определенным полям (что всегда немного сложно). Обычно определяют новую опцию или явно устанавливают ключевое слово в случае, если искомое свойство нелегко установить из уже имеющихся данных.


Если вы ссылаетесь на arXiv CoRR (https://arxiv.org/corr), то я бы утверждал, что, как и сам arXiv, CoRR на самом деле не является журналом. Для таких записей я бы использовал @online(ср.Формат @article без поля названия журнала в библиографических записях biblatex).

Связанный контент