这个问题实际上是我的另一个问题的后续,修补 \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}}