我希望标题在左侧显示部分名称,在右侧显示子部分名称。我正在使用此代码
\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
是此页面上的最后一个“右侧”标记:
补充说明:
不要设置没有标记机制的\leftmark
by \chaptermark
and \rightmark
by \sectionmark
。由于异步页面输出例程,这可能会导致错误的标题条目:部分和/或子部分标题可以移动到下一页,而\sectionmark
\ \subsection
leftmark 和 \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}