(重新)定义包含部分编号的章节的 \ref

(重新)定义包含部分编号的章节的 \ref

考虑一下这个MWE:

\documentclass{book}
\usepackage{xcolor}
\pagecolor{yellow!10}
\usepackage{trace}

% avoid page breaks of \part, \chapter
\makeatletter
  \renewcommand{\part}{\secdef \@part \@spart}
  \let\@endpart\relax % suppress page break after \part
  \renewcommand{\chapter}{\global \@topnum \z@ \@afterindentfalse \secdef \@chapter \@schapter}
\makeatother

\begin{document}

\def\thechapter{\roman{part}.\alph{chapter}} % this changes printout in chapter header itself, but not in the ref

Citing part \ref{part:one}, chapter \traceon \ref{chapter:one} \traceoff

\part{part one}\label{part:one}
\chapter{chapter one}\label{chapter:one}

\end{document}

...产生这样的结果:

测试.png

...其中章节标题打印为“Chapter ia”,并且\ref它也打印“ia”(由于重新定义了\thechapteras而符合预期\roman{part}.\alph{chapter}

事情是这样的 - 我想不是重新定义\thechapter,也就是说,我想保留 的默认“第 1 章”打印输出\chapter,以及 的默认“1” \ref。相反,我想定义一个新命令,例如\pcref,给定一个章节标签,它将打印“IA”引用,如示例中所示。我该怎么做?

\ref我猜想,挑战的部分在于(如跟踪所示)的打印减少到:

%...
\@setref #1#2#3->\ifx #1\relax \protect \G@refundefinedtrue \nfss@text {\reset@
font \bfseries ??}\@latex@warning {Reference `#3' on page \thepage \space undef
ined}\else \expandafter #2#1\null \fi 
#1<-\r@chapter:one 
#2<-\@firstoftwo 
#3<-chapter:one
{\ifx}
{false}
{\expandafter}

\r@chapter:one ->{i.a}{1}

\@firstoftwo #1#2->#1
#1<-i.a
#2<-1
{the letter i}

\null ->\hbox {}
{\hbox}
%...

... 也就是说,当\ref调用时,\r@chapter:one命令已经设置为 或i.a,具体1取决于\thechapter;也就是说,如果在\label调用时没有关于零件号的信息,则任何重新定义都无法使用它。所以,我猜,棘手的部分是完成所有这些(使用旧 的\ref新命令)而无需重新定义...\pcref\thechapter\label

答案1

我不会跟着你避免分页,但我只会向你展示如何做你想要做的事情。

\documentclass{book}

\makeatletter
\renewcommand{\p@chapter}{\thepart.}
\makeatother

\begin{document}
\mainmatter
\part{Some part title}

\chapter{The chapter title}\label{A}

\section{A section title}\label{B}

``\ref{A}'' is a reference to a chapter, while ``\ref{B}'' is a reference to a section

\end{document}

在此处输入图片描述

解释:\p@chapter字首需要引用时,将其添加到章节号中。每当您这样做时

\newcounter{foo}

LaTeX 默认提供一个空\p@foo宏。


如果你想用不同的方式引用章节,你可以这样做

\documentclass{book}

\makeatletter
\renewcommand{\p@chapter}{\maybe@part{\thepart.}}
\newcommand{\pcref}[1]{\begingroup\let\maybe@part\@iden\ref{#1}\endgroup}
\protected\def\maybe@part#1{}
\makeatother

\begin{document}
\mainmatter
\part{Some part title}

\chapter{The chapter title}\label{A}

\section{A section title}\label{B}

``\ref{A}'' is a reference to a chapter, while ``\ref{B}'' is a reference to a section
and ``\pcref{A}'' is a reference to a chapter with the part number attached to it.

\end{document}

但我会避免这样做。章节应该独立于部分编号,这样问题就不会出现。有两个或多个“第 1 章”只会让人感到困惑。

在此处输入图片描述

相关内容