
Estoy usando \citeall
un formateador de entradas personalizado para enumerar todas las entradas en mi archivo bib, pero me gustaría formatear condicionalmente las entradas de un diario específico. Para hacer esto, intenté usar \ifthenelse
una cadena de comparación con el resultado de \citefield{key}{journaltitle}
, pero no funciona. Retazo:
\newcommand{\completecite}[1]{%
\ifstrequal{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
escupe "FALSO" para cada entrada, aunque
\newcommand{\completecite}[1]{%
\citefield{#1}{journaltitle}
}
\citeall[\completecite]
tiene muchas salidas que son "CoRR". Me imagino que el problema es que la cadena \citefield{#1}{journaltitle}
se está comparando con "CoRR", cuando lo que quiero es comparar con elresultado de llamar a la \citefield
macro.
Probé \expandafter
varios otros ejemplos de comparación de cadenas más elaborados, pero nada funcionó todavía. He jugado con los paquetes y xstring
también . Diablos, incluso usar etoolbox comoxifthen
pdftexcmds
\ifdefstring
\newcommand{\completecite}[1]{%
\ifdefstring{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
no funcionó.
Respuesta1
Te encuentras con un problema similar al que surgió con esta pregunta:¿Por qué \ifx considera que \MakeUppercase{1} y \MakeLowercase{1} son diferentes?
\citefield
es un comando para imprimir el contenido del campo, y no una función que devuelve el texto (el lenguaje de TeX se basa en la expansión de macros, por lo que realmente no hay funciones per se, lo cual es un tema completamente diferente).
Alguien más familiarizado con los aspectos internos de BibLaTeX podría encontrar una manera de extraer el título de la revista de una manera que tenga sentido (y supongo que posiblemente haya algo preenrollado que haga lo que usted desea si puede ser más explícito sobre cuál es su objetivo final).
Respuesta2
Esto es similar al tema discutido enAplicar un reemplazo de cadena en la cita devuelta por \cite.
ComoDon Hoekexplicado ensu respuestabiblatex
Los comandos de , \...cite...
están destinados a la composición tipográfica, no se expanden (ni devuelven) el texto tipográfico en sí. Eso significa que con las herramientas TeX normales no se pueden comparar ni reemplazar bits del resultado producido por \...cite...
comandos con texto simple.
Es posible comparar el contenido de los campos en biblatex
, pero eso tiene que suceder en un nivel diferente, mientras estás en un " biblatex
contexto". Normalmente eso no es un problema, ya que si quieres influir en la producción de citas o en la bibliografía, tienes que trabajar en ese contexto de todos modos.
A continuación se muestra un ejemplo muy sencillo utilizando \iffieldequalstr
. Solemos \AtEveryBibitem
conectarnos al biblatex
contexto: normalmente usarías una prueba como esta en el bibmacro que modificas.
\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}
Puede haber otras formas de detectar ciertas clases de entradas mejor que mediante la comparación de cadenas en ciertos campos (lo cual siempre es un poco complicado). Es común definir una nueva opción o establecer una palabra clave explícitamente en caso de que la propiedad que busca no se pueda establecer fácilmente a partir de los datos ya presentes.
Si se refiere a arXiv CoRR (https://arxiv.org/corr), entonces yo diría que, al igual que el propio arXiv, CoRR no es realmente una revista. Para entradas como esa usaría @online
(cf.Formato de @artículo sin campo de título de revista en entradas de bibliografía biblatex).