Problemas con el salto de línea en el título del capítulo al usar un comando personalizado para el capítulo

Problemas con el salto de línea en el título del capítulo al usar un comando personalizado para el capítulo

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 \AnnCLy \RecCLlos redefiniré \newlinecomo \relaxpara luego recuperar su significado original. Usar estos comandos en las ubicaciones adecuadas en su definición de \Chapterle permite ahora usarlos \newlinedentro 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:

ingrese la descripción de la imagen aquí

Una imagen de la página que contiene el título del capítulo:

ingrese la descripción de la imagen aquí

Respuesta2

Su problema es que \StrRightintenta 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 \noexpandargcuando lo haga \StrRightde todos modos.

información relacionada