我重新定义了我的标题,如以下 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}