
Я не могу понять, как, черт возьми, я должен ссылаться на другие разделы в подфайлах. Я подготовил простой пример ниже:
основной
\documentclass[12pt,letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage{xr}
\usepackage{subfiles}
\begin{document}
\subfile{Afile}
\subfile{Bfile}
\end{document}
Файл
\documentclass[main.tex]{subfiles}
\begin{document}
\section{Blah Blah}
\label{section: asection}
blah blah blah blah
\end{document}
B-файл
\documentclass[main.tex]{subfiles}
\begin{document}
\section{Bo bo boooooo}
\label{section: bsection}
Unlike section \ref{section: asection}.
\end{document}
Если я компилирую основной файл, все работает правильно. Я не могу понять, как скомпилировать подфайлы отдельно и заставить работать перекрестные ссылки на другие подфайлы. Я могу заставить работать компиляцию поддокумента, используя to \externaldocument{Afile}
в преамбуле bfile, но это нарушает компиляцию основного файла. Есть ли способ заставить и основной, и подфайл правильно перекрестно ссылаться? Если вам нужны дополнительные разъяснения, не стесняйтесь спрашивать.
решение1
Команды, лежащие в основе среды документа, — это \document
и \enddocument
.
Когда подфайл загружается основным файлом TeX, команда \document
переопределяется так, чтобы не выдавать токены: она эквивалентна команде \empty
из ядра LaTeX 2ε, но в отличие от \empty
-команды она переопределяется в терминах \long
.
Пока авторы/сопровождающие пакета subfiles-package не решат изменить это поведение, вы можете заставить LaTeX проверять в преамбулах ваших sub-файлов, \document
равно ли определение команды этому \long
- \empty
-command. Если это так, sub-файл загружается из основного файла TeX через -command \subfile
и \externaldocument
не нужен. Если нет, sub-файл компилируется "автономно" и \externaldocument
нужен.
Это может выглядеть так:
основной.текс
\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}
Afile.tex
\documentclass[main.tex]{subfiles}
\DoIfAndOnlyIfStandAlone{%
\externaldocument{Bfile}%
}%
\begin{document}
\section{Blah Blah}
\label{section: asection}
blah blah blah blah
\end{document}
Bfile.tex
\documentclass[main.tex]{subfiles}
\DoIfAndOnlyIfStandAlone{%
\externaldocument{Afile}%
}%
\begin{document}
\section{Bo bo boooooo}
\label{section: bsection}
Unlike section \ref{section: asection}.
\end{document}
Источником раздражения в сочетании с xr-package/, \externaldocument
не упомянутым в руководстве subfiles-package/documentclass, может быть \include
.. \includeonly
-механизм LaTeX:
В руководстве по пакету subfiles-package сказано, что при использовании пакета subfiles-package следует использовать команду \subfileinclude
вместо команды \include
.
Тем не менее, LaTeX для каждого файла, импортируемого через \include
/ \subfileinclude
вместо \input
/, \subfile
создает отдельный/частичный .aux-файл, имя которого совпадает с именем включенного .tex-файла и расширением имени файла является .aux.
Поэтому имя файла .aux, созданного во время автономной компиляции подфайла, будет таким же, как имя файла частичного .aux, созданного во время компиляции основного файла TeX при загрузке соответствующего подфайла через \subfileinclude
.
Таким образом, при использовании \include
/ \subfileinclude
убедитесь, что соответствующий частичный .aux-файл, который получается при компиляции main.tex, удален при переключении с компиляции main.tex на компиляцию рассматриваемого подфайла отдельно. И наоборот, убедитесь, что .aux-файл, который получается при компиляции рассматриваемого подфайла отдельно, удален при переключении с компиляции рассматриваемого подфайла отдельно на компиляцию main.tex.
В случае перекрестных ссылок между различными документами вам может быть интересно узнать, как перекрестные ссылки реализованы в LaTeX. Я попытался объяснить эти вещи в своем ответе на вопрос«Как предотвратить ссылку на перечисление внутри новой среды?».
Кроме того, при перекрестных ссылках между различными документами посредством xr-package/посредством xr-hyper-package, уникальность имен пунктов назначения для гиперссылок может быть проблемой при загрузке hyperref для также наличия гиперссылок вместе с перекрестными ссылками. В моем ответе на вопрос«Перекрестная ссылка с пакетом `xr` и окончательной комбинацией PDF?»Я подробно рассказал о том, как можно обойти такие проблемы при использовании драйвера dvipdfmx и конвертации из .dvi в .pdf с помощью программы dvipdfmx (которая, например, является автоматизированной программой по умолчанию для движков TeX на основе XeTeX).