为目录编号添加前缀

为目录编号添加前缀

我在 appdix 的页码前添加了一个前缀

\documentclass[a4paper,oneside]{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
    \copypagestyle{apx}{plain}
    \makeevenfoot{apx}{}{Apx. \thepage}{}
    \makeoddfoot{apx}{}{Apx. \thepage}{}
    \copypagestyle{chapter}{plain}
    \makeevenfoot{chapter}{}{Apx. \thepage}{}
    \makeoddfoot{chapter}{}{Apx. \thepage}{}
    \pagestyle{apx}

有什么方法可以给我的目录中的编号添加相同的前缀吗?或者有没有另一种方法可以将两个操作合并为一个?

答案1

您有以下几种选择:

  • 选项1

    这是您当前拥有的内容:更新附录的页面样式,将其作为页眉/页脚的一部分添加Apx.到前面。\thepage

    \addtodef{\appendix}{}{%
      \copypagestyle{apx}{plain}%
      \makeevenfoot{apx}{}{Apx. \thepage}{}%
      \makeoddfoot{apx}{}{Apx. \thepage}{}%
      \copypagestyle{chapter}{plain}%
      \makeevenfoot{chapter}{}{Apx. \thepage}{}%
      \makeoddfoot{chapter}{}{Apx. \thepage}{}%
      \pagestyle{apx}%
    }
    

    它的缺点是未包含在目录中。

  • 选项 2

    \thepage对附录进行全面更新,并调整附录中每个与目录相关的条目的页面宽度框。

    \addtodef{\appendix}{}{%
      \renewcommand{\thepage}{Apx.~\arabic{page}}%
      \addtocontents{toc}{\protect\setpnumwidth{4em}}%
    }
    

    \pageref也会影响目录中的条目,这本质上不是一个坏主意。但是,目录中的页码块宽度会有所不同。不一致并不总是一个好主意。

  • 选项 3

    这结合了选项 1 和 2 的一部分(但不更新\thepage)。

    \newcommand{\replacecontentsline}[3]{\oldcontentsline{#1}{#2}{Apx.~#3}}
    \addtodef{\appendix}{}{%
      \copypagestyle{apx}{plain}%
      \makeevenfoot{apx}{}{Apx. \thepage}{}%
      \makeoddfoot{apx}{}{Apx. \thepage}{}%
      \copypagestyle{chapter}{plain}%
      \makeevenfoot{chapter}{}{Apx. \thepage}{}%
      \makeoddfoot{chapter}{}{Apx. \thepage}{}%
      \pagestyle{apx}%
      \addtocontents{toc}{\let\protect\oldcontentsline\protect\contentsline
                          \let\protect\contentsline\protect\replacecontentsline}%
      \addtocontents{toc}{\protect\setpnumwidth{4em}}%
    }
    

    使用的引用\pageref仍将指向不包含的页码Apx.,这不是最终用户所期望的。

  • 选项 4

    我的首选选项是更新\thepage(因此也是\pagerefs)以及为 ToC 设置一些一致的页码块宽度。

    \setpnumwidth{4em}%
    \addtodef{\appendix}{}{%
      \copypagestyle{apx}{plain}%
      \makeevenfoot{apx}{}{\thepage}{}%
      \makeoddfoot{apx}{}{\thepage}{}%
      \pagestyle{apx}%
      \renewcommand{\thepage}{Apx.~\arabic{page}}%
    }
    

下面是使用上述选项 4 的简单示例:

在此处输入图片描述

\documentclass[oneside]{memoir}

\setpnumwidth{4em}%
\addtodef{\appendix}{}{%
  \copypagestyle{apx}{plain}%
  \makeevenfoot{apx}{}{\thepage}{}%
  \makeoddfoot{apx}{}{\thepage}{}%
  \pagestyle{apx}%
  \renewcommand{\thepage}{Apx.~\arabic{page}}%
}

\usepackage{lipsum}

\begin{document}

\sloppy% Just for this example
\tableofcontents

\chapter{A chapter}\lipsum[1-50]
\section{A section}\lipsum[1-50]

\clearpage\appendix

\chapter{An appendix}\lipsum[1-50]
\section{A section}\lipsum[1-50]

\end{document}

答案2

如果您希望将页码本身记录为Apx. #,则您不应编辑页面样式。相反,您应该重新定义\thepage

\documentclass[a4paper,oneside]{memoir}

\begin{document}

\tableofcontents

\chapter{Test}


\clearpage %So that the new \thepage will not leak to the previous chapter.

\appendix
\renewcommand\thepage{Apx. \arabic{page}}
\chapter{Test2}

\end{document}

如果您这样做,您可能还想\setpnumwidth为目录中的页码(现在包括前缀Apx)留出额外的空间。

答案3

由于您要更改附录中的页码格式,我认为您也应该重新开始页码编号。因此,我在一组用于维护 LaTeX 实验室手册的宏中这样做:

\makeatletter
\def\apxpagenumbering#1{%
   \global\c@page \@ne%  page=1 
      \gdef\thepage{Apx. \csname @#1\endcsname \c@page}%
   }
\makeatother 

现在,当您启动时appendix,您发出一个,\apxpagenumbering{<nuber format>}并且您可以选择通常的数字格式,,,arabic等等roman

正如其他答案中所述,您必须调整目录的宽度,因为默认值只有 1.55em,这不够,这些较长的页码将扩展右边距。但是,前面部分中带有简单数字的前导点将太靠左。

为了避免这种情况,您可以做的是在附录开始的位置更改这些宽度。这是通过以下方式完成的:

\makeatletter
  \addtocontents{toc}{\def\string\@pnumwidth{4em}}   
  \addtocontents{toc}{\def\string\@tocrmarg{5em}}
\makeatother

现在我们得到:

在此处输入图片描述

但这不是全部,因为现在您将丢失索引中的条目。当ind从文件构建文件时idx,除了页码之外的所有内容都将被丢弃。这没有简单的解决方案。我发现的唯一方法是使用makeidx并编译文档四次。使用此设置您无法使用,imakeidx因为索引每次运行时都会更新,这将不起作用。\index然后必须以的形式指定条目\index{<entry>|<cmd>},并且\cmd必须正确定义。

我们所做的如下:

  1. 运行不带前缀的 LaTeX
  2. 跑步makeidx
  3. 运行带前缀的 LaTeX 两次(第二次用于更新toc

现在我们要把事情做好:

在此处输入图片描述

为了使一切变得简单,为此定义了一些宏,以便我们只需输入两次命令,空的用于创建索引,其余的带有前缀。既然我们已经到了这一步,最好的办法是添加前缀的自动测量,以便我们可以根据需要对其进行更改。

完整代码如下:

\documentclass{article}
\usepackage{pgfmath}
\usepackage{makeidx}\makeindex

\usepackage{lipsum}

\newlength{\apxpnumwidth}
\newlength{\apxtocrmarg}
\newlength{\apxpgpfxwidth}
\setlength{\apxpgpfxwidth}{0pt}

\makeatletter

\newcommand{\apxpageprefix}[1]{
                \ifx\relax#1\relax
                   \def\apxpgpfx{}
                  \else
                   \def\apxpgpfx{\protect#1}
                \fi
                \settowidth{\apxpgpfxwidth}{\apxpgpfx}
                \pgfmathsetlength{\apxpnumwidth}{\the\apxpgpfxwidth+1.55em}
                \pgfmathsetlength{\apxtocrmarg}{\the\apxpnumwidth+1em}
                }

\newcommand{\apx}[1]{\apxpgpfx#1}        
\def\apxpagenumbering#1{% 
   \global\c@page \@ne%  page=1 
   \gdef\thepage{\apxpgpfx\csname @#1\endcsname \c@page}%
   }

\newcommand\apxtocwidths{%
  \addtocontents{toc}{\def\string\@pnumwidth{\string\the\string\apxpnumwidth}}   
  \addtocontents{toc}{\def\string\@tocrmarg{\string\the\string\apxtocrmarg}}
  }

\makeatother

\newcommand\apxindex[1]{\index{#1|apx}}
\apxpageprefix{\textit{Apx.}\hspace{0.1em}--}
%\apxpageprefix{}

\begin{document}

\tableofcontents

\section{A section}\lipsum[1-5]
\index{in main}

\subsection{A subsection}\lipsum[1-5]

\clearpage\appendix

\apxpagenumbering{arabic}
\apxtocwidths

\section{An appendix}\lipsum[1-5]
\apxindex{in appendix}

\subsection{A subsection}\lipsum[1-5]

\printindex

\end{document}

您必须取消注释%\apxpageprefix{}并运行 LaTeX 和makeidx。然后再次注释它并使用前缀运行 LaTeX 两次。

现在,您可以将任何您喜欢的东西用作前缀。只是为了好玩,我\usepackage{tikz}为我的 labbook 部分制作了一张图片(带有):

\newcommand{\erlenmeyer}{%
\begin{tikzpicture}[scale=0.3]
 \fill[blue!70!white] (1,0)--(0.76,0.50)--(0.24,0.50)[rounded corners=0.5mm]--     
                      (0,0)--cycle;
 \draw[rounded corners=0.5mm] (0,0)--(1,0)--(0.65,0.8)--(0.65,1.2)--(0.66,1.2)
                              --(0.34,1.2)--(0.35,1.2)--(0.35,0.8)--cycle;
 \draw[very thin,fill=white] (0.22,0.2) rectangle (0.45,0.35);
 \draw[very thin] (0.55,0.15)--(0.65,0.15) (0.55,0.35)--(0.65,0.35) 
                  (0.55,0.65)--(0.65,0.65);
\end{tikzpicture}}

获取:

在此处输入图片描述

在此处输入图片描述

相关内容