答案1
以下内容可能足以满足您的需求。它提供了一个额外的可选参数,\section
用于以类似于以下方式提供的界面的方式排版标题:memoir
:
\documentclass[twoside]{report}
\usepackage{lipsum}% Just for this example
\usepackage{xpatch}
\let\oldsection\section
\RenewDocumentCommand{\section}{s o o m}{%
\markright{}% Clear right mark
\IfBooleanTF{#1}
% \section*
{\IfNoValueTF{#2}
% \section*
{\IfNoValueT{#3}
% \section*{...}
{\oldsection*{#4}}
}
% \section*[.]
{\oldsection*{#4}%
\addcontentsline{toc}{section}{\protect\numberline{}#2}%
\IfNoValueF{#3}
% \section*[.][..]{...}
{\markright{#3}}
}
}
% \section
{\IfNoValueTF{#2}
% \section
{\oldsection{#4}}
% \section[.]
{\oldsection[#2]{#4}
\IfNoValueF{#3}
% \section[.][..]{...}
{\markright{#3}}
}
}
}
\pagestyle{headings}
\sloppy% Just for this example
\begin{document}
\tableofcontents
\chapter{A chapter}
\lipsum[1-20]
\section{A section}
\lipsum[1-20]
\section[ToC entry][Header entry]{Another section}
\lipsum[1-20]
\section*{A starred section}
\lipsum[1-20]
\section*[Starred ToC section]{Another starred section}
\lipsum[1-20]
\end{document}
您可以使用
\section[*][<ToC>][<header>]{<title>}
当然,有些条件反射是没有必要的,因为你不能只拥有第二可选参数,而不是第一个(使用默认的[
..]
符号)。
答案2
正如 Johannes_B 提到的,您应该在序言中尝试这样的事情:
\let\oldsection\section
\renewcommand{\section}[2][]{\oldsection{#2}\def\currentheading{#1}}
可选参数将存储在其中,\currentheading
并且“默认”\section{}
将仅使用长标题执行。替换\currentheading
为您需要的任何内容以实现您想要的标题。
编辑:为了了解 \section*,您应该使用:
\documentclass{article}
\usepackage{xparse}
\let\oldsection\section
\def\currentheading{}
\RenewDocumentCommand{\section}{som}{%
\IfBooleanTF{#1}%
{\oldsection*{#3}}%
{\oldsection{#3}}%
\IfValueTF{#2}%
{\def\currentheading{#2}}%
{}%
}
\begin{document}
\section[head]{foo}
\section[overwritten]{bar}
\section*{buz}
The current heading should be overwritten ... it is \currentheading.
\end{document}