\fancyhead[LO,RE]{\hyperlink{\rightmark}{\bfseries\rightmark}}
(\leftmark
都一样)导致错误:
TeX capacity exceeded, sorry [input stack size...
为什么?(这里,有双重功能:超链接的名称和文本参数(实际上它是之前在宏\rightmark
内部创建超目标的部分的全名(例如 1.2 mysection) 。)\section{...}
这是一段简单的工作代码。我的想法是让章节和部分名称在标题中自动超链接。此代码有效,但如果您取消注释,\usepackage[]{babel}
则会产生有问题的错误。
\documentclass[pdftex,a4paper,12pt,oneside]{book}%
%\usepackage[magyar,english]{babel}
\usepackage{fancyhdr}
\usepackage{xifthen}
\usepackage{xstring}
\usepackage{hyperref}
\hypersetup{colorlinks,
linktoc=all,
hypertexnames=false,
unicode=true,
bookmarksnumbered=false,
pdfmenubar=true,
pdftoolbar=true}
%------- Chapter link ------------
\newcommand{\chapterlink}[1]{\addtocounter{chapter}{1}\hypertarget{\thechapter\ #1}{}\addtocounter{chapter}{-1}}
\newcommand{\Chapter}[2][]{\chapterlink{#2}\ifthenelse{\equal{#1}{}}{\chapter{#2}}{\chapter{#1}{#2}}}
%------- Section link ------------
\newcommand{\sectionlink}[1]{\addtocounter{section}{1}\hypertarget{\thesection\ #1}{}\addtocounter{section}{-1}}
\newcommand{\Section}[2][]{\sectionlink{#2}\ifthenelse{\equal{#1}{}}{\section{#2}}{\section{#1}{#2}}}
\newcommand{\mainheader}
{
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\chaptermark}[1]{\markboth{\thechapter\ ##1}{}}
\renewcommand{\sectionmark}[1]{\markright{\thesection\ ##1}}
\fancyhead[LO,RE]{\hyperlink{\leftmark}{\bfseries\StrBehind{\leftmark}{\ }}\ :\ \hyperlink{\rightmark}{\bfseries\StrBehind{\rightmark}{\ }}}
\fancyhead[LE,RO]{\bfseries\thepage}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0pt}
\addtolength{\headheight}{2.5pt}
\fancypagestyle{plain}{\fancyhead{}\renewcommand{\headrulewidth}{0pt}}
}
%-----------------------------------
\begin{document}
\mainheader
\Chapter{Chapter one}
chapter text chapter text chapter text chapter text chapter text chapter text
\newpage
\Section{Section one}
section text section text section text section text section text section text
\newpage
section text section text section text section text section text section text
\end{document}
研究该宏的含义\rightmark
我发现以下内容:
macro:->\expandafter \@rightmark \firstmark \@empty \@empty
所以我研究了一下\firstmark
没有\usepackage[magyar]{babel}
:
{1:Chapter-One}{3:Section-One}
%1 和 3 是我的私人计数器值,是超链接中的唯一 ID,文本是章节名称和部分名称
和 \usepackage[magyar]{babel}
:
{\protect \foreignlanguage {magyar}{\protect \bbl@restore@actives 1:Chapter-One}}{\protect \foreignlanguage {magyar}{\protect \bbl@restore@actives 3:Section-One}}
肯定不是完全可扩展的:)
但是这次调查给了我解决问题的线索。 \meaning\firstmark 可以被解析并拆分为子字符串以获取我想要用作 \hyperlink 名称和文本的那部分文本。
(如果有人想看整个 MWE,我很乐意展示它。)
答案1
正如我对您的类似问题的回答中所述嵌套宏和超链接问题\hyperlink
,和匹配的第一个参数\hypertarget
必须是完全可扩展的字符串。此字符串仅用作内部名称,类似于\label
和匹配的名称\ref
。
因此,您应该尝试使用其他内容而不是部分文本作为标签。始终可扩展的内容,但每个部分仍然不同。我建议使用:
\fancyhead[LO,RE]{\hyperlink{section-\thesection}{\bfseries\rightmark}}
扩展\thesection
为节号。(如果有任何问题\arabic{section}
,请使用扩展的。)