Когда я пишу свои лекции, я записываю их в один документ, например, такой:
% document name : main.tex
\documentclass{scrbook}
\usepackage{etoc}
\newcommand{\chaptertoc}[1][Contenu du chapitre]{%
%\etocsettocstyle{\addsec*{#1}}{}%
\etocsettocstyle{\addsec*{#1\\\rule{\textwidth}{0.4pt}} \small }{}
\localtableofcontents%
}
\usepackage{hyperref}
\usepackage[]{blindtext}
\begin{document}
\tableofcontents
\chapter{Chapter One}
\chaptertoc{}
\section{section one of chapter one}
\Blindtext
\section{section two of chapter one}
\Blindtext
\chapter{Chapter Two}
\chaptertoc{}
\section{section one of chapter two}
\Blindtext
\section{section two of chapter two}
\Blindtext
\section{section three of chapter two}
\Blindtext
\end{document}
Я продолжаю изменять и расширять этот документ main.tex и делюсь его содержанием со своими студентами по мере продвижения лекции, обычно глава за главой. Поэтому я создаю новый документ, который содержит примерно следующее:
% document name: pdf_chapter1.tex
\documentclass{article}
\usepackage[]{pdfpages}
\usepackage{hyperref}
\begin{document}
\includepdf[pages={3-5}]{main}
\end{document}
И поделитесь скомпилированным результатом. Рабочий процесс (есть) был удобен, потому что я делал это так много лет, но проблема в том, что я теряю все ссылки перекрестных ссылок глав, оглавления и уравнений в документе. Не могли бы вы помочь мне решить эту проблему или, если это невозможно, предложить другой рабочий процесс?
решение1
Я бы предложил использовать \includeonly
для компиляции меньших частей документа. Убедитесь, что вы сначала скомпилировали весь документ, чтобы номера страниц и перекрестные ссылки в меньших частях были правильными.
\documentclass{scrbook}
\usepackage{etoc}
\newcommand{\chaptertoc}[1][Contenu du chapitre]{%
%\etocsettocstyle{\addsec*{#1}}{}%
\etocsettocstyle{\addsec*{#1\\\rule{\textwidth}{0.4pt}} \small }{}
\localtableofcontents%
}
\usepackage{hyperref}
\usepackage[]{blindtext}
\begin{filecontents*}[overwrite]{cap1.tex}
\chapter{Chapter One}
\chaptertoc{}
\section{section one of chapter one}
\Blindtext
\[
E = mc^{2}\label{eq}
\]
\section{section two of chapter one}
\Blindtext
\end{filecontents*}
\begin{filecontents*}[overwrite]{cap2.tex}
\chapter{Chapter Two}
\chaptertoc{}
\section{section one of chapter two}
\Blindtext
\section{section two of chapter two}
\Blindtext
\section{section three of chapter two}
\Blindtext
\ref{eq}
\end{filecontents*}
\includeonly{cap2}
\begin{document}
\tableofcontents
\include{cap1}
\include{cap2}
\end{document}
решение2
Вероятно, механизм, аналогичный механизму \include
/ \includeonly
, был бы хорош.
Механизм, который также записывает так называемые контрольные точки со значениями счетчиков во вспомогательные файлы в случае, если что-то (часть файла вместо файла) не обрабатывается для набора текста.
Но со следующими отличиями от механизма \include
/ \includeonly
:
Вместо чтения файлов с определенными именами будут считываться части файла LaTeX, которым даны имена и которые в файле .tex-input-file вложены между последовательностью
\Filepart{⟨name of filepart⟩}
и последовательностью\EndOfFilepart
.Аналогично команде
\includeonly{⟨comma list with the names of the files that are to be read in⟩}
должна быть команда\OnlyFileparts{⟨comma list with the names of those fileparts that are to be read in for typesetting⟩}
.Если часть файла не должна считываться для набора текста, LaTeX придется переключиться в режим дословного чтения, считывать данные из файла, создавать токены символов и отбрасывать их до тех пор, пока не
\EndOfFilepart
будет найдена последовательность токенов символов.В случае, если содержимое части файла не набрано в текущем запуске LaTeX, но связанный вспомогательный файл, содержащий данные меток перекрестных ссылок и т. п., определенных в этой части файла, все еще считывается, должен быть необязательный аргумент, где, в случае загрузки пакета hyperref, можно указать URL-адрес другого файла PDF, содержащего эту часть файла, так что при перекрестных ссылках на метки перекрестных ссылок, которые были определены в ненабранной части файла, вместо внутренней ссылки без назначения (и, таким образом, с назначением движка pdfTeX, автоматически фиксированным на странице 1) отображается внешняя ссылка на этот другой файл PDF.
В следующем минимальном рабочем примере механизм собирается из следующих двух компонентов:
\OnlyFilepart{⟨comma list with the names of those fileparts that are to be read in for typesetting⟩}
и
\Filepart[⟨URL of pdf-file containing this part⟩]{⟨name of filepart⟩}...\EndOfFilepart
\OnlyFileparts
может появляться только в преамбуле основного .tex-файла.- С помощью механизма
\include
/\includeonly
контрольные точки имеют имена, соответствующие именам файлов. С помощью механизма\Filepart
...\EndOfFilepart
/\OnlyFileparts
контрольные точки нумеруются последовательно, начиная с номера 1, и они, а также связанные с ними вспомогательные файлы/.aux-файлы имеют имена согласно схемеFilepart⟨number of the checkpoint belonging to the filepart⟩
. Таким образом, несколько частей файла, которые в любом случае должны быть прочитаны вместе, могут иметь одно и то же имя. - Часть механизма, которая в случае ненабора части файла считывает эту часть файла дословно и создает токены символов и отбрасывает их, пока не
\EndOfFilepart
будет найдена последовательность, считывает не строку за строкой, а символ за символом. С одной стороны, таким образом, ни один символ не теряется в строке. С другой стороны, механизм работает медленно на медленных компьютерах. - Не вкладывайте части файла в части файла.
\Filepart
и сопоставление\EndOfFilepart
должно быть в той же области/группе.\Filepart
и соответствие\EndOfFilepart
должно находиться в том же входном файле .tex.\Filepart[⟨URL of pdf-file containing this part⟩]{⟨name of filepart⟩}...\EndOfFilepart
не должны встречаться ни в аргументах макросов, ни в текстах замены макросов, ни быть компонентом значений регистров токенов и т.п.- Код следующего минимального рабочего примера был написан на смартфоне, где был установлен TeX Live 2020. Он использует возможности, предоставляемые средой программирования expl3. Для тестирования он был скомпилирован с помощью pdflatex [pdfTeX, версия 3.14159265-2.6-1.40.21 (TeX Live 2020) (предварительно загруженный формат=pdflatex), LaTeX2e <2020-10-01> уровень патча 4, уровень программирования L3 <2021-02-18>].
- В более поздних выпусках LaTeX 2ε, где доступна новая система хуков,
\include
/\includeonly
-механизм поставляется вместе с некоторыми хуками для выполнения некоторых токенов каждый раз, когда происходит включение файла. С\Filepart
...\EndOfFilepart
/\OnlyFileparts
-механизмом хуки не реализованы/новая система хуков LaTeX 2ε не используется. Это связано с тем, что автор первоначального выпуска этого ответа еще недостаточно привык к новой системе хуков LaTeX 2ε. - Механизм
\include
/\includeonly
работает только тогда, когда — до активации\includeonly
— весь документ был скомпилирован со всеми включенными файлами столько раз, сколько необходимо для получения документа со всеми совпадающими перекрестными ссылками и т. д. Аналогично, механизм\Filepart
...\EndOfFilepart
/\OnlyFileparts
работает только тогда, когда — до активации\OnlyFileparts
— весь документ был скомпилирован со всеми включенными частями файлов столько раз, сколько необходимо для получения документа со всеми совпадающими перекрестными ссылками и т. д. - Код не был тщательно протестирован. Используйте на свой страх и риск.
\makeatletter
%----------------------------------------------------------------------------------------------------
% Infrastructure for switching to verbatim-mode and gobbling things until encountering
% \EndDocumentPart
%----------------------------------------------------------------------------------------------------
\ExplSyntaxOn
\cs_new_eq:NN \UD@StringCase \str_case:nnTF
\cs_new_eq:NN \UD@StringTail \str_tail:n
\cs_new_eq:NN \UD@IfEmpty \tl_if_empty:nTF
%\cs_new_eq:NN \UseName \use:c
%\cs_new:Npn \ExpandArgs #1
% {
% \cs_if_exist_use:cF { exp_args:N #1 }
% { \msg_expandable_error:nnn { kernel } { unknown-arg-expansion } {#1} }
% }
%\msg_new:nnn { kernel } { unknown-arg-expansion }
% { Unknown~arg~expansion~"#1" }
\ExplSyntaxOff
\newcommand\UD@SwitchToVerbatimAndGgobbleToEndOfFilepart[1]{%
\begingroup
\endlinechar=-1\relax
\let\do\@makeother\dospecials\do\^^I\do\^^M%
\UD@GgobbleToEndOfFilepartLoop{#1}{}%
}%
\begingroup
\newcommand\UD@GgobbleToEndOfFilepartLoop[4]{%
\if#4Z\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{%
\endgroup
\newcommand\UD@GgobbleToEndOfFilepartLoop[3]{%
\UD@StringCase{##2##3}{#1{#3}{\endgroup##1}}{}{%
\UD@IfEmpty{##2}%
{\UD@GgobbleToEndOfFilepartLoop{##1}{##3}}%
{\ExpandArgs{ne}\UD@GgobbleToEndOfFilepartLoop{##1}{\UD@StringTail{##2}}{##3}}%
}%
}%
}{%
\UD@GgobbleToEndOfFilepartLoop
{#1#2}%
{{#3#4}{\UD@GgobbleToEndOfFilepartLoop{##1}{##2##3}}}%
{#3#4}%
}%
}%
\@firstofone{%
\let\do\@makeother\dospecials\do\^^I\do\^^M%
\UD@GgobbleToEndOfFilepartLoop{}{}{}%
}\EndOfFilepartZ%
%----------------------------------------------------------------------------------------------------
% Infrastructure for patching/restoring \newlabel and \new@label@record:
%----------------------------------------------------------------------------------------------------
\newcommand\UD@PassFirstToSecond[2]{#2{#1}}%
\@ifdefinable\UD@Savednewlabel{}%
\@ifdefinable\UD@Savednew@label@record{}%
\newcommand*\UD@ResetNewlabelAndNew@label@record[1]{%
\AtIfFilepartIncluded{#1}{}{%
\csname @\ifx\csname ver@hyperref.\@pkgextension\endcsname\relax gobble\else firstofone\fi\endcsname
{\let\newlabel\UD@Savednewlabel}%
\let\new@label@record\UD@Savednew@label@record
}%
}%
\newcommand\UD@SwitchNewlabelAndNew@label@record[2]{%
\AtIfFilepartIncluded{#2}{}{%
\csname @\ifx\csname ver@hyperref.\@pkgextension\endcsname\relax gobble\else firstofone\fi\endcsname
{%
\let\UD@Savednewlabel\newlabel
\def\newlabel{\UD@Patchednewlabel{#1}}%
}%
\let\UD@Savednew@label@record\new@label@record
\def\new@label@record{\UD@Patchednew@label@record{#1}}%
}%
}%
\@ifdefinable\UD@Patchednewlabel@AddURL{%
\long\def\UD@Patchednewlabel@AddURL#1#2#3#4#5#6\\{{#2}{#3}{#4}{#5}{#1}}%
}%
\newcommand\UD@Patchednewlabel[3]{%
\expandafter\UD@PassFirstToSecond
\expandafter{%
\UD@Patchednewlabel@AddURL{#1}#3{}{}{}{}\\%
}%
{\UD@Savednewlabel{#2}}%
}%
\newcommand\UD@Patchednew@label@record[3]{%
\UD@Savednew@label@record{#2}{#3{xr-url}{#1}}%
}%
%----------------------------------------------------------------------------------------------------
% Infrastructure for \Filepart and \EndOfFilepart
%----------------------------------------------------------------------------------------------------
\newwrite\UD@Filepartaux
\newcommand\UD@previous@auxout{}%
\newif\ifUD@FilepartSW\UD@FilepartSWfalse
\newcommand\UD@FilepartNesting{0}%
\newcommand\UD@FilepartList{}%
\newcounter{UD@FilepartCheckpoints}%
%----------------------------------------------------------------------------------------------------
\newcommand\OnlyFileparts[1]{%
\UD@FilepartSWtrue
\let\UD@FilepartList\@empty
\@for\reserved@a:=#1\do
{%
\ifx\UD@FilepartList\@empty
\expandafter\def\expandafter\UD@FilepartList\expandafter{\reserved@a}%
\else
\expandafter\expandafter\expandafter\def
\expandafter\expandafter\expandafter\UD@FilepartList
\expandafter\expandafter\expandafter{\expandafter\UD@FilepartList\expandafter,\reserved@a}%
\fi
}%
}%
\@onlypreamble\OnlyFileparts
%----------------------------------------------------------------------------------------------------
\NewDocumentCommand\Filepart{om}{%
\relax
\xdef\UD@FilepartNesting{\the\numexpr((\UD@FilepartNesting)+1)\relax}%
\ifnum\UD@FilepartNesting>1 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{%
\@latex@error{\string\Filepart\space cannot be nested}\@eha
\UD@SwitchToVerbatimAndGgobbleToEndOfFilepart{\EndOfFilepart}%
}%
{%
\clearpage
\addtocounter{UD@FilepartCheckpoints}\@ne
\if@filesw
\IfNoValueF{#1}{%
\immediate\write\@auxout{\string\UD@SwitchNewlabelAndNew@label@record{#1}{#2}}%
}%
\immediate\write\@auxout{\string\@input{Filepart\arabic{UD@FilepartCheckpoints}.aux}}%
\IfNoValueF{#1}{%
\immediate\write\@auxout{\string\UD@ResetNewlabelAndNew@label@record{#2}}%
}%
\fi
\let\UD@previous@auxout\@auxout
\@tempswatrue
\AtIfFilepartIncluded{#2}%
{%
\let\@auxout\UD@Filepartaux
\if@filesw
\immediate\openout\UD@Filepartaux "Filepart\arabic{UD@FilepartCheckpoints}.aux"
\immediate\write\UD@Filepartaux{\relax}%
\fi
}{%
\UD@SwitchToVerbatimAndGgobbleToEndOfFilepart{%
\deadcycles\z@
\@nameuse{cp@Filepart\arabic{UD@FilepartCheckpoints}}%
\let\@auxout\UD@previous@auxout
\xdef\UD@FilepartNesting{\the\numexpr((\UD@FilepartNesting)-1)\relax}%
}%
}%
}%
}%
%----------------------------------------------------------------------------------------------------
\newcommand\AtIfFilepartIncluded[1]{%
\begingroup
\@tempswatrue
\ifUD@FilepartSW
\@tempswafalse
\def\reserved@b{#1}%
\@for\reserved@a:=\UD@FilepartList\do{%
\ifx\reserved@a\reserved@b\@tempswatrue\fi
}%
\fi
\expandafter\endgroup
\if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}%
%----------------------------------------------------------------------------------------------------
\newcommand*\EndOfFilepart{%
\ifnum\UD@FilepartNesting=1 \expandafter\@firstofone\else\expandafter\@gobble\fi
{%
\clearpage
\if@filesw
\immediate\write\UD@Filepartaux{\string\@setckpt{Filepart\arabic{UD@FilepartCheckpoints}}\@charlb}%
{\let\@elt\@wckdocumentptelt \cl@@ckpt}%
\immediate\write\UD@Filepartaux{\@charrb}%
\immediate\closeout\UD@Filepartaux
\fi
\let\@auxout\UD@previous@auxout
}%
\ifnum\UD@FilepartNesting<1 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{\@latex@error{Unmatched \string\EndOfFilepart}\@eha}%
{\xdef\UD@FilepartNesting{\the\numexpr((\UD@FilepartNesting)-1)\relax}}%
}%
\newcommand*\@wckdocumentptelt[1]{%
\immediate\write\UD@Filepartaux{\string\setcounter{#1}{\the\@nameuse{c@#1}}}%
}%
%----------------------------------------------------------------------------------------------------
\makeatother
\documentclass{scrbook}
\usepackage{etoc}
\newcommand{\chaptertoc}[1][Contenu du chapitre]{%
%\etocsettocstyle{\addsec*{#1}}{}%
\etocsettocstyle{\addsec*{#1\\\rule{\textwidth}{0.4pt}}\small}{}%
\localtableofcontents
}
%\OnlyFileparts{Lecture2}
%\OnlyFileparts{Lecture1}
%\OnlyFileparts{Lecture3,Lecture4}
\usepackage[pdfnewwindow=true]{hyperref}
\usepackage[]{blindtext}
\begin{document}
\Filepart{ToC}%
\tableofcontents
\EndOfFilepart
\Filepart[file:./Lecture1.pdf]{Lecture1}%
\chapter{Chapter One}
\chaptertoc{}
\section{section one of chapter one}
\Blindtext
\section{section two of chapter one}
\label{A label}%
\Blindtext
\EndOfFilepart
\Filepart{Lecture2}%
\chapter{Chapter Two}
\chaptertoc{}
\section{section one of chapter two}
\Blindtext
\section{section two of chapter two}
\Blindtext
\section{section three of chapter two}
\Blindtext
\EndOfFilepart
\Filepart{Lecture3}%
\chapter{Chapter Three}
\chaptertoc{}
\section{section one of chapter three}
\Blindtext
\ref{A label}%
%\expandafter\show\csname r@A label\endcsname
\section{section two of chapter three}
\Blindtext
\section{section three of chapter three}
\Blindtext
\EndOfFilepart
\Filepart{Lecture4}%
\chapter{Chapter Four}
\chaptertoc{}
\section{section one of chapter four}
\Blindtext
\section{section two of chapter four}
\Blindtext
\section{section three of chapter four}
\Blindtext
\EndOfFilepart
\Filepart{Lecture2}%
\chapter{Chapter Five - should always go together with Chapter Two}
\chaptertoc{}
Chapter Five should always go together with Chapter Two,
thus\verb|\Filepart|-commands get the same name.
\section{section one of chapter five}
\Blindtext
\section{section two of chapter five}
\Blindtext
\section{section three of chapter five}
\Blindtext
\EndOfFilepart
\end{document}