如何将 refsection 和 xcite 一起使用?

如何将 refsection 和 xcite 一起使用?

main.tex我有一个名为涉及多个环境的主要文档refsection。我有一些单独编译的图形,它们将放置在其中一些图形中refsection。假设Fig1.tex创建Fig1.pdf应该出现在第一个refsectionmain.tex

我正在尝试使用xcitemain.texto导入引文Fig1.tex。但在编译时,Fig1.tex我的引文均未被识别。我理解这是因为Fig1.tex我无法指定要使用哪个引用xcite

有什么建议可以解决这个问题吗?

答案1

据我所知,xcite它与不兼容biblatex(这并不奇怪,因为它biblatex完全重新实现了整个引文和参考书目处理)。有巧妙的方法可以实现biblatex–BibTeX 桥接,xcite如 egreg 在结合内部和外部书目参考。但据我所知,没有biblatexbiblatex功能xcite

原则上你可以将我的解决方案应用于如何导入/打印从单独/外部文档创建的参考书目?main.tex。本质上,该代码只是从父文档(或)加载所有参考书目和引文信息,maindoc.tex并将其提供给子文档(Fig1.texcoverletter.tex)。子文档本身只能使用这些信息,而不能影响这些信息。

这里提出的解决方案有几个注意事项

  1. 父文档和子文档都必须biblatex使用相同的选项加载(一些选择可以多种多样,但对有影响的选择.bbl却不能多种多样。
  2. 您只能引用子文档中\nocite在父文档中引用(或被引用)的条目。
  3. 此外,子文档中的引用将被视为在父文档中不存在,即,它们不会影响上下文中的排序顺序sorting=none,不会增加任何引用计数器,也不会与“ibid”跟踪器交互。
  4. 子文档中的引用只能取自其在父文档中出现的参考上下文。

对于refsections,您需要手动告诉子文档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

而不是上面的子文档的定义。

相关内容