Anexar uma palavra-chave ao final de um item bibliográfico

Anexar uma palavra-chave ao final de um item bibliográfico

Esta pergunta é na verdade uma continuação de outra pergunta minha,Patching \printbibliography para exibir conteúdo em documentos e logs. O código funciona maravilhosamente bem e consigo analisar a formatação do texto de cada entrada. A parte complicada é como separar onde termina uma entrada e começa a outra:

...

...\T1/cmr/m/n/10 2
...\T1/cmr/m/n/10 0
...\T1/cmr/m/n/10 1
...\T1/cmr/m/n/10 2
...\T1/cmr/m/n/10 .
...\penalty 10000
...\glue(\parfillskip) 0.0 plus 1.0fil
...\glue(\rightskip) 0.0
..\penalty -51
..\glue 4.0 plus 2.0 minus 1.0
..\glue(\parskip) 0.0
..\glue(\baselineskip) 4.50183
..\hbox(7.49817+2.49939)x324.44702, glue set 0.4662, shifted 20.55298
...\hbox(7.49817+2.49939)x0.0
....\glue 0.0
....\glue -10.55298
....\glue -10.0
....\hbox(7.49817+2.49939)x10.55298
.....\glue 0.0 plus 1.0fil minus 1.0fil
.....\T1/cmr/m/n/10 [
.....\T1/cmr/m/n/10 2
.....\T1/cmr/m/n/10 ]
....\glue 10.0
...\penalty 0
...\T1/cmr/m/n/10 A
...\T1/cmr/m/n/10 u
...\T1/cmr/m/n/10 t

...

Como sei de antemão que meu estilo bibliográfico usa [1], [2]e assim por diante, posso identificar facilmente onde o novo item começa. Mas eu estava pensando se poderia acrescentar uma palavra-chave a cada item, para poder usá-la como marcação de fechamento.

Na sala de chat, Marco Daniel me sugeriu brilhantemente:

\renewbibmacro*{finentry}{\finentry <keyword here>}

Isso será anexado <keyword>a cada item da bibliografia. Até agora, é uma abordagem interessante. Mas há algo que eu gostaria de evitar: a palavra-chave também será impressa tanto no documento quanto .logno arquivo.

Infelizmente, \wlognão funciona aqui porque o conteúdo da caixa é salvo para uso posterior. A macro será chamada quando as entradas forem adicionadas ao .auxarquivo e não durante o rastreamento da caixa.

Meu arquivo de teste:

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[backend=biber,
            bibstyle=numeric-comp,
            sorting=none]{biblatex}

\addbibresource{biblatex-examples.bib} 

\usepackage{xpatch}

\makeatletter
\def\biblio@inlog#1{%
  \begingroup
  \let\biblio@inlog\@gobble
  \chardef\current@mode\interactionmode
  \showboxdepth=\maxdimen
  \showboxbreadth=\maxdimen
  \sbox\z@{\vbox{\printbibliography[#1]}}
  \batchmode
  \wlog{BEGIN BIBLIOGRAPHY}
  \showbox\z@
  \wlog{END BIBLIOGRAPHY}
  \interactionmode=\current@mode
  \endgroup}
\xapptocmd{\blx@printbibliography}{\biblio@inlog{#1}}{}{}
\makeatother

\begin{document}

\cite{companion} \cite{ctan} 

\printbibliography

\end{document}

Alguém tem alguma sugestão se eu puder adicionar alguma palavra-chave ou marca que indique o final de um item bibliográfico na .logsaída, mas não no documento? Suspeito que isso não seja possível ou o processo de salvamento da caixa deva ser drasticamente alterado.

Responder1

Não há muito o que fazer: \wloge \showboxvem de dois lugares diferentes durante o processamento e você não pode interromper a saída \showboxcom outras mensagens.

Em vez de adicionar um marcador para o final, você pode procurar um marcador no início de uma entrada; no log você vê que o rótulo aparece com o seguinte padrão

.....\T1/cmr/m/n/10 [

porque está escrito em um nível mais profundo do boxe. Portanto, uma maneira pode ser adicionar algo invisível à caixa, por exemplo \textcompwordmark, o que produziria uma linha no formato

.....\T1/cmr/m/n/10 ^^W

porque o \textcompwordmarkglifo invisível e de largura zero fica no slot 0x17da tabela de fontes e 0x57é W.

Basta encontrar uma maneira de adicionar algo \textcompwordmarkà composição da etiqueta. Isso não aumentará as dimensões da caixa, como mostra o exemplo a seguir.

\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
\showboxdepth=\maxdimen
\showboxbreadth=\maxdimen
\sbox0{[1]}
\showbox0
\sbox0{\textcompwordmark[1]}
\showbox0
\stop

com a parte relevante do .logarquivo

> \box0=
\hbox(7.49817+2.49939)x10.55298
.\T1/cmr/m/n/10 [
.\T1/cmr/m/n/10 1
.\T1/cmr/m/n/10 ]

! OK.
l.8 \showbox0

?
> \box0=
\hbox(7.49817+2.49939)x10.55298
.\T1/cmr/m/n/10 ^^W
.\T1/cmr/m/n/10 [
.\T1/cmr/m/n/10 1
.\T1/cmr/m/n/10 ]

! OK.
l.10 \showbox0

Como o seu documento utiliza o ambiente bibliográfico padrão, aquele definido com \defbibenvironment{bibliography}, um simples patch irá alterá-lo para que os rótulos da bibliografia sejam precedidos por \textcompwordmark:

%%% After loading biblatex
\makeatletter
\patchcmd{\blx@env@bibliography}{\hss}{\hss\textcompwordmark}{}{}
\makeatother

Aqui está o que recebo no arquivo de log (truncado)

[...]
....\hbox(7.49817+2.49939)x10.55298
.....\glue 0.0 plus 1.0fil minus 1.0fil
.....\T1/cmr/m/n/10 ^^W
.....\T1/cmr/m/n/10 [
.....\T1/cmr/m/n/10 1
.....\T1/cmr/m/n/10 ]
[...]

Uma pesquisa fácil de regex encontrará o início dos itens da bibliografia.

Graças a Marco Daniel, esta parece ser a melhor maneira de adicionar o glifo invisível:

\DeclareFieldFormat{labelnumberwidth}{\textcompwordmark\mkbibbrackets{#1}}

informação relacionada