考虑一下这个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}
...产生这样的结果:
...其中章节标题打印为“Chapter ia”,并且\ref
它也打印“ia”(由于重新定义了\thechapter
as而符合预期\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 章”只会让人感到困惑。