main.tex
我有一个名为涉及多个环境的主要文档refsection
。我有一些单独编译的图形,它们将放置在其中一些图形中refsection
。假设Fig1.tex
创建Fig1.pdf
应该出现在第一个refsection
中main.tex
。
我正在尝试使用xcite
从main.tex
to导入引文Fig1.tex
。但在编译时,Fig1.tex
我的引文均未被识别。我理解这是因为Fig1.tex
我无法指定要使用哪个引用xcite
。
有什么建议可以解决这个问题吗?
答案1
据我所知,xcite
它与不兼容biblatex
(这并不奇怪,因为它biblatex
完全重新实现了整个引文和参考书目处理)。有巧妙的方法可以实现biblatex
–BibTeX 桥接,xcite
如 egreg 在结合内部和外部书目参考。但据我所知,没有biblatex
–biblatex
功能xcite
。
原则上你可以将我的解决方案应用于如何导入/打印从单独/外部文档创建的参考书目?main.tex
。本质上,该代码只是从父文档(或)加载所有参考书目和引文信息,maindoc.tex
并将其提供给子文档(Fig1.tex
或coverletter.tex
)。子文档本身只能使用这些信息,而不能影响这些信息。
这里提出的解决方案有几个注意事项
- 父文档和子文档都必须
biblatex
使用相同的选项加载(一些选择可以多种多样,但对有影响的选择.bbl
却不能多种多样。 - 您只能引用子文档中
\nocite
在父文档中引用(或被引用)的条目。 - 此外,子文档中的引用将被视为在父文档中不存在,即,它们不会影响上下文中的排序顺序
sorting=none
,不会增加任何引用计数器,也不会与“ibid”跟踪器交互。 - 子文档中的引用只能取自其在父文档中出现的参考上下文。
对于refsection
s,您需要手动告诉子文档refsection
使用哪个。幸运的是,这非常简单:您只需设置一个名为的计数器refsection
(例如\setcounter{refsection}{3}
在下面的示例中)。为了能够正确执行此操作,您需要refsection
从父文档中找出正确的。该命令\therefsection
可以帮助您(如果您不想自己计算相关命令)。
main.tex
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=numeric, backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
\newrefsection
This is refsetcion~\therefsection
\cite{sigfridsson,vizedom:related}
\printbibliography
\newrefsection
This is refsetcion~\therefsection
\cite{sigfridsson,worman}
\printbibliography
\newrefsection
This is refsetcion~\therefsection
\cite{sigfridsson,geer}
\printbibliography
\end{document}
external.tex
与\importbibfrom{<parent base name>}
和\setcounter{refsection}{<relevant refsection>}
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=numeric, backend=biber]{biblatex}
\makeatletter
\newcommand*{\importbibfrom}[1]{%
\def\blx@bblfile{%
\blx@secinit
\begingroup
\blx@bblstart
\InputIfFileExists{#1.bbl}
{\blx@info@noline{... file '#1.bbl' found}%
\global\toggletrue{blx@bbldone}}
{\blx@info@noline{... file '#1.bbl' not found}%
\typeout{No file #1.bbl.}}%
\blx@bblend
\endgroup
% global sorting as this is called at BeginDocument
\csnumgdef{blx@labelnumber@\the\c@refsection}{0}}}
\global\let\blx@rerun@biber\relax
\makeatother
\importbibfrom{main}
\setcounter{refsection}{3}
\begin{document}
\cite{sigfridsson}
\end{document}
运行通常的编译循环main.tex
pdflatex main
biber main
pdflatex main
pdflatex main
然后只运行 LaTeXexternal.tex
pdflatex external
pdflatex external
注意:请注意,如果您已启用,此解决方案将不起作用defernumbers
。这是因为defernumbers
需要.aux
文件才能正确处理标签编号。上述解决方案仅读取.bbl
而不是.aux
。
为了使defernumbers
工作正常进行,我们可以将文件的相关部分.aux
从父级重定向到另一个文件(.naux
)并在子文档中读取。(另一种解决方案是读取.aux
父级的整个文件,只执行相关的标签编号命令,跳过其余部分。这与父文件中所做的类似xcite
,而且不需要额外的代码 - 但是,这需要我xcite
更详细地了解此方法的工作原理,所以我选择了下面您可以看到的内容。)
添加
\makeatletter
\newwrite\blxconi@numaux@out
\AtEndDocument{%
\begingroup
\immediate\openout\blxconi@numaux@out\jobname.naux\relax
\iftoggle{blx@defernumbers}
{\iftoggle{blx@runbiber}
{}
{\def\do#1{\blx@auxwrite\blxconi@numaux@out{}{#1}}
\dolistloop\blx@localnumaux}}
{}%
\immediate\closeout\blxconi@numaux@out
\endgroup}
\makeatother
到父文档并使用
\makeatletter
\newcommand*{\blxconi@readdefernums}[1]{%
\begingroup
\makeatletter
\@input{#1.naux}%
\makeatother
\endgroup}
\newcommand*{\importbibfrom}[1]{%
\def\blx@bblfile{%
\blx@secinit
\begingroup
\blx@bblstart
\InputIfFileExists{#1.bbl}
{\blx@info@noline{... file '#1.bbl' found}%
\global\toggletrue{blx@bbldone}}
{\blx@info@noline{... file '#1.bbl' not found}%
\typeout{No file #1.bbl.}}%
\blx@bblend
\endgroup
% global sorting as this is called at BeginDocument
\csnumgdef{blx@labelnumber@\the\c@refsection}{0}}%
\blxconi@readdefernums{#1}}
\global\let\blx@rerun@biber\relax
\makeatother
而不是上面的子文档的定义。