summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/spath3/calligraphy.tex
blob: 93def0b415def06828b5b650705a5cc3d0ccbea8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
%\immediate\write18{tex spath3_doc.dtx}
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{trace}
\usepackage{lmodern}
\usepackage{morefloats}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calligraphy,matrix}
\usepackage[numbered]{hypdoc}
\definecolor{lstbgcolor}{rgb}{0.9,0.9,0.9} 
 
\usepackage{listings}
\lstloadlanguages{[LaTeX]TeX}
\lstset{
  breakatwhitespace=true,
  breaklines=true,
  language=[LaTeX]TeX,
  basicstyle=\small\ttfamily,
  keepspaces=true,
  columns=fullflexible
}
 
\usepackage{fancyvrb}

\newenvironment{example}
  {\VerbatimEnvironment
   \begin{VerbatimOut}{example.out}}
  {\end{VerbatimOut}
   \begin{center}
   \setlength{\parindent}{0pt}
   \fbox{\begin{minipage}{.9\linewidth}
     \lstinputlisting[]{example.out}
   \end{minipage}}

   \fbox{\begin{minipage}{.9\linewidth}
     \input{example.out}
   \end{minipage}}
\end{center}
}

\providecommand*{\url}{\texttt}
\GetFileInfo{spath3.sty}

\pdfstringdefDisableCommands{%
  \def\\{}%
  \def\url#1{<#1>}%
}

\title{The \textsf{calligraphy} Package: Documentation}
\author{Andrew Stacey \\ \url{loopspace@mathforge.org}}
\date{\fileversion~from \filedate}

\begin{document}

\maketitle

  \section{Pre-Introduction}
  This library is built on top of a package for manipulating PGF's \emph{soft paths} called \texttt{spath3}.
  Version 2.0 of \texttt{spath3} involved considerable reorganisation of the code.
  I tried to ensure that this didn't affect this library but it is extremely likely that I wasn't fully successful.
  If something that used to work no longer does, please do let me know either by opening an issue on github (\url{https://github.com/loopspace/spath3}) or at the above email.

  \section{Introduction}
The \Verb+calligraphy+ TikZ library is designed to enable calligraphic style drawings in TikZ.
The idea is to be able to ``stroke'' a line with a ``pen''.
As a simple example, compare the two lines in the following picture.

\begin{example}
\begin{center}
\begin{tikzpicture}
\pen (-135:.25) -- (45:.25);
\draw[line width=.5cm] (0,0) .. controls +(45:1) and +(-135:1) .. ++(3,0);
\calligraphy (0,-1) .. controls +(45:1) and +(-135:1) .. ++(3,0);
\end{tikzpicture}
\end{center}
\end{example}

The paths are identical in definition but the first is drawn using the standard TikZ path with a line width of .5cm.
The second is ``stroked'' with a calligraphic pen of width .5cm angled at 45 degrees.
\section{How It Works}
To know how to use this library, it is worth knowing a little about how it works.
A ``pen'' is a path, as is the line that is the template for the pen stroke.
The two paths are joined together to form a region which is filled.
Thus in constructing the example given in the introduction, the following path is built.
\begin{center}
\begin{tikzpicture}
\draw (0,-1) .. controls +(45:1) and +(-135:1) .. node (op) {} ++(3,0) -- node (pp) {} ++(45:.5) .. controls +(-135:1) and +(45:1) .. node (opr) {} ++(-3,0) -- node (ppr) {} (0,-1);
\draw[<-] (op) -- ++(0,-.5) node[anchor=north] {original path};
\draw[<-] (pp) -- ++(.5,0) node[anchor=west] {pen path};
\draw[<-] (opr) -- ++(0,.5) node[anchor=south] {original path reversed};
\draw[<-] (ppr) -- ++(-.5,0) node[anchor=east] {pen path reversed};
\end{tikzpicture}
\end{center}
What is important to note about this is that the ``pen'' isn't \emph{actually} dragged along the path, it is merely a simulation.
This can be shown with the following simple example.
The first is a continuous path that goes past the angle of the pen and thus the upstroke would involve pushing the pen.
The second is how it is meant to be done, the second line is drawn from top to bottom.
However, as the direction of the path isn't important, the same effect can be obtained by ``lifting the nib'' between the lines.
\begin{example}
\begin{center}
\begin{tikzpicture}
\pen (-135:.125) -- (45:.125);
\calligraphy (0,0) -- (1,0) -- (1,1);
\calligraphy (2,0) -- (3,0) (3,1) -- (3,0);
\calligraphy (4,0) -- (5,0) +(0,0) -- (5,1);
\end{tikzpicture}
\end{center}
\end{example}
It should work as expected providing the following golden rule is not violated:
\begin{quotation}
Never \emph{push} a calligraphic pen.
\end{quotation}
This is good advice for ordinary calligraphy as well, so a path that is realisable as an honest calligraphic path should be fine with this library.
Actually since, as remarked above, the direction of the path isn't important, a more accurate golden rule would be that one should never swap from pushing to pulling or vice versa without lifting the pen off the paper; but that isn't as succinct.
The paths for both pens and templates can be reasonably complicated.
They can contain gaps, but should not contain closed paths, nor rectangles.
The implementation works by breaking a path into its constituent pieces (broken up by ``move to''s) and working bit by bit.
\begin{example}
\begin{center}
\begin{tikzpicture}
\pen (-135:.25) -- (-135:.125) (45:.125) -- (45:.25);
\calligraphy (0,0) .. controls +(45:1) and +(-135:1) .. +(3,0) ++(1.5,0) .. controls +(-135:2) and +(45:2) .. +(0,-4)  (0,-4) .. controls +(45:1) and +(-135:1) .. +(3,0);
\end{tikzpicture}
\end{center}
\end{example}
\section{Copperplate}
Copperplate pens are somewhat special.
They are ``thin'' so don't need the same treatment as a ``thick'' pen, but one should be able to vary the pressure with a copperplate pen to get a variation of thickness.
Specifying a copperplate pen is straightforward: it is a pen with no thickness.
\begin{example}
\begin{center}
\begin{tikzpicture}[line width=2pt]
\pen (0,0);
\calligraphy[heavy] (0,0) .. controls +(45:1) and +(-135:1) .. +(3,0) ++(1.5,0) .. controls +(-135:2) and +(45:2) .. +(0,-3)  (0,-3) .. controls +(45:1) and +(-135:1) .. +(3,0);
\calligraphy[light] (4,0) .. controls +(45:1) and +(-135:1) .. +(3,0) ++(1.5,0) .. controls +(-135:2) and +(45:2) .. +(0,-3)  (4,-3) .. controls +(45:1) and +(-135:1) .. +(3,0);
\end{tikzpicture}
\end{center}
\end{example}
With a copperplate pen, the segments of a path are tapered.
Copperplate and normal pens can be mixed.
Any part of the pen specification that has no length is treated as a copperplate pen.
\begin{example}
\begin{center}
\begin{tikzpicture}[line width=1pt]
\pen (-135:.125) -- (0,0) (45:.125);
\calligraphy (0,0) .. controls +(45:1) and +(-135:1) .. +(3,0) ++(1.5,0) .. controls +(-135:2) and +(45:2) .. +(0,-3)  (0,-3) .. controls +(45:1) and +(-135:1) .. +(3,0);
\end{tikzpicture}
\end{center}
\end{example}
%% \section{Annotations}
%% As an addition, calligraphic paths can be annotated to show how they were constructed.
%% A path with an arrow is drawn at a set offset from the last part of the path.
%% \begin{example}
%% \begin{center}
%% \begin{tikzpicture}[line width=1pt]
%% \pen (-135:.125) -- (0,0) (45:.125);
%% \calligraphy[annotate] (0,0) .. controls +(45:1) and +(-135:1) .. +(3,0) ++(1.5,0) .. controls +(-135:2) and +(45:2) .. +(0,-3)  (0,-3) .. controls +(45:1) and +(-135:1) .. +(3,0);
%% \end{tikzpicture}
%% \end{center}
%% \end{example}
\section{Style Options}
There are plenty of options for styling the paths and pens.
\subsection{Definition Options}
Internally, making a pen is a two-step process.
First a pen has to be \emph{defined} and then \emph{processed}.
To define a pen, the user has to specify a path.
That path is stored in a global macro and so can be accessed in throughout the document.
However, before being used, the pen has to be processed.
At this stage, the pen is converted from a macro in to a special object.
These special objects are local and cannot (at present) be made global.
Thus whilst a pen can be \emph{defined} inside a group, the \emph{processing} stage has to happen in the outermost group in which the pen is going to be used.
There is a shortcut command that (via a bit of suspicious hackery) does all this within a \Verb+tikzpicture+ group.
However, if a pen is to be used in several different pictures, it must be processed outside the group in which it is defined.
The following macros and keys are used to set up and use a pen.
%All the keys are in the \Verb+/pgf/calligraphy+ family.
\begin{itemize}
\item \DescribeMacro{define pen}If the \Verb+define pen+ key is specified on a path then that path will be used to define a pen.
It can take one option which will be the pen name, if not specified then \Verb+default+ is assumed.
The resulting path will not be counted for bounding box considerations.
When the pen is used, the origin will correspond to the path along which it is dragged.
\item \DescribeMacro{pen name}The key \Verb+pen name=name+ sets the name for the current pen.
This can be used either when defining or using a pen.
\item \DescribeMacro{\pen}\DescribeMacro{\definepen}The macros \Verb+\pen+ and \Verb+\definepen+ are analogous to the TikZ commands \Verb+\draw+ or \Verb+\fill+ in that they act like a path command but store the path as a pen.
The difference between them is that \Verb+\definepen+ is to be used outside a TikZ picture (it contains its own \Verb+\tikz+ command) and \Verb+\pen+ inside.
%% These macros also change the ``key family'' to \Verb+/pgf/calligraphy+ so that any further options do not need their full path.
%% \item \DescribeMacro{\processpen}The macro \Verb+\processpen+ processes a pen so that it is set up for using later on.
%% As remarked earlier, it has to be given at least at the outermost grouping of where it will be used.
%% It takes an optional argument which is the pen name.
%% This is only needed if the pen will be used in a group other than the one in which it is defined (or if the hackery that means this isn't needed with the \Verb+\pen+ command fails for some unknown reason).
\item \DescribeMacro{use pen}The key \Verb+use pen=name+ on a path means that that path should be ``stroked'' with the pen (\Verb+default+ if no name is given, or none specified via the \Verb+pen name+ key).
%% \item \DescribeMacro{\calligraphy}The macro \Verb+\calligraphy+ is a shortcut for specifying a path with the key \Verb+use pen+ already set.
%% This macro also changes the ``key family'' to \Verb+/pgf/calligraphy+ so that any further options do not need their full path.
\end{itemize}
\subsection{Style Options}
There are various options available for styling the calligraphic paths.
%% All of these are in the \Verb+/pgf/calligraphy+ key family, but the \Verb+\calligraphy+ command automatically switches to that family so the key path is not needed.
%% Any unknown keys are processed as follows:
%% \begin{enumerate}
%% \item A check is made to see if a pen of that name has been defined.
%% If so, that pen is used.
%% This is similar to the \Verb+\node[shape]+ syntax
%% \item A check is made to see if the unknown key corresponds to a colour.
%% If so, that colour is installed as the pen colour.
%% This is similar to the colour handling of TikZ paths.
%% (In fact, it uses the same code.)
%% \item All other unknown options are passed on to TikZ.
%% \end{enumerate}
The style options are as follows.
\begin{itemize}
\item \DescribeMacro{pen colour}The \Verb+pen colour+ style defines the default colour to be used.
Since calligraphic paths are sometimes filled and sometimes stroked, this ensures that the colour is used correctly.
\item \DescribeMacro{nib style}It is possible to style particular ``nibs'' (i.e., segments of the pen path) separately.
This is the \Verb+nib style+ option, which takes two arguments.
The first is the index of the part of the nib and the second is the style options to be applied.
\item \DescribeMacro{stroke style}It is also possible to style particular parts of the template path.
One way to do this is to use the \Verb+stroke style+ key, which takes two arguments.
The first is the index of the part of the stroke and the second is the style options to be applied.
\item \DescribeMacro{this stroke style}It is also possible to style particular parts of the template path as the path is constructed.
This is done by putting \Verb+[this stroke style={}]+ in the template path at the relevant part.
The style is saved and applied to that segment of the template path.
\item \DescribeMacro{taper}The tapering of copperplate paths can be controled by the \Verb+taper+ option.
It takes arguments \Verb+none+, \Verb+both+, \Verb+start+, and \Verb+end+.
\item \DescribeMacro{weight}\DescribeMacro{heavy}\DescribeMacro{light}Copperplate paths come in two ``weights'': \emph{heavy} and \emph{light}.
The weight also affects the tapering: by default a light path is tapered to nothing whilst a heavy path is tapered to the width of a light path.
Weights can be specified by either \Verb+weight=weight+ or just \Verb+heavy+ and \Verb+light+.
It is possible to change the weight for different components of a path using the \Verb+stroke style+ key.
With tapering, this means that one can easily vary from a light stroke to a heavy one.
The relevant widths are controlled by the keys \DescribeMacro{heavy line width}\Verb+heavy line width+ and the \DescribeMacro{light line width}\Verb+light line width+.
The \DescribeMacro{taper line width}\Verb+taper line width+, is set automatically by the weight but can be altered afterwards using the \Verb+taper line width+ key.
%% \item \DescribeMacro{annotate}The key \Verb+annotate+ switches on annotations.
%% The style of the annotations is controlled by the keys \DescribeMacro{annotation style}\Verb+annotation style+, \DescribeMacro{annotation shift}\Verb+annotation shift+ which controls how the annotation path is shifted from the final component of the calligraphic path, \DescribeMacro{annotation nodes style}\Verb+annotation nodes style+ for global style of the nodes, \DescribeMacro{annotation node style}\Verb+annotation node style+ for styling of particular nodes.
%% This latter takes two options: the node number and the style to be applied.
%% The annotation path and annotation node styles take ordinary TikZ styling options.
\end{itemize}
\begin{example}
\begin{center}
\begin{tikzpicture}
\calligraphy[pen colour=green,nib style={2}{color=red}] (0,0) .. controls +(45:1) and +(-135:1) .. +(3,0) ++(1.5,0) .. controls +(-135:2) and +(45:2) .. +(0,-3)  (0,-3) .. controls +(45:1) and +(-135:1) .. +(3,0);
\calligraphy[line width=1pt] (0,-4) .. controls +(45:1) and +(-135:1) .. +(3,0) ++(1.5,0) .. controls +(-135:2) and +(45:2) .. +(0,-3)  (0,-7) .. controls +(45:1) and +(-135:1) .. +(3,0);
\end{tikzpicture}
\end{center}
\end{example}
\section{Decorations}
If a TikZ/PGF decorations library is loaded prior to this library, then the \Verb+calligraphy+ library defines some decorations that use the calligraphic paths, specifically with the copperplate nib.
The current decorations are:
\begin{itemize}
\item \DescribeMacro{calligraphic brace}\Verb+calligraphic brace+ for a brace.
\item \DescribeMacro{calligraphic straight parenthesis}\Verb+calligraphic straight parenthesis+ for a parenthesis with straight middle component.
\item \DescribeMacro{calligraphic curved parenthesis}\Verb+calligraphic curved parenthesis+ for a parenthesis with a curved middle component.
\end{itemize}
All the above use the \Verb+amplitude+ option to specify their size.
The following is an example of their use, together with the standard \Verb+brace+ and the \Verb+delimiter+ key from the \Verb+matrix+ library for comparison.
\begin{example}
\begin{center}
\begin{tikzpicture}
\draw[decorate,decoration={calligraphic brace,amplitude=4mm},ultra thick] (0,0) -- (0,8);
\draw[line width=2pt,decorate,decoration={brace,amplitude=10},line cap=round] (1,0) -- ++(0,8);
\node[anchor=south west,minimum height=8cm,outer sep=0pt,left delimiter=\{] (a) at (2,0) {};
\draw[decorate,decoration={calligraphic straight parenthesis,amplitude=4mm},ultra thick] (3,0) -- ++(0,8);
\draw[decorate,decoration={calligraphic curved parenthesis,amplitude=4mm},ultra thick] (4,0) -- ++(0,8);
\node[anchor=south west,minimum height=8cm,outer sep=0pt,left delimiter=(] (a) at (5,0) {};
\end{tikzpicture}
\end{center}
\end{example}
\section{Pre-Defined Pens}
The following pens are predefined:
\begin{itemize}
\item \DescribeMacro{copperplate}\Verb+copperplate+:
\begin{example}
\begin{center}
\tikz \calligraphy[copperplate] (0,0) .. controls +(1,-1) and +(-1,1) .. ++(3,0) [this stroke style={light,taper=start}] +(0,0) .. controls +(1,-1) and +(-1,1) .. ++(3,0) [this stroke style={heavy}] +(0,0) .. controls +(1,-1) and +(-1,1) .. ++(3,0) [this stroke style={light,taper=end}];
\end{center}
\end{example}
\end{itemize}

\end{document}