
Não consigo descobrir como devo fazer referência a outras seções em subarquivos. Preparei um exemplo simples abaixo:
principal
\documentclass[12pt,letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage{xr}
\usepackage{subfiles}
\begin{document}
\subfile{Afile}
\subfile{Bfile}
\end{document}
Um arquivo
\documentclass[main.tex]{subfiles}
\begin{document}
\section{Blah Blah}
\label{section: asection}
blah blah blah blah
\end{document}
Arquivo B
\documentclass[main.tex]{subfiles}
\begin{document}
\section{Bo bo boooooo}
\label{section: bsection}
Unlike section \ref{section: asection}.
\end{document}
Se eu compilar o arquivo principal, tudo funcionará corretamente. Não consigo descobrir como compilar os subarquivos separadamente e fazer com que a referência cruzada para outros subarquivos funcione. Posso fazer com que a compilação do subdocumento funcione usando to \externaldocument{Afile}
no preâmbulo do bfile, mas isso interrompe a compilação do arquivo principal. Existe alguma maneira de fazer com que o arquivo principal e o subarquivo sejam cruzados corretamente? Se precisar de mais esclarecimentos, fique à vontade para perguntar.
Responder1
Os comandos que fundamentam o ambiente de documento são \document
e \enddocument
.
Quando um subarquivo é carregado pelo arquivo TeX principal, o comando \document
é redefinido para não entregar tokens: é igual ao comando \empty
do kernel 2ε do LaTeX, mas ao contrário do \empty
-command, ele é redefinido em termos de \long
.
Contanto que os autores/mantenedores de pacotes do pacote de subarquivos não decidam mudar esse comportamento, você pode fazer com que o LaTeX verifique nos preâmbulos de seus subarquivos se a definição do comando \document
é igual a esse \long
- \empty
-comando. Nesse caso, o subarquivo é carregado do arquivo TeX principal por meio do \subfile
comando - e \externaldocument
não é necessário. Caso contrário, o subarquivo é compilado "independente" e \externaldocument
é necessário.
Poderia ser assim:
principal.tex
\documentclass[12pt,letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage{xr}
%\usepackage{xr-hyper} % in case of also loading hyperref.
\makeatletter
\newcommand\longempty{}%
\newcommand\DoIfAndOnlyIfStandAlone{%
\ifx\document\longempty
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
}%
\makeatother
\usepackage{subfiles}
\begin{document}
\subfile{Afile}
\subfile{Bfile}
\end{document}
Arquivo.tex
\documentclass[main.tex]{subfiles}
\DoIfAndOnlyIfStandAlone{%
\externaldocument{Bfile}%
}%
\begin{document}
\section{Blah Blah}
\label{section: asection}
blah blah blah blah
\end{document}
Arquivo B.tex
\documentclass[main.tex]{subfiles}
\DoIfAndOnlyIfStandAlone{%
\externaldocument{Afile}%
}%
\begin{document}
\section{Bo bo boooooo}
\label{section: bsection}
Unlike section \ref{section: asection}.
\end{document}
Uma fonte de irritação em conjunto com o xr-package/ \externaldocument
não mencionado no manual do subfiles-package/documentclass pode ser o mecanismo \include
.. do LaTeX:\includeonly
O manual do pacote de subarquivos diz que ao usar o pacote de subarquivos deve-se usar o comando \subfileinclude
em vez do comando \include
.
No entanto, o LaTeX faz, para cada arquivo importado via \include
/ \subfileinclude
em vez de \input
/, \subfile
um arquivo .aux separado/parcial cujo nome de arquivo é igual ao nome do arquivo .tex incluído e cuja extensão de nome de arquivo é .aux .
Portanto, o nome do arquivo .aux criado durante a compilação autônoma de um subarquivo será o mesmo que o nome do arquivo .aux parcial criado durante a compilação do arquivo TeX principal ao carregar o subarquivo em questão via \subfileinclude
.
Portanto, ao usar \include
/ \subfileinclude
certifique-se de ter o arquivo .aux parcial correspondente que vem da compilação main.tex removido ao mudar da compilação main.tex para a compilação do subarquivo em questão de forma independente. Vice-versa, certifique-se de remover o arquivo .aux proveniente da compilação autônoma do subarquivo em questão ao alternar da compilação autônoma do subarquivo em questão para a compilação main.tex.
No caso de referência cruzada entre documentos diferentes, você pode estar interessado em um esboço de como a referência cruzada é implementada no LaTeX. Tentei explicar essas coisas na minha resposta à pergunta"Como evitar referência à enumeração dentro de um novo ambiente?".
Além disso, ao fazer referência cruzada entre diferentes documentos por meio do xr-package/por meio do xr-hyper-package, a exclusividade dos nomes dos destinos dos hiperlinks pode ser um problema ao carregar o hyperref por também ter hiperlinks junto com o cross -referências. Na minha resposta à pergunta"Referência cruzada com pacote `xr` e combinação final de PDF?"Eu elaborei como você pode contornar esses problemas ao usar o driver dvipdfmx e converter de .dvi para .pdf por meio do programa dvipdfmx (que é, por exemplo, o padrão automatizado com mecanismos TeX baseados em XeTeX).