Этот вопрос на самом деле является продолжением другого моего вопроса:Исправление \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}}