這個問題其實是我另一個問題的後續,修補 \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]
但我在想是否可以為每個項目附加一個關鍵字,這樣我就可以將其用作結束標記。
在聊天室中,Marco Daniel 出色地建議我:
\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 ]
[...]
簡單的正規表示式搜尋將找到參考書目項目的開頭。
感謝 Marco Daniel,這似乎是添加隱形字形的更好方法:
\DeclareFieldFormat{labelnumberwidth}{\textcompwordmark\mkbibbrackets{#1}}