再会,
我想使用 Fancyhdr 显示 \leftmark 的自定义缩短版本。
理想情况下,它应该是某种类型的开关,每个章节都有一个案例。
目前,标题的代码如下所示:
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead{}
\fancyfoot{}
\fancyhead[LO,RE]{\slshape \leftmark} % I would like to implement the string converter here
用伪代码来说它可能是这样的:
var headerText = \leftmark
switch headerText:
case "The very long chapter name":
headerText = "The chapter name"
case "Chapter two is also very long":
headerText = "Chapter two"
...
\fancyhead[LO,RE]{\slshape headerText}
我尝试执行的操作中的一个重要点是输出字符串可能与原始字符串完全不同。
先感谢您!
编辑:我正在使用 Pandoc 将 Markdown 文件转换为 PDF。因此,如果有一个与此生成书籍的方法兼容的解决方案就好了。谢谢!
答案1
这是一个或多或少实现伪代码的解决方案。您可以将其添加到转换后的 LaTeX 代码(pandoc
输出)的开头。
更新:我们必须小心,不要\leftmark
在标题中包含非字母字符的章节中使用此技巧。见下文。
\documentclass{book}
\usepackage{fancyhdr}
\usepackage{lipsum}
\pagestyle{fancy}
\fancyhead{}
\fancyfoot{}
% Pseudo code:
% var headerText = \leftmark
% switch headerText:
% case "The very long chapter name":
% headerText = "The chapter name"
% case "Chapter two is also very long":
% headerText = "Chapter two"
% ...
% \fancyhead[LO,RE]{\slshape headerText}
% Implementation:
\newcommand\chaptertitle[2]{\expandafter\def\csname=#1=\endcsname{#2}}
\newcommand\shorttitle[1]{\expandafter\csname=\leftmark=\endcsname}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\chaptertitle{One chapter with a very large chapter title}{Chapter One}
\chaptertitle{Another chapter title that really is much too long}{Chapter Two}
\fancyhead[LO,RE]{\slshape \shorttitle{\leftmark}} % I would like to implement the string converter here
%
\begin{document}
\chapter{One chapter with a very large chapter title}
\lipsum
\chapter{Another chapter title that really is much too long}
\lipsum
\end{document}
这会给使用非字母字符的章节带来问题\markboth
,例如\tableofcontents
和类似的章节。您可以使用原始标题来解决这个问题:
更新 2:\newpage
after\tableofcontents
应该是\cleardoublepage
(如果使用了 documentclass book
),否则可能会出现仍然使用错误的空白页\leftmark
。实际上,最好\newpage
先执行 ,然后将页眉更改为空,然后执行\cleardoublepage
,然后将页眉更改为新形式。在这种情况下,如果有一个空白页,它将没有页眉,这样看起来会更好。这样的页面始终是偶数页,因此我们只需更改偶数页的页眉即可。所以这次更新就完成了。
\renewcommand\contentsname{Index}
\fancyhead[RE]{\slshape \leftmark}
\tableofcontents
\newpage
\fancyhead[RE]{}
\cleardoublepage
\fancyhead[RE]{\slshape \shorttitle{\leftmark}}