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 .log
no arquivo.
Infelizmente, \wlog
não funciona aqui porque o conteúdo da caixa é salvo para uso posterior. A macro será chamada quando as entradas forem adicionadas ao .aux
arquivo 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 .log
saí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: \wlog
e \showbox
vem de dois lugares diferentes durante o processamento e você não pode interromper a saída \showbox
com 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 \textcompwordmark
glifo invisível e de largura zero fica no slot 0x17
da 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 .log
arquivo
> \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}}