Bibliografias ao usar subarquivos

Bibliografias ao usar subarquivos

Estou escrevendo meu doutorado. tese em XeLaTeX com Biblatex, e há momentos em que preciso compilar capítulos individuais e momentos em que preciso compilar o documento inteiro, então uso subarquivos, o que funciona maravilhosamente bem. Porém, em cada um desses capítulos tenho um \printbibliographycomando, que gostaria de desligar na hora de compilar o documento final, para que apenas o \printbibliographycomando seja executado no arquivo principal.

A estrutura do arquivo é algo como:

Main.tex:

\usepackage{subfiles, biblatex}
\begin{document}

\subfile{Chapter1.tex}

\printbibliography
\end{document}

Chapter1.tex:

\documentclass[Main.tex]{subfiles}
\begin{document}
\cite{Someguy1981}
\printbibliography
\end{document}

Responder1

Do subfiles.stycomando \subfileé definido como:

\newcommand\subfile[1]{\begingroup\skip@preamble\input{#1}\endgroup}

Portanto, é simples conectar algum código para redefinir localmente \printbibliographye não fazer nada. Por exemplo, adicione o seguinte ao preâmbulo do arquivo principal:

\makeatletter

\newrobustcmd*{\nobibliography}{%
  \@ifnextchar[%]
    {\blx@nobibliography}
    {\blx@nobibliography[]}}

\def\blx@nobibliography[#1]{}

\appto{\skip@preamble}{\let\printbibliography\nobibliography}

\makeatother

Observe que biblatexdisponibiliza dados bibliográficos por meio de comandos de citação. Portanto, a menos que você queira visualizar as entradas da bibliografia fora do arquivo principal, os subarquivos não precisam ser invocados \printbibliography.

Responder2

Também usei a abordagem de Audrey (https://tex.stackexchange.com/a/107111/85983) por um tempo, mas fiquei chateado por ter que escrever \printbibliographyno final de cada subarquivo. Agora estou usando os seguintes Latex Hooks no preâmbulo do meu arquivo principal:

%%% Default start and end for each subfile
\AtBeginDocument{%
}

\AtEndDocument{%
    \printbibliography
    \listoffigures
    \listoftables
    \newpage
    \printacronyms[include-classes=abbrev,name=Acronyms]
}

Responder3

Desde a versão 2.0 dos subarquivos, também é possível usar a macro de condição \ifSubfilesClassLoaded{}{}para fazer algo semelhante à abordagem de Audrey (https://tex.stackexchange.com/a/107111/85983).

Com minha configuração, um MWE é o seguinte:

principal.tex

\documentclass{book}
\usepackage{biblatex}
\usepackage{subfiles} % must be last usepackage

\providecommand{\topdir}{.}
\addglobalbib{\topdir/references.bib} % topdir is needed here so that
                                      % we can resolve the path in the subfile
                                      % correctly. There we re-define the
                                      % topdir macro to the location of the
                                      % bib file.

\begin{document}
\subfile{dir/sub}
\printbibliography[heading=bibintoc]{}
\end{document}

sub.tex

\providecommand{\topdir}{..} % reset all paths to location of main.tex
\documentclass[../main.tex]{subfiles}

\begin{document}
% some content with citations

\ifSubfilesClassLoaded{%
    \printbibliography{}
}{} % we have no 'else' action
\end{document}

Responder4

Outra abordagem poderia ser distinguir entre os subarquivos e o arquivo principal pelo nome do trabalho. Digamos que seu arquivo principal seja chamado Thesis.tex, então o nome do trabalho é normalmente Thesise você pode testar

\IfEq{\jobname}{\detokenize{Thesis}}{}{%
    \AtEndDocument{%
        \printbibliography%
    }
}

isso irá inserir uma bibliografia no final dos subarquivos e não fará nada no seu arquivo principal.

(se possível, use isso antes \usepackage{biblatex}, caso contrário, poderá causar um aviso, consulteaviso de referências indefinidas para \AtEndDocument{\printbibliography})

informação relacionada