修改目录中的页码

修改目录中的页码

有什么方法可以让我文档中第 x 页上的节/章节/任何标题出现在第 x-1 页的目录中?(我使用的是 scrbook)

我希望这个结果不是针对整个文档,而是仅针对其中的一部分。

一般示例:

  • 第 3 页标题 1 在目录中列出,从第 3 页开始。(x)
  • 第 11 页标题 2 在目录中列出,从第 11 页开始。(x)
  • 第 23 页标题 3 在目录中列为从第22.(x-1)
  • 第 47 页标题 4 在目录中列为从第四十六.(x-1)
  • 第 69 页标题 4 在目录中列出,从第 69 页开始。(x)

这可能听起来很奇怪,但我这样做有充分的理由:

具体背景:

在我的特定情况下,我想我会在附录 (A) 中使用它backmatter。我在那里谈论的标题包括以下部分:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x                              x                              x
x              \section*{فصل}  x  A.1 \section{Heading}       x
x                              x                              x
x                              x                              x
x                              x                              x
x                              x                              x
x                              x                              x
x                              x                              x
x                              x                              x
x 22                           x                           23 x
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

在第 22 页上,我使用它\section*{Heading}来创建目录中未列出的章节标题。在第 23 页上,我使用它\section{Heading}来创建目录中列出的章节标题,但我希望它从第 22 页开始出现在那里。我这样做的原因是第 22 页上的文本是阿拉伯语文本,其英文翻译在第 23 页上,但我希望目录中有英文标题。

答案1

您可以抑制自动生成的目录条目并替换它。

为了抑制,请将此命令添加到您的序言中:

\DeclareRobustCommand{\SkipTocEntry}[4]{}

如果您正在使用 hyperref,请将其更改[4][5]-- 这是要抑制的目录条目中的元素数。

立即地在生成目录条目的行之前,插入行

\addtocontents{toc}{\SkipTocEntry}

如果将它应用到章节中,并且你使用它\include来插入章节,它必须与命令位于同一文件中\chapter;如果你把它放在驱动程序文件中,时间就会关闭,并且章节条目从下一个章节将被抑制。

应立即插入替换条目生成目录条目的行,以确保页码已正确解析。\newcounter{prevpage}在序言中定义一个计数器。在设置替换目录条目时,

\setcounter{prevpage}{\value{page}}
\addtocounter{prevpage}{-1}

然后使用\addtocontents{toc}{xxx}其中xxx自动生成(并抑制)的行,您可以从文件中复制该行.toc,但您应该用替换指定的页码{\theprevpage}。如果您必须\protect在原始标题的文本中使用某些命令,则应该在替换目录中执行相同的操作。

假设此行出现在目录中(该示例来自使用的测试amsbook):

\contentsline {section}{\tocsection {}{5}{Section title}}{10}

页码是{10}。您要放入文件中替换的内容是

\addtocontents{toc}{\protect\contentsline {section}{\protect\tocsection {}{5}{Section title}}{\theprevpage}}

观察到\contentsline并且\tocsection确实需要被\protect编辑。(我从使用的测试中获取了这个示例amsart.cls,但无论文档类如何,原理都应该相同。只需.toc从第一次运行中复制文件中的内容,然后进行适当的修改。)

编辑:OP 创建了一个令人钦佩的宏\transsection来处理这个问题。接下来是一个独立的示例文件,演示了如何在book类中使用他的宏。

\documentclass{book}
\usepackage{verbatim}

\DeclareRobustCommand{\SkipTocEntry}[4]{}
\newcounter{prevpage}

\newcommand{\transsection}[1]{%
  \addtocontents{toc}{\SkipTocEntry}%
  \section{#1}%
  \setcounter{prevpage}{\value{page}}\addtocounter{prevpage}{-1}%
  \addtocontents{toc}{%
    \protect\contentsline {section}{%
    \protect\numberline {\thesection}#1}{\theprevpage}}}

\begin{document}
\frontmatter
\tableofcontents

\mainmatter
\chapter{First}
\section{First section}
some text

\clearpage
\transsection{Test section}

We want this section to have a page number one less than the
real one.  This is from question 55645 in TeX.SX, where the
author is setting an Arabic page on the page before the
English translation page, and wants the TOC to show that
page number.

\vspace{1\baselineskip}
\verbatiminput{\jobname.tex}
\end{document}

答案2

下面的示例展示了如何执行此操作section

为了使用特殊部分,我定义了命令。对于目录来说,\specialsection使用命令很重要。\makeatletter

\documentclass{scrbook}

\makeatletter
\renewcommand\@pnumwidth{3.55em}
\let\@dottedtoclineorig\@dottedtocline
\def\local@dottedtocline#1#2#3#4#5{%
  \ifnum #1>\c@tocdepth \else
    \vskip \z@ \@plus.2\p@
    {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
     \parindent #2\relax\@afterindenttrue
     \interlinepenalty\@M
     \leavevmode
     \@tempdima #3\relax
     \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
     {#4}\nobreak
     \leaders\hbox{$\m@th
        \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
        mu$}\hfill
     \nobreak
     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor \the\numexpr#5-1\relax~(x-1)}%
     \par}%
  \fi}
\newcommand\specialsection[2][]{%
\addtocontents{toc}{\protect\let\protect\@dottedtocline\protect\local@dottedtocline}
   \ifx\relax#1\relax
       \section{#2}
   \else
      \section[#1]{#2}
  \fi
\addtocontents{toc}{\protect\let\protect\@dottedtocline\protect\@dottedtoclineorig}
}
\makeatother


\begin{document}
\makeatletter
\tableofcontents
\makeatother
\chapter{foo}
\backmatter
\chapter{foo}
\section*{arabic}
text in arabix
\clearpage
\specialsection{english}
text in English

\end{document}

结果:

在此处输入图片描述

答案3

您可以像这样手动填写每个部分的目录:

% When you create a new section in your text

\section*{Your section name string} % the asterisk needed.

\addtocontents
{toc}
{  \protect\contentsline{section}
   {Your section name string}
   {\number\numexpr\the\value{page} - 1\relax} % There is \thepage-1 value.
}

% The text of your section's here...

该代码是稍微改变的代码\添加内容行命令。其原始代码可以在终端中看到,如下所示:

texdef -t latex addcontentsline

相关内容