为什么子部分没有显示在标题中?

为什么子部分没有显示在标题中?

我希望标题在左侧显示部分名称,在右侧显示子部分名称。我正在使用此代码

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{fancyhdr}

\pagestyle{fancy}
\fancyhf{}
\lhead{\textit{\thesection \hspace{0.1cm} \leftmark}}
\rhead{\textit{\thesubsection \hspace{0.1cm} \rightmark}}
\rfoot{Page \thepage}

\renewcommand{\sectionmark}[1]{ \markboth{#1}{} }
\renewcommand{\subsectionmark}[1]{ \markright{#1}{} }

但是,在文档中,不显示子节名称,只显示子节编号。我该如何修复此问题?

答案1

看起来,\markboth\markright的设计目的是直到页面结束(在创建标题之前)才会影响更改。如果同一页上有多个,则只执行第一个。可以通过打印\leftmark\rightmark在不同位置进行验证。

\documentclass[twosisde]{article}
\usepackage[utf8]{inputenc}
\usepackage{fancyhdr}

\pagestyle{fancy}
\fancyhf{}
\lhead{\textit{\leftmark}}
\rhead{\textit{\rightmark}}
\rfoot{Page \thepage}

\renewcommand{\sectionmark}[1]{\xdef\leftmark{\thesection\quad#1}\xdef\rightmark{}}
\renewcommand{\subsectionmark}[1]{\xdef\rightmark{\thesubsection\quad#1}}

\usepackage{lipsum}
\begin{document}
\section{Section Title}
\subsection{Subsection Title}
\lipsum[1-20]
\end{document}

答案2

标记机制用于运行标题条目。标记命令设置三个变量:一个用于上一页的最后一个标记,一个用于当前页上设置的第一个标记,一个用于当前页上设置的最后一个标记。当页面开始时,这三个变量相等。

\markright将其参数设置为“右”标记。\markboth将其第一个参数设置为“左”标记,将其第二个参数设置为“右”标记。

\rightmark使用页面上的\markright或 的第二个参数设置的第一个“右”标记。使用 的第一个参数设置的最后一个(底部)“左”标记。\markboth\leftmark\markboth

在以下示例中

\documentclass{article}
\usepackage{lipsum}% only for dummy text
\usepackage{fancyhdr}

\pagestyle{fancy}
\fancyhf{}
\lhead{\textit{\leftmark}}
\rhead{\textit{\rightmark}}
\rfoot{Page \thepage}
\renewcommand{\sectionmark}[1]{\markboth{\thesection\hspace{0.1cm} #1}{} }
\renewcommand{\subsectionmark}[1]{\markright{\thesubsection\hspace{0.1cm} #1}{} }
\begin{document}
\section{First section}
\subsection{First subsection}
\lipsum[1-10]
\subsection{Second subsection}
\lipsum[2-5]
\section{Second section}
\lipsum[7-9]
\end{document}

\markboth第一个“右”标记是执行的空右参数\chaptermark。因此第 1 页的标题中没有子节条目:

在此处输入图片描述

您可以定义\rightbotmark最后一个“正确”的标记:

\makeatletter
\providecommand*{\rightbotmark}{\expandafter\@rightmark\botmark\@empty\@empty}
\makeatother

并替换\rightmark\rightbotmark使用页面的最后一个“右”标记:

\documentclass{article}
\usepackage{lipsum}% only for dummy text
\usepackage{fancyhdr}
\makeatletter
\providecommand*{\rightbotmark}{\expandafter\@rightmark\botmark\@empty\@empty}% <- added
\makeatother

\pagestyle{fancy}
\fancyhf{}
\lhead{\textit{\leftmark}}
\rhead{\textit{\rightbotmark}}% <- changed
\rfoot{Page \thepage}
\renewcommand{\sectionmark}[1]{\markboth{\thesection\hspace{0.1cm} #1}{} }
\renewcommand{\subsectionmark}[1]{\markright{\thesubsection\hspace{0.1cm} #1}{} }
\begin{document}
\section{First section}
\subsection{First subsection}
\lipsum[1-10]
\subsection{Second subsection}
\lipsum[2-5]
\section{Second section}
\lipsum[7-9]
\end{document}

但是现在第 3 页的页眉中没有子节条目,因为的空右侧参数\markboth是此页面上的最后一个“右侧”标记:

在此处输入图片描述


补充说明:

不要设置没有标记机制的\leftmarkby \chaptermarkand \rightmarkby \sectionmark。由于异步页面输出例程,这可能会导致错误的标题条目:部分和/或子部分标题可以移动到下一页,而\sectionmark\ \subsectionleftmark 和 \rightmark 已经更改。因此,在以下示例中,新的标题条目出现得早了一页:

%% Warning: Do not use this code. It shows only that `\markboth` and `\markright` must be used.
\documentclass{article}
\usepackage{lipsum}% only for dummy text
\usepackage{fancyhdr}
\makeatletter
\providecommand*{\rightbotmark}{\expandafter\@rightmark\botmark\@empty\@empty}
\makeatother

\pagestyle{fancy}
\fancyhf{}
\lhead{\textit{\leftmark}}
\rhead{\textit{\rightmark}}
\rfoot{Page \thepage}
\renewcommand{\sectionmark}[1]{\xdef\leftmark{\thesection\quad#1}\xdef\rightmark{}}
\renewcommand{\subsectionmark}[1]{\xdef\rightmark{\thesubsection\quad#1}}
\begin{document}
\section{First section}
\subsection{First subsection}
\lipsum[1-10]
\subsection{Second subsection}
\lipsum[2-6]
\section{Second section}
\subsection{Another subsection}
\lipsum[7-9]
\end{document}

在此处输入图片描述

相关内容