Как добавить пользовательские строки с указанным номером страницы в оглавление?

Как добавить пользовательские строки с указанным номером страницы в оглавление?

Я хочу добавить пользовательские строки для моих приложений, созданных во внешнем программном обеспечении, в оглавление. Кроме того, должна быть возможность указать количество страниц любого конкретного приложения. Как мне этого добиться?

Как MWE я приложу все усилия.

\documentclass{report}
\newcommand{\append}[2]{%
  \stepcounter{chapter}%
  \newpage\thispagestyle{empty}\phantom{-}%
  \addcontentsline{toc}{chapter}{\protect\numberline{\Alph{chapter}}{#1}}%
  \newpage\addtocounter{page}{-1}\addtocounter{page}{#2}%
}
\begin{document}
\tableofcontents
\chapter{Chapter 1}
Bla bla
\chapter{Chapter 2}
Bla bla bla
\appendix
\chapter{Appendix 1}
Blah
\append{Extra 1}{2}
\append{Extra 2}{1}
\end{document}

Сгенерированное оглавление:

МВЭ

К сожалению, для работы необходимо вставлять пустую страницу для каждого приложения.

Как избавиться от лишних пустых страниц, сохранив при этом другие особенности команды \input?

решение1

Поскольку вы не хотите включать ни одной пустой страницы, поскольку вы собираетесь отдельно печатать некоторые крупноформатные чертежи САПР, я рассмотрел, как\cftaddtitleline{toc}{chapter}{<text>}{<page>} это определено вдокументацияпакета tocloft, страница 49:

\newcommand{\cftaddtitleline}[4]{
 \addtocontents{#1}{%
  \protect\contentsline{#2}{#3}{#4}
 }
}

Таким образом, вам просто нужно использовать \addtocontentsвместо \addcontentsline. Чтобы отобразить его так же, как и другие chapterзаписи, вам следует определить заголовок как \protect\numberline{\Alph{chapter}}#1}, что создаст эту запись в вашем *.tocфайле:

\contentsline {chapter}{\numberline {2}Chapter 2}{3} %automatically done with \chapter{}
\contentsline {chapter}{\numberline {A}Appendix 1}{11} %added

Однако вы не можете использовать \thepageи увеличивать его в следующей строке, поскольку все разделы получат одинаковый номер:

  \addtocontents{toc}{\protect\contentsline{chapter}{\protect\numberline{\Alph{chapter}}#1}{\thecnt}}
  \addtocounter{page}{#2}

Я добавил счетчик, который устанавливается \thepageперед вызовом \append, и он изменен так, чтобы не влиять на номер предыдущей главы (Приложение 1).

\documentclass{report}

\newcounter{cnt}

\newcommand{\append}[2]{%
  \stepcounter{chapter}
  \addtocontents{toc}{\contentsline{chapter}{\protect\numberline{\Alph{chapter}}#1}{\thecnt}}
  \addtocounter{cnt}{#2}
}

\begin{document}
\tableofcontents
\chapter{Chapter 1}
Bla bla
\chapter{Chapter 2}
Bla bla bla
\appendix
\chapter{Appendix 1}
Blah

\setcounter{cnt}{\thepage}
\stepcounter{cnt}
\append{Extra 1}{7}
\append{Extra 2}{8}

% In case you want to add other 'normal' appendices
%\clearpage
%\setcounter{page}{\thecnt}
%\chapter{Appendix \thechapter}

\end{document}

решение2

После того, как я немного поспал, я смог придумать альтернативу, работающую по желанию. Она в некоторой степени основана на ответе У.Мартинес-Коррала.

Предыстория: Я хотел создать команду, которая будет добавлять элемент в оглавление и резервировать указанное количество страниц.

Вот код.

\documentclass{report}
\usepackage{afterpage}
\newcounter{count}
\newcounter{add}\setcounter{add}{1}
\newcommand{\append}[2]{%
    \stepcounter{chapter}%
    \setcounter{count}{\thepage}\addtocounter{count}{\theadd}%
    \addtocontents{toc}{\protect\contentsline{chapter}{\protect\numberline{\thechapter}#1}{\thecount}}%
    \addtocounter{add}{#2}%
    \afterpage{\addtocounter{page}{-1}\addtocounter{page}{\theadd}\setcounter{add}{1}}%
    \ignorespaces%
}
\begin{document}
\tableofcontents
\append{Extra 1}{3}
\append{Extra 2}{1}
\chapter{Chapter 1}
\chapter{Chapter 2}
\appendix
\chapter{Appendix A}
Some text
\append{Extra B}{2}
\append{Extra C}{1}
Text out of nowhere!
\append{Extra D}{3}
\chapter{Appendix F}
\append{Extra G}{1}
\append{Extra H}{1}
\end{document}

Несколько слов, чтобы объяснить, что происходит.

\setcounter{count}...строка рассчитывает начальную страницу фантомной главы, принимая во внимание количество уже зарезервированных страниц.

\addtocontents...добавляет пользовательскую строку в оглавление, строка форматируется точно так же, как и любая другая глава.

\addtocounter{add}{#2}увеличивает общее количество зарезервированных страниц. Это число будет использовано либо на следующей странице, либо в следующем \append.

\afterpage...вызывается, когда начинается новая страница. Он добавляет количество зарезервированных страниц к счетчику pageи сбрасывает его до 1.

\ignorespacesдобавлено, чтобы команду можно было использовать где угодно и не создавать дополнительных пробелов, см. «Текст из ниоткуда!» в примере.

Спасибо за вашу помощь :)

Связанный контент