Добавление ключевого слова в конец библиографического элемента

Добавление ключевого слова в конец библиографического элемента

Этот вопрос на самом деле является продолжением другого моего вопроса:Исправление \printbibliography для отображения содержимого как в документе, так и в журнале. Код работает замечательно, и я могу анализировать форматирование текста для каждой записи. Сложность в том, как отделить, где заканчивается одна запись и начинается другая:

...

...\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

...

Поскольку я заранее знаю, что мой стиль библиографии использует [1], [2]и т. д., я могу легко определить, где начинается новый элемент. Но я подумал, что если я могу добавить ключевое слово к каждому элементу, то я могу использовать его в качестве закрывающей разметки.

В чате Марко Дэниел блестяще предложил мне такой вариант:

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

Это добавит <keyword>к каждому элементу библиографии. Пока что это интересный подход. Но есть кое-что, чего я хотел бы избежать: ключевое слово также будет напечатано и в документе, и в .logфайле.

К сожалению, \wlogздесь это не работает, поскольку содержимое ящика сохраняется для дальнейшего использования. Макрос будет вызван при добавлении записей в файл .aux, а не во время трассировки ящика.

Мой тестовый файл:

\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}

Есть ли у кого-нибудь предложение, как добавить ключевое слово или метку, которая указывает на конец библиографического элемента в выводе .log, но не в документе? Я подозреваю, что это невозможно или процесс сохранения ящика должен быть радикально изменен.

решение1

Делать особо нечего: \wlogи \showboxпоступают из двух разных мест во время обработки, и вы не можете прерывать вывод \showboxдругими сообщениями.

Вместо добавления маркера в конец, вы можете поискать маркер в начале записи; из журнала вы видите, что метка отображается по следующему шаблону

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

потому что он набран на более глубоком уровне бокса. Так что можно добавить что-то невидимое в бокс, например \textcompwordmark, что даст строку вида

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

поскольку \textcompwordmarkневидимый глиф нулевой ширины находится в слоте 0x17таблицы шрифтов и 0x57имеет вид W.

Просто найдите способ добавить \textcompwordmarkнабор текста на этикетке. Это не увеличит размеры коробки, как показано в следующем примере.

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

с соответствующей частью .logфайла

> \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

Поскольку ваш документ использует стандартную библиографическую среду, определенную с помощью \defbibenvironment{bibliography}, простой патч изменит ее так, что метки библиографии будут предваряться \textcompwordmark:

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

Вот что я получаю в файле журнала (обрезано)

[...]
....\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 ]
[...]

Простой поиск с помощью регулярных выражений позволит найти начало элементов библиографии.

Благодаря Марко Дэниелу, это, кажется, лучший способ добавить невидимый глиф:

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

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