summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/aeb_tilebg/aeb_tilebg.dtx
blob: 5ed95729f6c4467db228e5656d6d1bff822b9bb9 (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
% \iffalse
%<*copyright>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% aeb_tilebg.sty package,                              %%
%% Copyright (C) 2006--2018                             %%
%%   dpstory@acrotex.net                                %%
%%                                                      %%
%% This program can redistributed and/or modified under %%
%% the terms of the LaTeX Project Public License        %%
%% Distributed from CTAN archives in directory          %%
%% macros/latex/base/lppl.txt; either version 1 of the  %%
%% License, or (at your option) any later version.      %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%</copyright>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{aeb_tilebg}
%<package> [2018/04/26 v1.2 Tile a Background (dps)]
%<*driver>
\documentclass{ltxdoc}
\usepackage[colorlinks,hyperindex]{hyperref}
\pdfstringdefDisableCommands{\let\\\textbackslash}%
\EnableCrossrefs \CodelineIndex
\OnlyDescription  % comment out for implementation details
\begin{document}
  \GetFileInfo{aeb_tilebg.sty}
  \title{The \textsf{aeb\_tilebg} Package}
  \author{D. P. Story\\
    Email: \texttt{dpstory@acrotex.net}}
  \date{processed \today}
  \maketitle
  \tableofcontents
  \let\Email\texttt
  \DocInput{aeb_tilebg.dtx}
  \PrintIndex
\end{document}
%</driver>
% \fi
%
% \section{Alternate package name: \texorpdfstring{\textsf{aeb-tilebg}}{aeb-tilebg}}
% CTAN lists this package as \textsf{aeb-tilebg}, so might as well have a package
% by that name.
% \changes{v1.2}{2018/04/26}{Added dummy package \string\pkg{aeb-tilebg}}
%    \begin{macrocode}
%<*altpkgname>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{aeb-tilebg}
 [2018/04/26 v1.0 aeb-tilebg Alt-name (dps)]
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{aeb_tilebg}}
\ProcessOptions
\RequirePackage{aeb_tilebg}
%    \end{macrocode}
%    \begin{macrocode}
%</altpkgname>
%    \end{macrocode}
% \section{Main Code}
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%    \begin{macrocode}
\let\tb@Yes=y \let\tb@No=n
\DeclareOption{uselltiling}{%
    \AtEndOfPackage{%
    \let\aeb@currentTileBkgrd\aeb@TileBkgrdLL}%
}
\DeclareOption{draft}{\let\aeb@tilebg@draft\tb@Yes
  \AtEndOfPackage{\aeb@DraftMode}}
\let\aeb@tilebg@draft\tb@No
\DeclareOption{ignoreforpaper}{\let\aeb@tilebg@ignoreforpaper\tb@Yes}
\let\aeb@tilebg@ignoreforpaper\tb@No
\ProcessOptions
\ifeqforpaper
    \ifx\aeb@tilebg@draft\tb@No
        \ifx\aeb@tilebg@ignoreforpaper\tb@No
            \AtEndOfPackage{\aeb@DraftMode}%
\fi\fi\fi
%    \end{macrocode}
% The package requires \textsf{web}, and compiling is stopped unless the author uses web. Web is
% used for the template management. Also required are the \textsf{graphicx} and \textsf{multido} packages.
%    \begin{macrocode}
\@ifpackageloaded{web}{}{%
    \PackageError{web}{%
        The web package is required for this package%
    }{%
        Add the web package with the usetemplates option\MessageBreak
        in the preamble above this package.
    }%
}
\RequirePackage{graphicx}
\RequirePackage{multido}
\def\@gobblesix{\expandafter\@gobbletwo\@gobblefour}
\def\aeb@DraftMode{\let\setTileBgGraphic\aeb@setTileBgGraphicDraft
\let\autosetScreensizeWithMargins\@gobblesix
\let\aeb@TileBkgrd\@empty\disableTiling}
\let\turnOffTiling\aeb@DraftMode
%    \end{macrocode}
%    \begin{macrocode}
\newbox\aeb@tilingbox
\newdimen\aeb@tiledim
%    \end{macrocode}
%    \begin{macro}{\setTileBgGraphic}
% This is the main user command. The second argument is the path to the graphics file
% used for tiling, and the first are the optional parameters of \cs{includegraphics}.
% We use, by default, the \texttt{hiresbb} option of \cs{includegraphics}.
%    \begin{macrocode}
\newcommand{\aeb@setTileBgGraphicFinal}[2][1]{%
    \let\aeb@TileBkgrd\aeb@currentTileBkgrd
    \edef\aeb@tile@hbox{%
        \hbox{\noexpand\includegraphics[hiresbb,#1]{#2}}}%
    \global\setbox\aeb@tilingbox\aeb@tile@hbox
    \xdef\tileboxwidth{\strip@pt\wd\aeb@tilingbox}%
    \xdef\tileboxheight{\strip@pt\ht\aeb@tilingbox}%
    \xdef\tilewidth{\the\wd\aeb@tilingbox}%
    \xdef\tileheight{\the\ht\aeb@tilingbox}
}
\newcommand{\aeb@setTileBgGraphicDraft}[2][1]{}
\let\setTileBgGraphic\aeb@setTileBgGraphicFinal
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\maxiterations}
% For multido, the number of iterations must be specified in advance. We use
% \cs{multidostop} to break out of an multido loop early, but we need a number
% here. By default it is set at 10. Increase as needed.
%    \begin{macrocode}
\newcommand{\maxiterations}[1]{\def\aebtile@maxiterations{#1}}
\maxiterations{10}
%    \end{macrocode}
%    \end{macro}
%\DescribeMacro\placeTilesinLayers places the tiles in a layer, provided the \texttt{uselayers}
% option is used with \textsf{aeb\_pro} loaded. Added 2015/08/22.
%\changes{v1.1}{2015/08/22}{Added \cs{placeTilesinLayers}}
%    \begin{macrocode}
\newcommand{\placeTilesinLayers}[2][tileBG]{%
    \@ifpackageloaded{aeb_pro}
        {\@ifundefined{xBld}{\PackageWarning{aeb_tilebg}
            {The uselayers option
                of aeb_pro is\MessageBreak required with
                \string\placeTilesinLayers}}
            {\def\b@tileLayer{\xBld[#2]{#1}}\def\e@tileLayer{\eBld}}}
        {\PackageWarning{aeb_tilebg}{\string\placeTilesinLayers\space
            requires the\MessageBreak aeb_pro package}}%
}
\let\b@tileLayer\@empty \let\e@tileLayer\@empty
%    \end{macrocode}
% The next two commands are internal. They display the tile graphic on the background
% starting at the upper-left corner of the screen page, and lower-left of the screen page,
% respectively. The default is to start in the upper-left corner. This routine, however,
% uses real arithmetic and may be subject to rounding errors. If the effect is too bad, change
% over to lower-left, by selecting the \texttt{uselltiling} option, or by using \cs{switchtoLLTiling}.
%    \begin{macrocode}
\newcommand{\aeb@TileBkgrdUL}{%
    \aeb@tiledim=\paperheight
    \advance\aeb@tiledim-\tileheight
    \xdef\aeb@startingHeight{\strip@pt\aeb@tiledim}%
    \b@tileLayer\multido{\rj=\aeb@startingHeight+-\tileboxheight}
        {\aebtile@maxiterations}{%
        \ifdim\rj pt < -\tileheight \multidostop\else
        \multido{\ri=0+\tileboxwidth}{\aebtile@maxiterations}{%
            \ifdim\ri pt > \textscreenwidth\multidostop\else
                \put(\ri,\rj){\copy\aeb@tilingbox}\fi}\fi}\e@tileLayer
}
\newcommand{\aeb@TileBkgrdLL}{\b@tileLayer
    \multido{\nj=0+\tileboxheight}{\aebtile@maxiterations}{%
        \ifdim\nj pt > \paperheight\multidostop\else
        \multido{\ni=0+\tileboxwidth}{\aebtile@maxiterations}{%
            \ifdim\ni pt > \textscreenwidth\multidostop\else
                \put(\ni,\nj){\copy\aeb@tilingbox}\fi}\fi}\e@tileLayer
}
%    \end{macrocode}
% The default is to start in the upper-left corner
%    \begin{macrocode}
\let\aeb@TileBkgrd\@empty
\let\aeb@currentTileBkgrd\aeb@TileBkgrdUL
%\let\aeb@TileBkgrd\aeb@TileBkgrdUL
%    \end{macrocode}
% Now set the current definition \cs{aeb@TileBkgrd} as a template managed by web.
%    \begin{macrocode}
\AddToTemplate{aeb@TileBkgrd}
%\disableTemplate{aeb@TileBkgrd}
%    \end{macrocode}
% That's pretty much it for this package; however, we include a few extras.
%    \begin{macro}{\autosetScreensizeWithMargins}
% If you want to get fancy, you can have this package automatically set the screen size
% to fit exactly n rows and m columns of the tiling. This may take some experimentation
% to get the width and height you want along with the effect.  Adjust the scale  (or width or height)
% parameter as needed. The arguments are
%\begin{enumerate}
%\item \texttt{\#1}: number of rows
%\item \texttt{\#2}: number of columns
%\item \texttt{\#3}: length of left margin
%\item \texttt{\#4}: length of right margin
%\item \texttt{\#5}: length of top margin
%\item \texttt{\#6}: length of bottom margin
%\end{enumerate}
% The latter four parameters are passed in that order to the \cs{margins} command of
% the web package. Standard values are, respectively, \texttt{.25in}, \texttt{.25in}, \texttt{24pt}, \texttt{.25in}.
%
% The \cs{autosetScreensizeWithMargins} command can only be used once in the preamble, and a design
% specification should not be made in the optional parameters of web.
%    \begin{macrocode}
\newcommand{\autosetScreensizeWithMargins}[6]
{%
    \paperwidth=\tilewidth
    \paperwidth=#2\paperwidth
    \edef\theReqWidth{\the\paperwidth}%
    \paperheight=\tileheight
    \paperheight=#1\paperheight
    \edef\theReqHeight{\the\paperheight}%
    \margins@web@save{#3}{#4}{#5}{#6}%
    \screensize@web@save{\theReqHeight}{\theReqWidth} % height, width
}
\@onlypreamble\autosetScreensizeWithMargins
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\disableTiling}
%    \begin{macro}{\enableTiling}
% Disable/enable tiling, effective on the current page.
%    \begin{macrocode}
\newcommand{\disableTiling}{\disableTemplate{aeb@TileBkgrd}}
\newcommand{\enableTiling}{\enableTemplate{aeb@TileBkgrd}}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macro}{\switchtoLLTiling}
%    \begin{macro}{\switchtoULTiling}
% Switch how tile are placed on the page.
%    \begin{macrocode}
\newcommand{\switchtoLLTiling}{\let\aeb@TileBkgrd\aeb@TileBkgrdLL}
\newcommand{\switchtoULTiling}{\let\aeb@TileBkgrd\aeb@TileBkgrdUL}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%  \Finale
\endinput