灵感来自如何在乳胶中检查目录在添加到文档之前是否为空我希望有一个 head,如果 toc 不为空,则链接到目录,如果为空,则不链接到目录。下面我将给出一个代码。但是,参数 \TableofcontentsIsPrinted 并未按应有的方式从 FALSE 更改为 TRUE。如果在 \tableofcontents 定义中重新执行命令,则它至少在 head 仅链接到目录(如果文档中使用了 \tableofcontents)的意义上有效 - 但正如我所说,我希望代码检查目录是否为空。有什么帮助吗?
\documentclass[a4paper,10pt,twoside]{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{fancyhdr}
\usepackage{ifthen}
\makeatletter
\newcommand{\TableofcontentsIsPrinted}{FALSE}
\newcommand{\printcontentsnameifnotalreadydone}{%
\section*{\contentsname}%
\renewcommand{\printcontentsnameifnotalreadydone}{}
\renewcommand{\TableofcontentsIsPrinted}{TRUE} % Put in here, it does not work.
}
\AtBeginDocument{%
\let\oldcontentsline\contentsline
\renewcommand{\contentsline}{
\printcontentsnameifnotalreadydone
\oldcontentsline
}
\renewcommand{\tableofcontents}{%
\@starttoc{toc}%
% \renewcommand{\TableofcontentsIsPrinted}{TRUE} % Put in here, this works half-way.
}
}
\newcommand{\remakehead}{
\ifthenelse{ \equal{\TableofcontentsIsPrinted}{TRUE} }{
\fancyhead[RO,LE]{ \hyperref[sec:tableofcontents]{ Page \thepage } }
}{
\fancyhead[RO,LE]{ Page \thepage }
}
}
\makeatother
\begin{document}
\pagestyle{fancy}
\begin{center} \Huge Heading \end{center}
\phantomsection
\tableofcontents
\label{sec:tableofcontents}
\remakehead
\newpage
\section{First Section}
\newpage
\section{Second Section}
\newpage
\end{document}
答案1
由于使用TeX
定义的条件\newif
有时违反直觉,需要一定时间的学习,因此此更新使用了etoolbox
提供设施\newbool
,\setbool
和\ifbool
(或\newtoggle
,\settoggle
,\iftoggle
)。 那么就没有必要使用ifthen
早期版本使用的包(使用布尔值而不是字符串比较测试)来最低限度地改变 OP 的MWE
。 看看etoolbox
建议提供文档。
重新定义的\contentsline
作用是,一旦使用新版本,它就会将自身重新定义为旧版本。因此,添加的代码(显示标题TOC
)只执行一次,此外,它还将布尔值(或切换)设置为true
(新创建的条件最初为false
)。这是测试以决定如何配置标题的标志\remakehead
。必须全局设置此标志,因为文件.toc
将在组内执行(此组是通过内核的(未修改)操作创建的\@starttoc
)LaTeX2e
。
\documentclass[a4paper,10pt,twoside]{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{fancyhdr}
\usepackage{etoolbox}
\makeatletter
\newbool {TableofcontentsIsPrinted}
% or
%\newtoggle {TableofcontentsIsPrinted}
\AtBeginDocument{%
\let\oldcontentsline\contentsline
\renewcommand{\contentsline}{%
\section*{\contentsname}%
\global\setbool{TableofcontentsIsPrinted}{true}%
% or \global\settoggle{TableofcontentsIsPrinted}{true}%
\let\contentsline\oldcontentsline
\contentsline }
\renewcommand{\tableofcontents}{\@starttoc{toc}}
}
\newcommand{\remakehead}{%
\ifbool {TableofcontentsIsPrinted}
% or \iftoggle {TableofcontentsIsPrinted}
{\fancyhead[RO,LE]{\hyperref[sec:tableofcontents]{Click me to
get to contents}}}
{\fancyhead[RO,LE]{Page \thepage}}%
}
\makeatother
\begin{document}
\pagestyle{fancy}
\begin{center} \Huge Heading \end{center}
\phantomsection
\tableofcontents
\label{sec:tableofcontents}
\remakehead
\newpage
\section{First Section}
\newpage
\section{Second Section}
\newpage
\end{document}
尝试这个:
\documentclass[a4paper,10pt,twoside]{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{fancyhdr}
\usepackage{ifthen}
\makeatletter
\newif\ifTableofcontentsIsPrinted
\AtBeginDocument{%
\let\oldcontentsline\contentsline
\renewcommand{\contentsline}{%
\section*{\contentsname}%
\global\TableofcontentsIsPrintedtrue
\let\contentsline\oldcontentsline
\contentsline }
\renewcommand{\tableofcontents}{\@starttoc{toc}}
}
\newcommand{\remakehead}{%
\ifthenelse{\boolean{TableofcontentsIsPrinted}}
{\fancyhead[RO,LE]{\hyperref[sec:tableofcontents]{Click me to
get to contents}}}
{\fancyhead[RO,LE]{Page \thepage}}%
}
\makeatother
\begin{document}
\pagestyle{fancy}
\begin{center} \Huge Heading \end{center}
\phantomsection
\tableofcontents
\label{sec:tableofcontents}
\remakehead
\newpage
\section{First Section}
\newpage
\section{Second Section}
\newpage
\end{document}