
Estou usando \citeall
um formatador de entrada personalizado para listar todas as entradas em meu arquivo bib, mas gostaria de formatar condicionalmente as entradas de um diário específico. Para fazer isso, tentei \ifthenelse
comparar a string com o resultado de \citefield{key}{journaltitle}
, mas não está funcionando. Trecho:
\newcommand{\completecite}[1]{%
\ifstrequal{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
cospe "FALSE" para cada entrada, mesmo que
\newcommand{\completecite}[1]{%
\citefield{#1}{journaltitle}
}
\citeall[\completecite]
tem muitas saídas que são "CoRR". Eu acho que o problema é que a string \citefield{#1}{journaltitle}
está sendo comparada com "CoRR", quando o que eu quero é comparar com oresultado da chamada da \citefield
macro.
Eu tentei \expandafter
vários outros exemplos de comparação de strings mais elaborados, mas nada funcionou ainda. Eu mexi nos xstring
pacotes xifthen
e pdftexcmds
também. Caramba, mesmo usando etoolbox \ifdefstring
como
\newcommand{\completecite}[1]{%
\ifdefstring{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
não funcionou.
Responder1
Você está enfrentando um problema semelhante ao que surgiu com esta pergunta:Por que \ifx considera \MakeUppercase{1} e \MakeLowercase{1} diferentes?
\citefield
é um comando para imprimir o conteúdo do campo, e não uma função que retorna o texto (a linguagem do TeX é baseada na expansão de macros, portanto não existem funções em si, o que é outra questão).
Alguém mais familiarizado com os componentes internos do BibLaTeX pode ser capaz de encontrar uma maneira de extrair o título do diário de uma forma que faça sentido (e suponho que possivelmente haja algo pré-lançado que faça o que você deseja, se você puder ser mais explícito sobre qual é o seu objetivo final).
Responder2
Isto é semelhante ao assunto discutido emAplique uma substituição de string na citação retornada por \cite.
ComoDon Hosekexplicado ema resposta dele, os comandos biblatex
de \...cite...
são destinados à composição tipográfica, eles não se expandem (ou retornam) ao texto digitável em si. Isso significa que com ferramentas TeX normais você não pode comparar nem substituir bits da saída produzida por \...cite...
comandos por texto simples.
É possível comparar o conteúdo dos campos biblatex
, mas isso tem que acontecer em um nível diferente, enquanto você está em um ' biblatex
contexto'. Normalmente isso não é um problema, pois se você quiser influenciar o resultado das citações ou da bibliografia, terá que trabalhar nesse contexto de qualquer maneira.
Aqui está um exemplo muito simples usando \iffieldequalstr
. Usamos \AtEveryBibitem
para nos conectar ao biblatex
contexto: Normalmente você usaria um teste como este na bibmacro que você modifica.
\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}
Pode haver outras maneiras de detectar melhor certas classes de entradas do que pela comparação de strings em determinados campos (o que é sempre um pouco complicado). É comum definir uma nova opção ou definir uma palavra-chave explicitamente caso o imóvel que procura não seja facilmente estabelecido a partir dos dados já presentes.
Se você consultar o arXiv CoRR (https://arxiv.org/corr), então eu diria que, assim como o próprio arXiv, o CoRR não é realmente um diário. Para entradas como essa eu usaria @online
(cf.Formato de @artigo sem campo de título de periódico nas entradas bibliográficas do biblatex).