
Estoy escribiendo mi doctorado. tesis en XeLaTeX con Biblatex, y hay momentos en los que necesito compilar capítulos individuales, y momentos en los que necesito compilar el documento completo, entonces uso subarchivos, lo cual funciona de maravilla. Sin embargo, en cada uno de estos capítulos tengo un \printbibliography
comando que me gustaría desactivar al compilar el documento final, para que solo \printbibliography
se ejecute el comando en el archivo principal.
La estructura del archivo es 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}
Respuesta1
Del subfiles.sty
comando \subfile
se define como:
\newcommand\subfile[1]{\begingroup\skip@preamble\input{#1}\endgroup}
Por lo tanto, es sencillo incorporar algún código para redefinirlo localmente \printbibliography
y no hacer nada. Por ejemplo, agregue lo siguiente al preámbulo del archivo principal:
\makeatletter
\newrobustcmd*{\nobibliography}{%
\@ifnextchar[%]
{\blx@nobibliography}
{\blx@nobibliography[]}}
\def\blx@nobibliography[#1]{}
\appto{\skip@preamble}{\let\printbibliography\nobibliography}
\makeatother
Tenga en cuenta que biblatex
hace que los datos bibliográficos estén disponibles mediante comandos de citas. Entonces, a menos que desee ver las entradas de bibliografía fuera del archivo principal, no es necesario invocar los subarchivos \printbibliography
.
Respuesta2
También utilicé el enfoque de Audrey (https://tex.stackexchange.com/a/107111/85983) por un tiempo, pero me molestó tener que escribir \printbibliography
al final de cada subarchivo. Ahora estoy usando los siguientes Latex Hooks en el preámbulo de mi archivo principal:
%%% Default start and end for each subfile
\AtBeginDocument{%
}
\AtEndDocument{%
\printbibliography
\listoffigures
\listoftables
\newpage
\printacronyms[include-classes=abbrev,name=Acronyms]
}
Respuesta3
Desde la versión 2.0 de subarchivos, también se puede usar la macro de condición \ifSubfilesClassLoaded{}{}
para hacer algo similar al enfoque de Audrey (https://tex.stackexchange.com/a/107111/85983).
Con mi configuración, un MWE es el siguiente:
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}
Respuesta4
Otro enfoque podría ser distinguir entre los subarchivos y el archivo principal por su nombre de trabajo. Digamos que su archivo principal se llama Thesis.tex
, entonces el nombre del trabajo es normalmente Thesis
y puede probar
\IfEq{\jobname}{\detokenize{Thesis}}{}{%
\AtEndDocument{%
\printbibliography%
}
}
esto insertará una bibliografía al final de los subarchivos y no hará nada en su archivo principal.
(Si es posible, utilice esto antes \usepackage{biblatex}
; de lo contrario, podría generar una advertencia; consulteAdvertencia de referencias no definidas para \AtEndDocument{\printbibliography})