Какой способ экспорта Table of contents
используемого мной .tex
файла в отдельный файл будет предпочтительным .pdf
?
В настоящее время у меня есть my-report.tex
файл, и я хочу связать результат pdflatex
( my-report.pdf
) с my-report-toc.pdf
, который содержит только оглавление.
Есть ли простой способ добиться этого?
Мой .tex
файл имеет следующую структуру (упрощенно):
...
\begin{titlepage}
\includepdf[pages=-]{abstract.pdf}
\end{titlepage}
% -------------------------------------------------
% This should go to a separate .pdf file on export.
\tableofcontents
\pagebreak
% -------------------------------------------------
\section{Section1}
...
\section{Section2}
...
\section{Section3}
...
решение1
Извлечение PDF-файлов
Для извлечения страниц из файла PDF можно использовать внешние инструменты, например pdftk
. Если оглавление находится на страницах 5 и 6:
pdftk myreport.pdf cat 5-6 output myreport-toc.pdf
\include
Если основной документ разделен на несколько \include
файлов, то он
\tableofcontents
помещается в отдельный файл myreport-tableofcontents.tex
:
\tableofcontents
\newpage
и myreport.tex
включить его оглавление:
\include{myreport-tableofcontents}
Затем myreport-toc.tex
включает только оглавление:
\includeonly{myreport-tableofcontents}
\input{myreport}
С hyperref
и ссылками
Если myreport.tex
загружает пакет hyperref
, то файл таблицы содержания myreport.toc
также содержит имена якорей. Это может быть использовано для создания междокументных ссылок. Например, файл обзора для моего пакета на CTAN,обердиек.pdfвключает в себя таблицу содержания всех пакетов в комплекте. Исходный файлобердиек.тексиспользует эту технику, см. определение \tocinclude
в примере ниже. Конечно, и то, и myreport.tex
другое myreport-toc.tex
нужно hyperref
.
Также необходимо:
Все макросы, используемые в,
myreport.toc
должны быть предоставлены вmyreport-toc.tex
.Следует использовать тот же класс, шрифты, макет страницы и т. д.
В случае номера страницы пример использует
zref
для помещения данных для номеров страниц в.aux
файлmyreport
. Меткаtoc
записывает номер страницы для начальной страницы оглавления. С помощью модуляzref-thepage
также запоминается визуальный вид всех номеров страниц в документе. Затем.aux
файлmyreport
считываетсяzref-xr
вmyreport-toc.tex
.
Файл myreport.tex
:
\documentclass{book}
\usepackage{zref-abspage,zref-thepage}
\makeatletter
\newcommand*{\pagevaluelabel}[1]{%
\zref@labelbyprops{toc}{abspage}%
}
\makeatother
\AtBeginDocument{%
\addtocontents{toc}{\string\providecommand\string\pagevaluelabel[1]{}}%
\addtocontents{toc}{\string\pagevaluelabel{toc}}%
}
\usepackage{hyperref}
\setcounter{secnumdepth}{4}
\begin{document}
\frontmatter
Title page
\newpage
\chapter*{Foreword}
\tableofcontents
\mainmatter
\chapter{Chapter}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
\end{document}
Файл myreport-toc.tex
:
\documentclass{book}
\usepackage{hyperref}
\usepackage{zref-xr}
\zexternaldocument[main:]{test}\relax
\makeatletter
\newcommand*{\tocinclude}[1]{%
\chapter*{\contentsname
\@mkboth{\MakeUppercase\contentsname}%
{\MakeUppercase\contentsname}%
}%
\begingroup
\makeatletter
\def\@prj{#1}%
\let\contentsline\foreign@contentsline
\input{\@prj.toc}%
\endgroup
}
\def\foreign@contentsline#1#2#3#4{%
\ifx\\#4\\%
\csname l@#1\endcsname{#2}{#3}%
\else
\ifHy@linktocpage
\csname l@#1\endcsname{{#2}}{%
\hyper@linkfile{#3}{\@prj.pdf}{#4}%
}%
\else
\csname l@#1\endcsname{%
\hyper@linkfile{#2}{\@prj.pdf}{#4}%
}{#3}%
\fi
\fi
}%
\begin{document}
\makeatletter
\zref@refused{main:toc}
\setcounter{page}{%
\numexpr\zref@extractdefault{main:toc}{abspage}{1}\relax
}
\renewcommand*{\thepage}{%
\zref@extractdefault{main:thepage\number\value{page}}%
{page}{\arabic{page}}%
}
\tocinclude{myreport}
\end{document}
решение2
Первый метод (сshorttoc
)
Самый простой способ — использовать команду \anothertableofcontents
из shorttoc
пакета, которая загружает и печатает оглавление из произвольного .toc
файла.
Если ваш основной документ
my-report.tex
\documentclass{article}
\usepackage{blindtext}
\begin{document}
\tableofcontents
\blinddocument
\end{document}
создайте my-report-toc.tex
со следующим содержимым
my-report-toc.tex
\documentclass{article}
\usepackage{shorttoc}
\usepackage{xspace} % this shouldn't be needed in your document
\begin{document}
\anothertableofcontents{my-report}{Contents}{3}
\end{document}
При компиляции последнего результата my-report-toc.pdf
будет получено следующее оглавление my-report.pdf
:
Второй метод (сpdfpages
)
Другой метод — использовать pdfpages
пакет для загрузки только страниц ToC в другом файле. В этом случае страницы, содержащие ToC, не должны содержать ничего другого.
Если ваш основной документ
my-report.tex
\documentclass{article}
\usepackage{blindtext}
\begin{document}
\tableofcontents
\clearpage
\blinddocument
\end{document}
создайте my-report-toc.tex
со следующим содержимым (замените pages=1
реальным диапазоном страниц вашего ToC)
my-report-toc.tex
\documentclass{article}
\usepackage{pdfpages}
\begin{document}
\includepdf[pages=1]{my-report.pdf}
\end{document}
При компиляции последнего результата my-report-toc.pdf
будет получено следующее оглавление my-report.pdf
:
решение3
Вы можете использовать его pdfseparate
для извлечения страницы или диапазона страниц из PDF-файла.
Предполагая, что оглавление занимает всего одну страницу, попробуйтеpdfseparate -f 2 -l 2 my-report.pdf my-report-toc.pdf
Конечно, для этого вам необходимо знать, сколько страниц занимает оглавление.
решение4
mycontents.tex
:
\documentclass{article}
\begin{document}
\section*{My Contents}
\input{mwe.toc}
\end{document}
Гдеmwe.toc
находится вспомогательный файл вашегоуже скомпилировано mwe.tex
основной документ в том же каталоге.
Обратите внимание, что некоторые редакторы могут перемещать эти файлы в другое место или удалять вспомогательные файлы после компиляции, но при компиляции из терминала проблем не возникает.