我正在使用报告类处理一份包含许多章节的长文档。
我想要某些章节标题的三个不同版本(长版用于文档、中版用于目录、短版用于标题)。我正在使用包fancyhdr
,因此我按照说明进行操作常问问题(此问题中也给出了:如何在页眉中使用简短的小节标题,但不在目录中使用?)。
\section[TOC_title]{Full_title\sectionmark{Header_title}}
\sectionmark{Header_title}
(我认为,其想法是,内部标题sectionmark
负责处理该部分开始的页面,而外部标题负责处理后续页面。)
这一切都很好。但是,由于我的文档是双倍行距的,所以我也习惯于titlesec
缩小章节和部分标题周围的一些空白。
现在,我获得了部分开始页面上的 TOC_title 标题(错误),然后获得了后续页面上的 Header_title 标题(正确)。显然,我想修复这个问题。
我怀疑fancyhdr
从长远来看这不是一个好主意,我应该换用另一个标题包,但我不想弄乱当前文档。我titlesec
现在也不想放弃它,因为它确实对双倍行距空白有很大帮助,相比之下我遇到的问题微不足道。
有没有办法解决这个问题titlesec
?我试过阅读文档但我很困惑。如果知道这个包的人能给我一些建议,我将不胜感激。
这个问题之前曾被问过如何在页眉中放置短标题而在目录中放置长标题(titlesec 包与sectionmark冲突)?。但唯一的答案暗示了 KOMA-script;我怀疑这是其他一些我现在不打算学习的软件包系列。
我还要补充一点,我的论文明天就要交了,所以今天我没有时间整理一个小的工作示例。我有兴趣解决这个问题,无论是今天还是长远来看,所以如果有必要,我可以稍后再回来做这件事。但与此同时,我非常感谢今天的任何答案!
更新(2015 年 5 月 1 日):这是一个最小的工作示例。如果 \usepackage{titlesec} 被注释掉,则第一页上的 Ponysec 标头是正确的,否则不正确。Carouselsec 标头使用 Ulrike Fischer 的 minihack,无论哪种方式都可以工作。
\documentclass{report}
\usepackage{fancyhdr}
\usepackage{titlesec}
\newcommand{\funnysection}[3]
{\let\orisectionmark\sectionmark
\renewcommand\sectionmark[1]{}%
\section[{#2}]{{#1}\orisectionmark{{#3}}}
\orisectionmark{{#3}}
\let\sectionmark\orisectionmark}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% BEGIN DOCUMENT %%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\tableofcontents
\pagestyle{fancy}
\chapter{Mychapter}
\section{Cactussec (UNIVERSION)}
No header on this page.
\clearpage
\section[Ponysec (TOC)]{Ponysec (main)\sectionmark{Ponysec (header)}}
\sectionmark{Ponysec (header)}
Desired header here is "Ponysec (header)".
\clearpage
Desired header here is "Ponysec (header)".
\clearpage
\funnysection{Carouselsec (main)}{Carouselsec (TOC)}{Carouselsec (header)}
Desired header here is "Carouselsec (header)".
\clearpage
Desired header here is "Carouselsec (header)".
\end{document}
如果正确的解决方案(对我来说,我并不真正了解 KOMA/KONA/script 的含义,但尽管如此无知,我仍想在今天、本周、本月创建像样的排版文档)是使用titleps
而不是fancyhdr
,我仍然很想知道如何做到这一点。
答案1
你可以尝试这样的方法来欺骗titlesec:
\let\orisectionmark\sectionmark
\renewcommand\sectionmark[1]{}%
\section[TOCtitle]{Fulltitle\orisectionmark{Headertitle}}
\orisectionmark{Headertitle}
\let\sectionmark\orisectionmark
编辑
关于评论的一些评论:您没有提供最小示例,因此大部分内容都是猜测。titlesec 内部调用\sectionmark{TOCtitle}
太早,以至于您自己的\sectionmark
命令太晚了。所以我将其重新定义\sectionmark
为空,以便 titlesec 不再设置标记并使用副本\orisectionmark
来设置您的标记。用should替换\orisectionmark
中间的\sectionmark
不是工作——毕竟该命令被定义为不执行任何操作。
我不知道您为什么不想使用 KONA 类,但我认为使用 titlesec 的解决方案需要放弃 fancyhdr 并改用 titleps。我很确定 Javier 已经实现了一种正确设置标记的方法,但正如您已经发现的那样,他的文档并不容易阅读,而且要找到可行的方法通常需要大量的反复试验和阅读代码。
答案2
使用 KOMA 脚本,就不会有问题:-)
\documentclass[headings=optiontoheadandtoc]{scrartcl}
\usepackage[automark]{scrlayer-scrpage}
\usepackage{blindtext}
\begin{document}
\tableofcontents
\section[tocentry={platypus dancing till morning},%
head={dancing platypus}]%
{The platypus went on dancing till the mornig sun rose
over the hills}
\blindtext[5]
\end{document}