Si tiene que forzar un salto de línea en el título de un capítulo, esto sería posible:
\chapter[][A Long title that has to be broken,\\ how sad is this!]
Pero en mi documento tuve que definir mi propio comando de capítulo para poder tener un autor de capítulo y un subtítulo:
\newcommand\Chapter[3][]{%
% Last char of the title
\StrRight{#2}{1}[\lastchar]%
% Put to \
\chapter[#2%
% We want a point in the ToC between title and subtitle
\if\relax\detokenize{#3}\relax%
\else%
% But not if there is a ?
\if\lastchar? %
\else%
% Or a !
\if\lastchar! %
% If not set a point
\else%
. %
\fi%
\fi%
\fi%
#3]{#2\\[2ex]\Large\Large#3}
\chaptermark]{\markboth{%
\if\relax\detokenize{#1}\relax #2%
\else #1\fi }{}%
}}
Esto funciona como se esperaba, pero no con un salto de línea:
\Chapter[A Long title]{A Long title that has to be broken,\\ how sad is this!}{Some boring subtitles}
Con el salto de línea me sale un error:
! Paragraph ended before \@firstoftwo was complete.
<to be read again>
\par
l.2 ...how sad is this!}{}
I suspect you've forgotten a `}', causing me to apply this
Sin embargo, el salto de línea funciona, pero en la página anterior aparece la parte después del salto de línea en una página adicional. ¿Qué hice mal?
Aquí hay un ejemplo de trabajo completo:
\documentclass[10pt,twoside]{memoir}
\usepackage{xstring}
\usepackage{fontspec}
\usepackage{xltxtra}
\newcommand{\chapterauthor}
\renewcommand*{\cftchapterdotsep}{\cftdotsep}
\settocdepth{chapter}
\renewcommand{\cftchapterfont}{\normalfont}
\renewcommand{\cftchapterpagefont}{\normalfont}
\makeatletter
\DeclareRobustCommand\authortoctext[1]{%
{\addvspace{10pt}\nopagebreak\setlength{\parindent}{0em}\relax
\rightskip \@tocrmarg\relax
\itshape#1\par\addvspace{-7pt}}}
\makeatother
\newcommand\authortoc[1]{\needspace{3\baselineskip}%
\gdef\chapterauthor{#1}%
\addtocontents{toc}{\authortoctext{%
\needspace{2\baselineskip}% Vgl. http://tex.stackexchange.com/questions/134016
#1}}}
\renewcommand{\afterchaptertitle}{%
\vskip\onelineskip\begin{large}\normalfont\textit{\Large\chapterauthor}\end{large}
\vspace{4ex}
\vskip\onelineskip}
\newcommand\testchain[1]{%
\StrRight{#1}{1}[\lastchar]%
\IfStrEq{\lastchar}{?}{false}{true}%
}
\newcommand\Chapter[3][]{%
% Last char of the title
\StrRight{#2}{1}[\lastchar]%
% Put to \
\chapter[#2%
% We want a point in the ToC between title and subtitle
\if\relax\detokenize{#3}\relax%
\else%
% But not if there is a ?
\if\lastchar? %
\else%
% Or a !
\if\lastchar! %
% If not set a point
\else%
. %
\fi%
\fi%
\fi%
#3]{#2\\[2ex]\Large\Large#3}
\chaptermark]{\markboth{%
\if\relax\detokenize{#1}\relax #2%
\else #1\fi }{}%
}}
\begin{document}
\tableofcontents*
\Chapter[A Long title]{A Long title that has to be broken,\\ how sad is this!}{Some boring subtitles}
\end{document}
Respuesta1
Una posibilidad: usar
% settings to redefine \newline and then recover its original meaning
\let\oldnewline\newline
% redefinition: \newline is \relax
\newcommand\AnnCL{%
\def\newline{\relax}}
% recovering the original meaning of \newline
\newcommand\RecCL{%
\def\newline{\oldnewline}}
Definí dos comandos \AnnCL
y \RecCL
los redefiniré \newline
como \relax
para luego recuperar su significado original. Usar estos comandos en las ubicaciones adecuadas en su definición de \Chapter
le permite ahora usarlos \newline
dentro del primer argumento obligatorio de \Chapter
. Se producirá un salto de línea en el cuerpo del documento, pero no habrá ningún efecto en la ToC.
\documentclass[10pt,twoside]{memoir}
\usepackage{xstring}
\newcommand{\chapterauthor}
\renewcommand*{\cftchapterdotsep}{\cftdotsep}
\settocdepth{chapter}
\renewcommand{\cftchapterfont}{\normalfont}
\renewcommand{\cftchapterpagefont}{\normalfont}
\makeatletter
\DeclareRobustCommand\authortoctext[1]{%
{\addvspace{10pt}\nopagebreak\setlength{\parindent}{0em}\relax
\rightskip \@tocrmarg\relax
\itshape#1\par\addvspace{-7pt}}}
\makeatother
\newcommand\authortoc[1]{\needspace{3\baselineskip}%
\gdef\chapterauthor{#1}%
\addtocontents{toc}{\authortoctext{%
\needspace{2\baselineskip}% Vgl. http://tex.stackexchange.com/questions/134016
#1}}}
\renewcommand{\afterchaptertitle}{%
\vskip\onelineskip\begin{large}\normalfont\textit{\Large\chapterauthor}\end{large}
\vspace{4ex}
\vskip\onelineskip}
\newcommand\testchain[1]{%
\StrRight{#1}{1}[\lastchar]%
\IfStrEq{\lastchar}{?}{false}{true}%
}
% settings to redefine \newline and then recover its original meaning
\let\oldnewline\newline
% redefinition: \newline is \relax
\newcommand\AnnCL{%
\def\newline{\relax}}
% recovering the original meaning of \newline
\newcommand\RecCL{%
\def\newline{\oldnewline}}
\newcommand\Chapter[3][]{\AnnCL%
% Last char of the title
\StrRight{#2}{1}[\lastchar]%
% Put to \
%
\chapter[#2%
% We want a point in the ToC between title and subtitle
\if\relax\detokenize{#3}\relax%
\else%
% But not if there is a ?
\if\lastchar? %
\else%
% Or a !
\if\lastchar! %
% If not set a point
\else%
.%
\fi%
\fi%
\fi%
#3]{\RecCL#2\\[2ex]\Large\Large#3}
\chaptermark]{\markboth{%
\if\relax\detokenize{#1}\relax #2%
\else #1\fi }{}%
}\RecCL}
\begin{document}
\tableofcontents*
\Chapter[A Long title]{A Long title that has to be\newline broken, how sad is this!}{Some boring subtitles}
\end{document}
Una imagen del ToC:
Una imagen de la página que contiene el título del capítulo:
Respuesta2
Su problema es que \StrRight
intenta expandir completamente el argumento y \\
no lo sobrevive.
Si desea el salto de línea también en la tabla de contenido, entonces diga
\newcommand\Chapter[3][]{%
% Last char of the title
\saveexpandmode\noexpandarg
\StrRight{#2}{1}[\lastchar]%
\restoreexpandmode
% Put to \
\chapter[#2%
<...the rest is the same...>
resuelve tu problema. De lo contrario, simplemente defínalo \?
como un salto de línea en el texto y defínelo localmente como una operación no operativa en la tabla de contenido:
\protected\def\?{\\}
y decir
\begingroup\let\?\relax
\tableofcontents*
\endgroup
\Chapter[A Long title]
{A Long title that has to be broken,\? how sad is this!}
{Some boring subtitles}
Mantendría el \noexpandarg
cuando lo haga \StrRight
de todos modos.