TikZ und Seitenlayout

Mit TikZ lassen sich nicht nur Graphiken erstellen. Man kann es auch anderweitig vielfältig einsetzen.

Zum Beispiel erlaubt das Paket pgfopts, dass man die Power von pgfkeys, dem Key-Management von TikZ/pgf, auch für Paketoptionen einsetzen kann. Ein Beispiel dafür ist mein Paket bohr, das TikZ nicht nur dafür verwendet. Vielleicht ist das bei Gelegenheit einen eigenen Post wert.

Heute möchte ich aber ein Beispiel dafür zeigen, wie man mit TikZ auch ein Buchlayout gestalten kann. Dafür nehme ich meine Antwort zur Frage Headers and page numbers in external borders auf TeX.sx als Basis. Die Frage dort war, wie man ein Layout wie das folgende erreichen kann:

layout

Meine Antwort darauf baute sich aus mehreren Schritten auf. Vorweg: die Antwort war und ist immer nur eine grobe Skizze mit einer Reihe von Baustellen, an denen sich lohnte weiterzuarbeiten, wenn man denn ein solches Layout tatsächlich haben möchte.

Die Startseite der Kapitel

Wie man auf dem Foto sieht, ist das Dokument zweispaltig (twocolumn) und die Kapitel beginnen in der rechten Spalte, die linke ist grau hinterlegt. Erreicht habe ich das, indem ich \@chapter und \@schapter mit Hilfe des etoolbox Paketes so gepatcht habe, dass eine boolsche Variable (oder LaTeXs Äquivalent, versteckt in etoolbox-Syntax) gesetzt wird abhängig davon, ob wir ein nummeriertes (\@chapter) oder unnummeriertes (\@schapter) Kapitel haben. Außerdem wird in beiden ein \newpage ausgeführt, was im twocolumn-Modus erst einmal eine neue Spalte beginnt, bevor eine neue Seite gestartet wird.

\newbool{schapter}
\makeatletter
\patchcmd\@chapter
  {\ifnum \scr@osectarg}
  {\boolfalse{schapter}\ifnum \scr@osectarg}
  {}{\error}
\patchcmd\@schapter
  {\if@twocolumn}
  {\booltrue{schapter}\if@twocolumn}
  {}{\error}
\patchcmd\@chapter
  {\@topnewpage[\@makechapterhead{#2}]}
  {\@topnewpage[\@makechapterhead{#2}]\null\newpage\vspace*{1in}}
  {}{\error}
\patchcmd\@schapter
  {\@topnewpage[\@makeschapterhead{#1}]}
  {\@topnewpage[\@makeschapterhead{#1}]\null\newpage\vspace*{1in}}
  {}{\error
}
\makeatother

Das eigentliche »Malen« lagerte ich in einen Befehl \chapterbox aus, den ich dann als KOMA-Font für Kapitel bestimmt hatte. Hier wird auch gleich der Titel in \chaptertitle gespeichert, damit wir ihn später im Seitenrand verwenden können.

Jetzt kommt auch TikZ zum Einsatz. Ich verwendete hier remember picture, overlay, was bedeutet, dass der Code später auf jeden Fall zwei mal kompiliert werden muss.

\newcommand\savechapter[1]{\gdef\chaptertitle{#1}}
\newcommand*\chapterbox[1]{%
  \savechapter{#1}%
  \begin{tikzpicture}[remember picture, overlay]
   \fill[mygray] (current page.north west) rectangle (current page.south) ;
   \draw (current page.north) ++(0,-2in)
     node[mygray,fill=darkred,inner sep=1em,align=center,minimum width=.75\textwidth]
       (chapapp)
       {\ifbool{schapter}{}{\rlap{\Huge\chapapp\space\thechapter:}}} ;
   \node[anchor=north,mygray,fill=darkred!85,inner sep=1em,xshift=-.6in]
     at (chapapp.south)
     {\scalebox{2.5}{\bfseries\MakeUppercase{#1}\hspace*{.2in}}} ;
  \end{tikzpicture}
}
\setkomafont{chapter}{\chapterbox
}

Heute würde ich nicht notwendigerweise den TikZ-Code großartig ändern, würde aber mit Sicherheit mit dem damals noch nicht verfügbaren KOMA-Paket scrlayer-scrpage einen Seitenstil für Kapitelseiten definieren.

Der TikZ-Code macht nichts wildes: es werden ein paar Rechtecke gemalt und gefüllt, wahlweise als Knoten (\node[fill=...]) oder tatsächlich als Rechtecke ( ... rectangle ...). Der Haupt-Clou ist, das der Knoten current page (in Verbindung mit seinen Ankern wie north west) verwendet wird, um auf die Maße der Seite zugreifen zu können.

Zusammen sieht das so aus:

\documentclass[twocolumn]{scrbook}
\usepackage[italian]{babel}

\usepackage[a4paper]{geometry}
\newlength\imargin
\newlength\omargin
\setlength\imargin{.7in}
\setlength\omargin{.7in}
\geometry{
  inner  = \imargin ,
  outer  = \omargin ,
  top    = 1in ,
  bottom = .7in
}

\usepackage{tikz,etoolbox
}
% \usetikzlibrary{positioning}
\definecolor{darkred}{cmyk}{0.0,0.87,0.87,0.50}
\colorlet{mygray}{black!20}

\newbool{schapter}
\makeatletter
\patchcmd\@chapter
  {\ifnum \scr@osectarg}
  {\boolfalse{schapter}\ifnum \scr@osectarg}
  {}{\error}
\patchcmd\@schapter
  {\if@twocolumn}
  {\booltrue{schapter}\if@twocolumn}
  {}{\error}
\patchcmd\@chapter
  {\@topnewpage[\@makechapterhead{#2}]}
  {\@topnewpage[\@makechapterhead{#2}]\null\newpage\vspace*{1in}}
  {}{\error}
\patchcmd\@schapter
  {\@topnewpage[\@makeschapterhead{#1}]}
  {\@topnewpage[\@makeschapterhead{#1}]\null\newpage\vspace*{1in}}
  {}{\error}
\makeatother

\newcommand\savechapter[1]{\gdef\chaptertitle{#1}
}
\newcommand*\chapterbox[1]{%
  \savechapter{#1}%
  \begin{tikzpicture}[remember picture, overlay]
   \fill[mygray] (current page.north west) rectangle (current page.south) ;
   \draw (current page.north) ++(0,-2in)
     node[mygray,fill=darkred,inner sep=1em,align=center,minimum width=.75\textwidth]
       (chapapp)
       {\ifbool{schapter}{}{\rlap{\Huge\chapapp\space\thechapter:}}} ;
   \node[anchor=north,mygray,fill=darkred!85,inner sep=1em,xshift=-.6in]
     at (chapapp.south)
     {\scalebox{2.5}{\bfseries\MakeUppercase{#1}\hspace*{.2in}}} ;
  \end{tikzpicture}
}
\setkomafont{chapter}{\chapterbox}

\usepackage{lipsum}

\begin{document}

\chapter*{Vorwort}
\lipsum

\chapter{Mein erstes Kapitel}
\lipsum

\end{document
}

layout-a

Die Seitenränder und der Seitenkopf

Seitenränder und Seitenkopf habe ich damals mit Hilfe von scrpage2 gesetzt, heute würde ich scrlayer-scrpage verwenden. Die TikZ-Idee ist allerdings dieselbe wie bei dem Kapitellayout auch schon: die Verwendung des Knotens current page.

% ————————————————-
% header and footer:
\usepackage{scrpage2}
\pagestyle{scrheadings}
\renewcommand*\chapterpagestyle{scrheadings
}
\clearscrheadfoot

% the page logo
\newcommand*\logo{%
  \textcolor{darkred}{\scalebox{1.3}{ITALIAN} \scalebox{2}{SRD}} \\
  d20\scalebox{2}{MODERN}
}

% tikz styles:    
\tikzset{
  logo/.style={
    color = mygray ,
    font  = \normalfont\sffamily\Large\bfseries ,
    inner sep = .25in ,
    align = center
  },
  page/.style={
    color  = mygray ,
    fill   = darkred ,
    font   = \normalfont\sffamily\Huge\bfseries ,
    minimum size = \omargin-.2in ,
    yshift = 2in
  },
  chapter/.style={
    color = mygray ,
    scale = 1.5 ,
    transform shape ,
    font  = \normalfont\sffamily\Huge\bfseries ,
  }
}
\ohead{
\begin{tikzpicture
}[remember picture, overlay]
 % logo:
 \ifthispageodd
   {\node[below left,logo] at (current page.north east)}
   {\node[below right,logo] at (current page.north west)}
   {\logo
} ;
 % page number:
 \ifthispageodd
   {\node[left,page] at (current page.east)}
   {\node[right,page] at (current page.west)}
   {\thepage
} ;
 % chapter mark:
 \ifthispageodd
   {\node[anchor=north east,rotate=-90,chapter] at (current page.south east)}
   {\node[anchor=north west,rotate=90,chapter] at (current page.south west)}
   {\chaptertitle} ;
 \ifthispageodd
   {
     \draw[mygray,very thin]
       (current page.south east)++(-.6in,0)–++(0,.6\paperheight) ;
   }
   {
     \draw[mygray,very thin]
       (current page.south west)++(.6in,0)–++(0,.6\paperheight) ;
   }
\end{tikzpicture}
}

Jetzt kommen wir dem ganzen schon sehr nahe:

layout-b

In der Original-Antwort habe ich noch das Layout der \sections angepasst, allerdings ohne TikZ, weshalb ich hier darauf verzichte.


Posted

in

by

Comments

9 responses to “TikZ und Seitenlayout”

  1. Besonders gefallen mir ja die Chapterthumbs 😉

    1. Meinst Du mit Chapterthumbs die roten Kästen mit den Seitenzahlen?

  2. Schuldig. Ich habe schon den Code danach durchsucht. Stimmt, das sind eher pagethumbs. Ich mache sowas sonst, z.B. in der Gestalt, mit dem Paket ‘thumbs’ von Martin Münch (wenn ich es richtig sehe, ist das komplett plain-tex geschrieben).

  3.  % page number:
     \ifthispageodd
       {\node[left,page] at (current page.east)}
       {\node[right,page] at (current page.west)}
       {\thepage
    } ;
  4. Stefan

    Sehr schick! Das zeigt wirklich schön, dass man für LaTeX auch elegant und außergewöhnlich gestalten kann.

  5. ali

    das einfügen einer \tableofcontens erzeugt leider fehler.

    wie kannn man das vermeiden?

  6. Ali

    das einfügen einer: \tableofcontents erzeugt fehler.

    kann man das irgendwie fixen?

    1. Ja: Du kannst die Definition von \savechapter ändern:

      \newcommand\savechapter[1]{\xdef\chaptertitle{\expandonce{#1}}}

      und die Zeile \unsettoc{toc}{onecolumn} mit hinzu nehmen.

  7. Martin

    Hallo Clemens,

    ich möchte gerne den Code testen, leider wirft er über 100 Fehler aus. Gibt es eine neuere Version?

    Vielen Dank

    Gruß

    Martin