章のタイトルで強制的に改行する必要がある場合は、次のようにすると可能になります。
\chapter[][A Long title that has to be broken,\\ how sad is this!]
しかし、私のドキュメントでは、章の作成者とサブタイトルを設定するために、独自の章コマンドを定義する必要がありました。
\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 }{}%
}}
これは期待どおりに動作しますが、改行があると動作しません。
\Chapter[A Long title]{A Long title that has to be broken,\\ how sad is this!}{Some boring subtitles}
改行するとエラーが発生します:
! 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
しかし、改行は機能しますが、前のページでは改行後の部分が追加ページに表示されます。何が間違っているのでしょうか?
完全な動作例を以下に示します。
\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}
答え1
一つの可能性:
% 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}}
と の 2 つのコマンドを定義して\AnnCL
、を として\RecCL
再定義し、元の意味を復元しました。 の定義内の適切な場所でこれらのコマンドを使用すると、の最初の必須引数内でを使用できるようになります。ドキュメント本体で改行が発生しますが、ToC には影響はありません。\newline
\relax
\Chapter
\newline
\Chapter
\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}
ToC の画像:
章の見出しを含むページの画像:
答え2
あなたの問題は、\StrRight
議論を完全に拡張しようとして、\\
それを乗り越えられないことです。
目次でも改行を入れたい場合は、次のようにします。
\newcommand\Chapter[3][]{%
% Last char of the title
\saveexpandmode\noexpandarg
\StrRight{#2}{1}[\lastchar]%
\restoreexpandmode
% Put to \
\chapter[#2%
<...the rest is the same...>
問題は解決します。それ以外の場合は、\?
テキスト内で改行として定義し、目次内ではローカルに no op として定義します。
\protected\def\?{\\}
そして、言います
\begingroup\let\?\relax
\tableofcontents*
\endgroup
\Chapter[A Long title]
{A Long title that has to be broken,\? how sad is this!}
{Some boring subtitles}
\noexpandarg
とにかく、私はそれを維持します\StrRight
。