Problemas com quebra de linha no título do capítulo usando um comando personalizado para capítulo

Problemas com quebra de linha no título do capítulo usando um comando personalizado para capítulo

Se você precisar forçar uma quebra de linha no título de um capítulo, isso seria possível:

\chapter[][A Long title that has to be broken,\\ how sad is this!]

Mas no meu documento tive que definir meu próprio comando de capítulo, para ter um autor de capítulo e um 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 }{}%  
}}

Isso funciona conforme o esperado, mas não com quebra de linha:

\Chapter[A Long title]{A Long title that has to be broken,\\ how sad is this!}{Some boring subtitles} 

Com a quebra de linha recebo um erro:

! 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

Porém, a quebra de linha funciona, mas na página anterior aparece a parte após a quebra de linha em uma página extra. O que eu fiz de errado?

Aqui está um exemplo completo de trabalho:

\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}

Responder1

Uma possibilidade: 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}}

Defini dois comandos \AnnCLe \RecCLredefinir \newlinecomo \relaxe depois recuperar seu significado original. Usar esses comandos nos locais apropriados em sua definição de \Chapterpermite agora usar \newlinedentro do primeiro argumento obrigatório de \Chapter. Ocorrerá uma quebra de linha no corpo do documento, mas nenhum efeito estará presente no sumário.

\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}

Uma imagem do ToC:

insira a descrição da imagem aqui

Uma imagem da página contendo o título do capítulo:

insira a descrição da imagem aqui

Responder2

Seu problema é que ele \StrRighttenta a expansão total do argumento e \\não sobrevive.

Se você quiser a quebra de linha também no índice, então 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...>

resolve seu problema. Caso contrário, apenas defina \?como uma quebra de linha no texto e localmente como não operacional no índice:

\protected\def\?{\\}

e diz

\begingroup\let\?\relax
\tableofcontents*
\endgroup

\Chapter[A Long title]
  {A Long title that has to be broken,\? how sad is this!}
  {Some boring subtitles}

Eu manteria o \noexpandargao fazer \StrRightde qualquer maneira.

informação relacionada