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:
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.
\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*\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:
\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}
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:
In der Original-Antwort habe ich noch das Layout der \section
s angepasst, allerdings ohne TikZ, weshalb ich hier darauf verzichte.
Comments
9 responses to “TikZ und Seitenlayout”
Besonders gefallen mir ja die Chapterthumbs 😉
Meinst Du mit Chapterthumbs die roten Kästen mit den Seitenzahlen?
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).
\ifthispageodd
{\node[left,page] at (current page.east)}
{\node[right,page] at (current page.west)}
{\thepage} ;
Sehr schick! Das zeigt wirklich schön, dass man für LaTeX auch elegant und außergewöhnlich gestalten kann.
das einfügen einer \tableofcontens erzeugt leider fehler.
wie kannn man das vermeiden?
das einfügen einer: \tableofcontents erzeugt fehler.
kann man das irgendwie fixen?
Ja: Du kannst die Definition von
\savechapter
ändern:und die Zeile
\unsettoc{toc}{onecolumn}
mit hinzu nehmen.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