这是我发布的问题:“我需要输出“参见第 2.3 节”,其中引用的节是第二章的第三节。”
你们都对。我必须重新定义这个问题。
许多不同的地方都引用了这些章节:
- 在目录中。由
\tableofcontents
minitoc
在 minitocs 中。由包管理fancyhdr
在标题中。由包管理- 就像一个领导者部分。由管理
\section
- 正文。由
\ref
在目录和 minitocs 中,由于每个部分都出现在其章节下方(带有一些缩进),因此无需在章节号前加上章节号。标签范围是本地的;所以我需要本地渲染。示例:
1. Chapter One ------------------1
1. First section -----------1
2. Second section ----------3
2. Chapter Two -----------------5
1. First section ...........5
这意味着第 1.1 节和第 2.1 节必须呈现为第 1 节。
当我们使用\section
命令时,我们知道我们在哪一章:它显示在页面的标题中。所以我还想要本地范围:
1. First section
bla bla
2. Second section
bla bla
在标题中我想要全局范围:
1. Chapter One 1.1. First section
在文本中,我们可以对文本的任意点进行交叉引用。所以我们需要全局范围:
See section 1.1 (first section in first chapter)
这就是问题所在:默认行为在任何地方都赋予全局范围。但如果我重新定义为\thesection
本地范围,那么我就会在所有地方重新定义。
这是我的代码:
\documentclass[catalan]{book}
\usepackage{fancyhdr}
\usepackage{nameref}
\usepackage{minitoc}
\usepackage{hyperref}
\makeindex
\dominitoc
%\renewcommand{\thesection}{\arabic{section}}
\renewcommand{\chaptermark}[1]{\markboth{\thechapter\ #1}{}}
\renewcommand{\sectionmark}[1]{\markboth{\thechapter.\thesection\ \ #1}}
\fancyhead{}
\fancyhead[LO]{\leftmark}
\fancyhead[RE]{\thechapter.\rightmark}
\pagestyle{fancy}
\begin{document}
\tableofcontents
\chapter{One}
\minitoc[e]
\section{First section}\label{sec:A}
aaaaaa \newpage bbbbbbbb \newpage ccccccccccc
\chapter{Two}
\minitoc[e]
\section{Second section}\label{sec:B}
See sections \ref{sec:A} and \ref{sec:B}
\end{document}
答案1
我认为你把标记弄反了。你想在奇数页上做右边的标记,在偶数页上做左边的标记。
因此,这有点像黑客攻击,但它似乎可以让对章节的引用按照你想要的方式出现。
\documentclass[catalan]{book}
\usepackage{fancyhdr}
\usepackage{nameref}
\usepackage{hyperref}
\usepackage{minitoc}
\makeindex
\dominitoc
\renewcommand\thesection{\arabic{section}}
\renewcommand{\chaptermark}[1]{\markboth{\thechapter\ #1}{}}
\renewcommand{\sectionmark}[1]{\markright{\thechapter.\thesection\ #1}}
\fancyhead{}
\fancyhead[LE]{\leftmark}
\fancyhead[RO]{\rightmark}
\pagestyle{fancy}
\makeatletter
\def\T@ref#1{%
\NR@setref{#1}\checkforsectioni{#1}%
}
\def\checkforsectioni#1#2#3#4#5{%
\checkforsectionii{#1}#4\@nil.\@nil\@nnil
}
\def\checkforsectionii#1#2.#3\@nil#4\@nnil{%
\ifnum\pdfstrcmp{#2}{section}=\z@
#3%
\else\ifnum\pdfstrcmp{#2}{subsection}=\z@
#3%
\else
#1%
\fi\fi
}
\makeatother
\begin{document} \tableofcontents \chapter{One}
\minitoc[e]
\section{First section}
\label{sec:A}
aaaaaa \newpage bbbbbbbb \newpage
ccccccccccc
\chapter{Two} \minitoc[e]
\section{Second section}
\label{sec:B}
\subsection{Sub}
\label{sec:C}
See sections \ref{sec:A}, \ref{sec:B}, and \ref{sec:C}.
\end{document}
这是因为 hyperref 在 aux 文件中写入了如下条目
\newlabel{sec:A}{{1}{3}{First section\relax }{section.1.1}{}}
如果你跟踪 的执行\ref
,你会看到\T@ref
扩展为\NR@setref{#1}\@firstoffive{#1}
,并且\@firstoffive
在 的第二个参数之前使用\newlabel
。也就是说,它最终扩展为
\@firstoffive{1}{3}{First section\relax }{section.1.1}{}
\@firstoffive
您可以通过替换为 5 个参数的宏来获得不同的行为。在本例中,\checkforsectioni
它吸收 5 个参数,然后使用 TeX 的分隔参数功能在其第 4 个参数中抓取第一个句点(如果存在)之前的文本。如果该文本是section
或subsection
,则使用的文本是第一个句点之后的文本,即1.1
本例中的内容。否则,它会执行正常操作并扩展到第一个参数。