我正在使用biblatex
。refsection=chapter
这将导致辅助文件根据此模式命名,假设调用book.tex
一本n
章节书的源文件:
book1-blx.aux
book2-blx.aux
...
bookn-blx.aux
有没有钩子可以改变这个名字?我需要将辅助文件与其对应的章节关联起来(这些文件在其他流程中使用)例如:
book_chaplabel-blx.aux
我认为我可以在命令里面添加一个钩子include
,这样我就可以获取章节文件名,但我不知道在哪里将它连接到生成的辅助文件名。
为了清晰起见,进行编辑:
尝试用章节名称代替整数可能不是解决问题的正确方法。最主要的是我需要一种方法将辅助文件与其所属章节关联起来。我必须对每个章节的 bbl 文件和辅助文件进行后处理。后处理后的文件用于不同的工作流程(epub/docbook 生成)。
答案1
辅助文件名的数字部分对应于参考节计数器(与 返回的值相同\therefsection
)。文件名后缀(-blx
)对应于\blxauxsuffix
。这可以\renewcommand
在前言中用 重新定义。文件名前缀被硬编码为\jobname
。
您可以修补biblatex
内部结构以添加章节文件名,但这些需要在序言中定义。因此挂钩为时\include
已晚。一种解决方法是在序言中指定章节文件名的有序列表。
以下是用章节文件名替换参考章节编号的示例。章节文件名\blxauxprefix
以逗号分隔的列表形式传递给新命令。
\documentclass{report}
\usepackage[backend=bibtex,refsection=chapter]{biblatex}
\makeatletter
\def\blxauxprefix#1{%
\defcounter{listcount}{0}%
\def\do##1{\stepcounter{listcount}\csgdef{blxauxprefix:\the\c@listcount}{-##1}}%
\docsvlist{#1}}
\patchcmd{\blx@refsection@bibtex}
{\jobname\the\c@refsection\blxauxsuffix}
{\jobname\csuse{blxauxprefix:\the\c@refsection}\blxauxsuffix}{}{}
\patchcmd{\blx@bblfile@bibtex}
{\jobname\the\c@refsection\blxauxsuffix}
{\jobname\csuse{blxauxprefix:\the\c@refsection}\blxauxsuffix}{}{}
\apptocmd{\include}
{\ifcsstring{blxauxprefix:\the\c@refsection}{#1}{}
{\blx@warning{%
'aux' file prefix does not match \MessageBreak
'\@backslashchar include' filename #1}}}{}{}
\makeatother
\blxauxprefix{chap1,chap2}
\begin{filecontents}{chap1.tex}
\chapter{First chapter}
\cite{ctan}
\end{filecontents}
\begin{filecontents}{chap2.tex}
\chapter{Second chapter}
\cite{companion,knuth:ct}
\end{filecontents}
\addbibresource{biblatex-examples.bib}
\defbibheading{subbibliography}{\section*{%
\ifnumgreater{\therefsection}{0}
{References for Chapter \ref{refsection:\therefsection}}
{References before chapters}}}
\begin{document}
\cite{markey}
\include{chap1}
\include{chap2}
\printbibheading
\bibbysection[heading=subbibliography]
\end{document}