如何在页眉中剪切章节标题

如何在页眉中剪切章节标题

我重新定义了我的标题,如以下 MWE 所示:

\documentclass[12pt]{article}
\usepackage{xstring}
\usepackage{fancyhdr}
\fancypagestyle{monstyle}{%
\fancyhf{} % remove everything
\renewcommand{\headrule}{\rule[1.5ex]{\headwidth}{1pt}}
  \lhead{%
\leftmark%
  }
}
\begin{document}
\pagestyle{monstyle}
\section{le tres tres long titre qui prend trop de place sur la ligne}
\end{document}

章节标题可能很长,就像我的 MWE 中一样,我想将其缩短为固定长度(例如 15 个字母)。我尝试使用\StrLeft包中的命令xstring:我将行替换为

\leftmark%

经过

    \StrLeft{\leftmark}{15}...%

但是我收到了我无法理解的编译错误:

Argument of \@iiparbox has an extra }. 

编辑 我尝试使用 Mico 的解决方案,但是现在遇到了 TOC 的问题:

\documentclass[12pt]{article}
\usepackage{xstring}
\usepackage{fancyhdr}
\usepackage{blindtext}

%% Redefine the short title
\let\origsection\section % 
\renewcommand{\section}[1]{% 
\def\ShortSecName{\StrLeft{#1}{10}...}
\origsection[\protect\ShortSecName]{#1}%
}

\begin{document}
\tableofcontents
\section{mon titre tres long tres tres long}
\blindtext\blindtext\blindtext
\section{mon titre tres long tres tres long}
\blindtext\blindtext\blindtext
\end{document}

我收到错误:

! LaTeX Error: Something's wrong--perhaps a missing \item.

如果我删除它\tableofcontents,它就会编译。

答案1

另一种方法是使用titleps而不是fancyhdr(警告:我是的作者titleps):

\documentclass[12pt]{article}
\usepackage{xstring}
\usepackage{titleps}

\newpagestyle{monstyle}{
   \headrule
   \sethead{\thepage}
           {}
           {\StrLeft{\sectiontitle}{15}...}}

\begin{document}
\pagestyle{monstyle}
\section{le tres tres long titre qui prend trop de place sur la ligne}
\end{document}

\sectiontitle是一个仅包含标题的宏,而不是带有部分标题(格式化)的标记,因此可以轻松处理。

答案2

如果您想保留所有功能\section并在目录中获取原始标题,请按以下步骤操作

\makeatletter
\let\cutsec@ori@section\section
\def\section{\@ifstar\cutsec@ssection\cutsec@section}
\def\cutsec@ssection{\cutsec@ori@section*}
\def\cutsec@section{\@dblarg\cutsec@@section}
\def\cutsec@@section[#1]#2{%
  \cutsec@ori@section[#1]{#2}%
  \StrLeft{#2}{10}[\temp]%
  \expandafter\markboth{\expandafter\MakeUppercase\expandafter{\temp...}}{}}
\makeatother

但是,当章节标题带有重音字符时,这样做是有风险的,除非您使用 8 位编码(例如 latin-1),并且避免使用诸如 之类的显式重音,\'el\`eve即您写élève。它肯定会与 UTF-8 和pdflatex(不会与 XeLaTeX 和 LuaLaTeX 等 UTF-8 引擎)发生冲突。

答案3

您需要\protect\StrLeft命令。您没有解释重新定义该\leftmark命令的具体作用,因此我建议您在命令\protect\StrLeft设置中使用以下方法\section[]{}

\section[\protect\StrLeft{Le tres tres long titre qui prend 
  trop de place sur la ligne}{15}]{Le tres tres long titre 
  qui prend trop de place sur la ligne}

附录可以通过\section适当地重新定义命令来实现该过程的自动化,按照以下 MWE(最小工作示例)进行:

\documentclass[12pt]{article}
\usepackage{xstring,fancyhdr}
\fancypagestyle{monstyle}{%
  \fancyhf{} % remove everything
  \renewcommand{\headrule}{\rule[1.5ex]{\headwidth}{1.2pt}}
  \lhead{\leftmark}
  }
\pagestyle{monstyle}  

\let\origsection\section       %  Save the original \section command
\renewcommand{\section}[2][15]{%  Default value for the first, optional arg: "15"
    \origsection[\protect\StrLeft{#2}{#1}]{#2}}
\begin{document}

\section[23]{Le tr{\`e}s tr{\`e}s long titre qui prend trop de place sur la ligne}

Il y avait une fois que \ldots
\end{document}

在此处输入图片描述

请注意,重新定义的\section命令需要参数。第一个参数是要为短标题或页眉保留的字符数,选修的默认为 15。第二个参数是“常规”(可能很长)的节标题。如果您不想任何缩短节标题,只需提供一个数字 - 1,000 够大吗? - 该数字超过了节标题中的字符数。

笔记: (i) 您是否需要创建节标题没有自动设置页面的运行头,您可以使用命令\origsection(其中包含命令的原始版本,这并不奇怪\section)。(ii)此设置的副作用是\tableofcontents\section*命令将无法正常工作;如果您担心这个问题,请告诉我,我会找到解决方案。

答案4

您可以使用truncate包裹:

\documentclass[12pt]{article}
\usepackage{fancyhdr}
\usepackage[breakall]{truncate}
\fancypagestyle{monstyle}{%
\fancyhf{} % remove everything

\renewcommand{\headrule}{\rule[1.5ex]{\headwidth}{1pt}}
\lhead{\truncate{15em}{\leftmark}}}

\begin{document}
\pagestyle{monstyle}
\section{le tres tres long titre qui prend trop de place sur la ligne}
\end{document}

在此处输入图片描述

相关内容