为什么 \hyperlink{\rightmark}{} 在 fancyhead 中(以及一些其他宏中)不起作用?

为什么 \hyperlink{\rightmark}{} 在 fancyhead 中(以及一些其他宏中)不起作用?
\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},请使用扩展的。)

相关内容