summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/pagelayout
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/pagelayout')
-rw-r--r--macros/latex/contrib/pagelayout/LICENSE416
-rw-r--r--macros/latex/contrib/pagelayout/README.md90
-rw-r--r--macros/latex/contrib/pagelayout/doc/1x1.pdfbin0 -> 1028 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/2x1.pdfbin0 -> 1064 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/3x2.pdfbin0 -> 1067 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/banner.pdfbin0 -> 8993 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/banner.svg1
-rw-r--r--macros/latex/contrib/pagelayout/doc/banner.tex58
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-book.pdfbin0 -> 137910 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-book.tex107
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.pdfbin0 -> 133420 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.tex52
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-graphic.pdfbin0 -> 37253 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-graphic.tex35
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-grid.pdfbin0 -> 12036 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-grid.tex150
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-template.pdfbin0 -> 6305 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-template.tex46
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-text.pdfbin0 -> 11123 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/example-text.tex53
-rw-r--r--macros/latex/contrib/pagelayout/doc/kopi.jpgbin0 -> 1419852 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.pdfbin0 -> 6493 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.tex41
-rw-r--r--macros/latex/contrib/pagelayout/doc/pagelayout-manual.pdfbin0 -> 74868 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/pagelayout-manual.tex473
-rw-r--r--macros/latex/contrib/pagelayout/doc/quickstart-1.svg1
-rw-r--r--macros/latex/contrib/pagelayout/doc/quickstart-2.svg1
-rw-r--r--macros/latex/contrib/pagelayout/doc/quickstart-3.svg1
-rw-r--r--macros/latex/contrib/pagelayout/doc/quickstart.pdfbin0 -> 121601 bytes
-rw-r--r--macros/latex/contrib/pagelayout/doc/quickstart.tex62
-rwxr-xr-xmacros/latex/contrib/pagelayout/scripts/pagelayoutapi371
-rw-r--r--macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1125
-rw-r--r--macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1.md87
-rwxr-xr-xmacros/latex/contrib/pagelayout/scripts/textestvis506
-rw-r--r--macros/latex/contrib/pagelayout/scripts/textestvis.173
-rw-r--r--macros/latex/contrib/pagelayout/scripts/textestvis.1.md55
-rw-r--r--macros/latex/contrib/pagelayout/tex/pagelayout.cls3747
37 files changed, 6551 insertions, 0 deletions
diff --git a/macros/latex/contrib/pagelayout/LICENSE b/macros/latex/contrib/pagelayout/LICENSE
new file mode 100644
index 0000000000..494f58131f
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/LICENSE
@@ -0,0 +1,416 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % http://www.latex-project.org/lppl.txt
+ % and version 1.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
diff --git a/macros/latex/contrib/pagelayout/README.md b/macros/latex/contrib/pagelayout/README.md
new file mode 100644
index 0000000000..aa94a0fe9e
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/README.md
@@ -0,0 +1,90 @@
+![The pagelayout LaTeX class](doc/banner.svg)
+
+The pagelayout class enables you to layout pages declaratively using simple macros for pages, covers, grids, templates, text, and graphics to create graphic rich, perfectly typeset, and print ready PDFs.
+
+The integration of [Inkscape](https://inkscape.org) allows your to create box shadows. Text shadows and SVG filters are ideas for future releases.
+
+The integration of [ImageMagick](https://imagemagick.org) allows you to configure compression and sharpening for bitmap graphics to export web, print or preview versions of your document. Parallelized image optimization, caching, and a draft mode enable fast PDF creation and a responsive workflow, even for large documents with lots of photos and graphics.
+
+The pagelayout class also integrates the [TikZ](https://www.ctan.org/pkg/pgf) and [tcolorbox](https://www.ctan.org/pkg/tcolorbox) LaTeX packages.
+
+## Quick Start
+
+### Generic Templates
+
+Generic templates are the easiest way to put content on a page. The template name describes the layout. You can arrange [l]andscape, [p]ortrait, [s]quare, [w]ide, [g]olden ratio, g[o]lden upright ratio or [f]lexible placeholders in rows [-]. A valid template name for example is `sg-ff`. Notice you cannot combine flexible with fixed aspect ratio placeholders within a row.
+
+```latex
+\template{ss}{
+ \text{
+ This text fills the first placeholder.
+ }
+}
+```
+
+![Generic template](doc/quickstart-1.svg)
+
+### Custom Templates
+
+You can use the grid to layout content on a page. The grid has rows with cells. You can set width relations between cells and height relations between rows. You can give cells a explicit aspect ratio by adding a `!`.
+
+```latex
+\newtemplate{my template}{
+ \setgrid{
+ {[2]{3!}{2!}}
+ }
+ \placeholder{0 0 1 1}
+}
+
+\template{my template}{}
+```
+
+![Custom template](doc/quickstart-2.svg)
+
+You can set margin and gutter for a single grid, on document level, or on page level.
+
+### Graphics
+
+You can scale and position a graphic. And you can add borders and box shadows to graphics and text frames.
+
+```latex
+\newborder{my border}{width=2mm, color=white, radius=5mm}
+\newshadow{my shadow}{size=8}
+
+\template[margin=7mm]{s}{
+ \graphic[
+ scale=1.1,
+ hpos=0.2,
+ unsharp=3x1,
+ shadow=my shadow,
+ border=my border,
+ border radius=0mm
+ ]{kopi}
+}
+```
+
+![Photo with border and shadow](doc/quickstart-3.svg)
+
+Have a look at the [examples](doc) to learn how to create double pages, covers, and more.
+
+For a complete reference, read the [manual](doc/pagelayout-manual.pdf).
+
+## Installation
+
+In general, you should use the package manager shipped with your TeX distribution to install the pagelayout package.
+
+To install manually, copy the contents of [pagelayout.tds.zip](https://github.com/friedemannbartels/latex-pagelayout/releases/download/v1.0.3/pagelayout.tds.zip) to your local TeX directory tree and run the command `texhash`.
+
+To enable image optimization, shadow creation, and preflight, perform these installation steps:
+
+- Make sure that ImageMagick 7.0 or later and Inkscape 1.0 or later are installed.
+
+- Find your top level _texmf.cnf_ with the command `kpsewhich texmf.cnf`, and add `pagelayoutapi` to the list of `shell_escape_commands`.
+ ```
+ shell_escape_commands = pagelayoutapi
+ ```
+- When installing manually, add the directory _scripts/pagelayout_ to your `PATH`.
+
+## Development
+
+Run visual regression tests inside the _tests_ directory with the command `textestvis`.
diff --git a/macros/latex/contrib/pagelayout/doc/1x1.pdf b/macros/latex/contrib/pagelayout/doc/1x1.pdf
new file mode 100644
index 0000000000..5c1a747af1
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/1x1.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/2x1.pdf b/macros/latex/contrib/pagelayout/doc/2x1.pdf
new file mode 100644
index 0000000000..ebbd75abe9
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/2x1.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/3x2.pdf b/macros/latex/contrib/pagelayout/doc/3x2.pdf
new file mode 100644
index 0000000000..a68c035432
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/3x2.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/banner.pdf b/macros/latex/contrib/pagelayout/doc/banner.pdf
new file mode 100644
index 0000000000..084241a0ab
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/banner.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/banner.svg b/macros/latex/contrib/pagelayout/doc/banner.svg
new file mode 100644
index 0000000000..ed221c9df0
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/banner.svg
@@ -0,0 +1 @@
+<svg width="830" height="199" viewBox="0 0 622.5 149.25" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><symbol overflow="visible" id="a"><path style="stroke:none" d="M.453-14.328h10.938v1.625H6.906V0H4.953v-12.703h-4.5zm0 0"/></symbol><symbol overflow="visible" id="b"><path style="stroke:none" d="M10.094-6.656V0H8.313v-6.656c0-.969-.172-1.676-.516-2.125-.336-.457-.867-.688-1.594-.688-.824 0-1.46.293-1.906.875-.438.586-.656 1.422-.656 2.516V0H1.875v-14.938h1.766v5.797c.312-.613.734-1.078 1.265-1.39.54-.32 1.18-.485 1.922-.485 1.094 0 1.91.368 2.453 1.094.54.719.813 1.809.813 3.266zm0 0"/></symbol><symbol overflow="visible" id="c"><path style="stroke:none" d="M10.75-6.25v.86H3.094v.046c-.055 1.469.226 2.528.844 3.172.613.637 1.476.953 2.593.953.563 0 1.149-.086 1.766-.265.613-.176 1.27-.446 1.969-.813v1.75c-.68.274-1.329.477-1.954.61A8.052 8.052 0 0 1 6.5.28c-1.668 0-2.969-.5-3.906-1.5-.938-1-1.406-2.379-1.406-4.14 0-1.72.457-3.086 1.375-4.11.914-1.031 2.144-1.547 3.687-1.547 1.363 0 2.441.47 3.234 1.407.79.93 1.211 2.046 1.266 3.359Zm-1.766-.531a3.385 3.385 0 0 0-.812-1.922c-.461-.54-1.125-.813-2-.813-.856 0-1.559.282-2.11.844-.542.563-.84 1.2-.89 1.906zm0 0"/></symbol><symbol overflow="visible" id="d"><path style="stroke:none" d="M3.594-1.36v5.454H1.828V-10.75h1.766v1.375c.3-.531.695-.938 1.187-1.219.489-.281 1.051-.422 1.688-.422 1.3 0 2.32.508 3.062 1.516.739 1 1.11 2.39 1.11 4.172 0 1.75-.375 3.125-1.125 4.125C8.773-.211 7.758.28 6.469.28c-.657 0-1.23-.14-1.719-.422a2.954 2.954 0 0 1-1.156-1.218Zm5.187-4c0-1.374-.219-2.41-.656-3.109-.43-.695-1.07-1.047-1.922-1.047-.855 0-1.508.356-1.953 1.063-.438.7-.656 1.73-.656 3.094 0 1.355.219 2.386.656 3.093.445.7 1.098 1.047 1.953 1.047.852 0 1.492-.347 1.922-1.047.438-.695.656-1.726.656-3.093zm0 0"/></symbol><symbol overflow="visible" id="e"><path style="stroke:none" d="M6.734-5.406h-.578c-1.031 0-1.808.183-2.328.547-.523.367-.781.902-.781 1.609 0 .648.191 1.152.578 1.516.395.355.938.53 1.625.53.969 0 1.727-.331 2.281-1 .563-.675.848-1.612.86-2.812v-.39Zm3.422-.735V0H8.391v-1.594c-.375.637-.852 1.11-1.422 1.422-.574.3-1.274.453-2.094.453-1.094 0-1.969-.304-2.625-.922-.648-.625-.969-1.453-.969-2.484 0-1.195.399-2.102 1.203-2.719.801-.625 1.977-.937 3.532-.937H8.39v-.282c-.012-.851-.23-1.472-.657-1.859-.43-.394-1.109-.594-2.046-.594-.606 0-1.215.09-1.829.266a7.692 7.692 0 0 0-1.796.75v-1.766c.656-.25 1.28-.437 1.874-.562a8.614 8.614 0 0 1 1.75-.188c.883 0 1.641.137 2.266.407A3.682 3.682 0 0 1 9.5-9.438c.238.325.406.72.5 1.188.102.469.156 1.172.156 2.11zm0 0"/></symbol><symbol overflow="visible" id="f"><path style="stroke:none" d="M8.234-5.469c0-1.32-.218-2.328-.656-3.015-.43-.688-1.055-1.032-1.875-1.032-.867 0-1.527.344-1.984 1.032-.45.687-.672 1.695-.672 3.015 0 1.336.226 2.352.687 3.047.457.688 1.118 1.031 1.985 1.031.812 0 1.43-.347 1.86-1.046.437-.696.655-1.708.655-3.032zM10-.687c0 1.613-.383 2.832-1.14 3.656-.762.832-1.883 1.25-3.36 1.25-.492 0-1-.047-1.531-.14a10.301 10.301 0 0 1-1.594-.391V1.952c.633.29 1.207.504 1.719.64.508.145.976.22 1.406.22.945 0 1.64-.262 2.078-.782.438-.523.656-1.344.656-2.469v-1.265C7.954-1.11 7.566-.66 7.078-.36c-.48.293-1.07.437-1.766.437-1.261 0-2.265-.5-3.015-1.5-.742-1.008-1.11-2.36-1.11-4.047 0-1.687.368-3.031 1.11-4.031.75-1.008 1.754-1.516 3.015-1.516.688 0 1.27.141 1.75.422.477.274.868.7 1.172 1.281v-1.406H10Zm0 0"/></symbol><symbol overflow="visible" id="g"><path style="stroke:none" d="M6.906-3.89c0 .792.145 1.39.438 1.796.289.406.718.61 1.281.61h2.063V0H8.453C7.398 0 6.582-.336 6-1.016c-.574-.675-.86-1.632-.86-2.875v-9.718H2.298v-1.375h4.61Zm0 0"/></symbol><symbol overflow="visible" id="h"><path style="stroke:none" d="M8.234-3.453C7.941-2.703 7.566-1.72 7.11-.5c-.636 1.688-1.062 2.719-1.28 3.094-.294.5-.665.875-1.11 1.125-.438.25-.95.375-1.532.375H1.766V2.609h1.046c.52 0 .926-.152 1.22-.453.288-.304.663-1.078 1.124-2.328L1-10.75h1.875l3.188 8.406 3.125-8.406h1.874zm0 0"/></symbol><symbol overflow="visible" id="i"><path style="stroke:none" d="M5.906-9.516c-.898 0-1.574.352-2.031 1.047-.46.7-.688 1.735-.688 3.11 0 1.355.227 2.386.688 3.093.457.7 1.133 1.047 2.031 1.047.907 0 1.586-.347 2.047-1.047.457-.707.688-1.738.688-3.093 0-1.375-.23-2.41-.688-3.11-.46-.695-1.14-1.047-2.047-1.047Zm0-1.5c1.5 0 2.64.485 3.422 1.454.79.968 1.188 2.37 1.188 4.203 0 1.836-.399 3.234-1.188 4.203C8.547-.196 7.406.28 5.906.28c-1.492 0-2.633-.476-3.422-1.437-.78-.969-1.171-2.367-1.171-4.203 0-1.832.39-3.235 1.171-4.204.79-.968 1.93-1.453 3.422-1.453zm0 0"/></symbol><symbol overflow="visible" id="j"><path style="stroke:none" d="M1.875-4.063v-6.671h1.766v6.671c0 .961.171 1.668.515 2.125.344.461.867.688 1.578.688.832 0 1.47-.29 1.907-.875.445-.594.671-1.438.671-2.531v-6.078h1.782V0H8.313v-1.61C8-.991 7.57-.522 7.03-.202 6.488.117 5.86.28 5.141.28c-1.106 0-1.93-.36-2.47-1.078-.53-.719-.796-1.805-.796-3.265Zm0 0"/></symbol><symbol overflow="visible" id="k"><path style="stroke:none" d="M5.89-13.797v3.047h4.016v1.375H5.891v5.828c0 .805.148 1.36.453 1.672.3.313.828.469 1.578.469h1.984V0H7.75C6.426 0 5.488-.266 4.937-.797c-.542-.531-.812-1.445-.812-2.75v-5.828H1.25v-1.375h2.875v-3.047zm0 0"/></symbol><symbol overflow="visible" id="l"><path style="stroke:none" d="M2.063-14.328h1.953v12.703h6.921V0H2.063zm0 0"/></symbol><symbol overflow="visible" id="n"><path style="stroke:none" d="M1.89-14.328h8.5v1.625H3.829v3.86h6.281v1.64H3.83v5.578h6.75V0H1.89zm0 0"/></symbol><symbol overflow="visible" id="o"><path style="stroke:none" d="M.828-14.328h2.078l3.156 5.406 3.204-5.406h2.078L7.047-7.594 11.657 0H9.561l-3.5-6.172L2.267 0H.172l4.797-7.594Zm0 0"/></symbol><symbol overflow="visible" id="p"><path style="stroke:none" d="M10.188-.547a6.16 6.16 0 0 1-1.47.61c-.5.144-1.015.218-1.546.218-1.656 0-2.953-.5-3.89-1.5-.938-1-1.407-2.379-1.407-4.14 0-1.77.469-3.157 1.406-4.157.938-1 2.235-1.5 3.89-1.5.52 0 1.024.07 1.516.204.5.136 1 .343 1.5.624v1.86c-.468-.414-.937-.719-1.406-.906-.469-.188-1.008-.282-1.61-.282-1.105 0-1.952.36-2.546 1.079-.594.718-.89 1.746-.89 3.078 0 1.324.296 2.343.89 3.062.602.719 1.453 1.078 2.547 1.078.613 0 1.164-.093 1.656-.281a4.082 4.082 0 0 0 1.36-.875zm0 0"/></symbol><symbol overflow="visible" id="q"><path style="stroke:none" d="M9.344-10.375v1.734a6.777 6.777 0 0 0-1.531-.671 5.717 5.717 0 0 0-1.563-.22c-.805 0-1.402.134-1.797.391-.387.262-.578.657-.578 1.188 0 .48.145.84.438 1.078.289.23 1.019.46 2.187.688l.719.125c.875.167 1.535.5 1.984 1 .457.5.688 1.152.688 1.953 0 1.062-.383 1.898-1.141 2.5C8-.016 6.953.28 5.61.28 5.077.281 4.52.223 3.936.11a16.123 16.123 0 0 1-1.89-.5v-1.828a9.414 9.414 0 0 0 1.89.766c.602.168 1.172.25 1.704.25.78 0 1.382-.156 1.812-.469.426-.32.64-.766.64-1.328 0-.82-.78-1.39-2.343-1.703l-.078-.016-.656-.14c-1.024-.196-1.766-.532-2.235-1-.469-.47-.703-1.11-.703-1.922 0-1.032.348-1.828 1.047-2.39.695-.563 1.691-.845 2.984-.845.582 0 1.141.059 1.672.172a8.64 8.64 0 0 1 1.563.469zm0 0"/></symbol><symbol overflow="visible" id="m"><path style="stroke:none" d="M4.14-8.828 2.704-3.703h2.86Zm-.827-1.203h1.656L8.03 0H6.625l-.734-2.61H2.375L1.656 0H.25Zm0 0"/></symbol></defs><path style="fill:#fff;stroke-width:1.45384" d="M4.12 0h614.253a4.111 4.111 0 0 1 4.12 4.122v140.324a4.111 4.111 0 0 1-4.12 4.12H4.12A4.111 4.111 0 0 1 0 144.444V4.12A4.111 4.111 0 0 1 4.12 0Z"/><path style="fill:#a3a3a3;fill-opacity:.2;stroke-width:1.45384" d="M0 148.569v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.117v-.204h622.492v.204zm0-4.124v-.203h622.492v.203zm0-4.121v-.205h622.492v.203zm0-4.117v-.205h622.492v.203zm0-4.123v-.205h622.492v.203zm0-4.124v-.205h622.492v.204zm0-4.117v-.205h622.492v.204zm0-4.123v-.203h622.492v.203zm0-4.123v-.204h622.492v.204zm0-4.117v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.118v-.203h622.492v.203zm0-4.123v-.203h622.492v.203zm0-4.123v-.203h622.492v.203zm0-4.117v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.118v-.203h622.492v.203zm0-4.123V57.7h622.492v.203zm0-4.123v-.203h622.492v.203zm0-4.117v-.203h622.492v.203zm0-4.123v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zm0-4.117v-.204h622.492v.204zm0-4.124v-.203h622.492v.203zm0-4.123v-.203h622.492v.203zm0-4.117v-.203h622.492v.203zm0-4.123v-.203h622.492v.203zm0-4.123v-.204h622.492v.204zM0 8.45v-.204h622.492v.204zm0-4.123v-.204h622.492v.204zM0 .205V0h622.492v.204Z"/><path style="fill:#a3a3a3;fill-opacity:.2;stroke-width:1.45384" d="M0 148.563V0h.206v148.563Zm4.123 0V0h.207v148.563Zm4.117 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.124 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.121 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.207v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.207v148.563Zm4.117 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.124 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.118 0V0h.206v148.563Zm4.121 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.124 0V0h.207v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.124 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.118 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.122 0V0h.208v148.563Zm4.119 0V0h.206v148.563Zm4.121 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.124 0V0h.207v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.208v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.123 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.117 0V0h.207v148.563Zm4.124 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.122 0V0h.208v148.563Zm4.118 0V0h.207v148.563Zm4.122 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.124 0V0h.207v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.124 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.207v148.563Zm4.117 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.118 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.123 0V0h.206v148.563Zm4.117 0V0h.207v148.563Zm4.123 0V0h.207v148.563Zm4.122 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.118 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.124 0V0h.207v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.123 0V0h.208v148.563Zm4.117 0V0h.208v148.563Zm4.123 0V0h.207v148.563Zm4.124 0V0h.206v148.563Zm4.117 0V0h.206v148.563Zm4.123 0V0h.203l.003 148.563Z"/><path style="fill:#000;stroke-width:1.09038" d="M12.176.1v8.246h.58V.1Zm597.567 0v8.246h.58V.1ZM.103 12.174v.58h8.24v-.58zm614.053 0v.58h8.24v-.58zM.103 135.812v.58h8.24v-.579H.103Zm614.053 0v.58h8.24v-.579h-8.24zm-601.98 4.408v8.245h.58v-8.245zm597.567 0v8.245h.58v-8.245z"/><path style="color:#000;fill:#a3a3a3;fill-opacity:.2;stroke-width:1.45384;stroke-miterlimit:10;-inkscape-stroke:none" d="M0 136.206v-.204h622.492v.204zm0-20.609v-.205h622.492v.204zm0-20.603v-.204h622.492v.204zM0 74.39v-.204h622.492v.204zm0-20.61v-.203h622.492v.203zm0-20.603v-.204h622.492v.204zm0-20.61v-.204h622.492v.204z"/><path style="color:#000;fill:#a3a3a3;fill-opacity:.2;stroke-width:1.45384;stroke-miterlimit:10;-inkscape-stroke:none" d="M12.363 148.563V0h.207v148.563Zm20.603 0V0h.208v148.563Zm20.61 0V0h.207v148.563Zm20.603 0V0h.208v148.563Zm20.61 0V0h.206v148.563Zm20.603 0V0h.207v148.563Zm20.604 0V0h.207v148.563Zm20.608 0V0h.208v148.563Zm20.604 0V0h.208v148.563Zm20.604 0V0h.208v148.563Zm20.61 0V0h.207v148.563Zm20.603 0V0h.207v148.563Zm20.61 0V0h.206v148.563Zm20.602 0V0h.208v148.563Zm20.604 0V0h.208v148.563Zm20.61 0V0h.207v148.563Zm20.603 0V0h.208v148.563Zm20.604 0V0h.206v148.563Zm20.61 0V0h.206v148.563Zm20.603 0V0h.207v148.563Zm20.609 0V0h.207v148.563Zm20.603 0V0h.208v148.563Zm20.604 0V0h.208v148.563Zm20.61 0V0h.206v148.563Zm20.603 0V0h.207v148.563Zm20.604 0V0h.207v148.563Zm20.608 0V0h.208v148.563Zm20.604 0V0h.208v148.563Zm20.61 0V0h.208v148.563Zm20.603 0V0h.207v148.563Z"/><path style="fill:none;stroke:#ffbfbf;stroke-width:.56693;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M-.001.002v56.691h382.683V.002Zm0 0" transform="matrix(1.45384 0 0 -1.45384 33.072 115.497)"/><use xlink:href="#a" x="22.085" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#b" x="33.385" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#c" x="44.665" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#d" x="68.386" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#e" x="80.472" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#f" x="92.735" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#c" x="104.605" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#g" x="114.529" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#e" x="125.81" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#h" x="137.287" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#i" x="148.39" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#j" x="159.671" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#k" x="170.362" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#l" x="194.082" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#m" x="198.886" y="74.787" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#a" x="204.241" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#n" x="212.828" y="84.475" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#o" x="222.239" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#p" x="245.979" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#g" x="255.707" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#e" x="266.987" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#q" x="278.838" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/><use xlink:href="#q" x="289.745" y="79.101" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="matrix(1.45384 0 0 1.45384 .103 .102)"/></svg> \ No newline at end of file
diff --git a/macros/latex/contrib/pagelayout/doc/banner.tex b/macros/latex/contrib/pagelayout/doc/banner.tex
new file mode 100644
index 0000000000..4f4dece806
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/banner.tex
@@ -0,0 +1,58 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass[graphpaper,draft]{pagelayout}
+\usepackage{microtype}
+\usepackage{fontspec}
+
+\setmainfont{Menlo}
+
+\pagewidth=14.5cm
+\pageheight=3cm
+\bleed=3mm
+\margin=5mm
+
+\begin{document}
+
+ \page{
+ \tikzgraphic{
+ \draw[line width=0.2mm,draw=pink] (0,0) rectangle (\width,\height);
+ }
+
+ \setgrid[y=\y-1.8mm]{{{}}}
+ \text[bottom]{
+ \fontsize{19.8pt}{24pt}\selectfont
+ T\kern-0.03em
+ h\kern-0.03em
+ e
+ p\kern0.01em
+ a\kern0.02em
+ g\kern0.00em
+ e\kern-0.1em
+ l\kern-0.03em
+ a\kern-0.02em
+ y\kern-0.04em
+ o\kern-0.03em
+ u\kern-0.06em
+ t\
+ \LaTeX\
+ c\kern-0.11em
+ l\kern-0.03em
+ a\kern-0.00em
+ s\kern-0.05em
+ s
+ }
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/example-book.pdf b/macros/latex/contrib/pagelayout/doc/example-book.pdf
new file mode 100644
index 0000000000..f566a238da
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-book.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/example-book.tex b/macros/latex/contrib/pagelayout/doc/example-book.tex
new file mode 100644
index 0000000000..04e9dd4db6
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-book.tex
@@ -0,0 +1,107 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass[
+ draft,
+ twoside,
+ beginright,
+ % fanfold,
+ import,
+ optimize={quality=50, density=72}
+]{pagelayout}
+
+\usepackage{lipsum}
+\usepackage{tgheros}
+\usepackage[T1]{fontenc}
+\renewcommand*\familydefault{\sfdefault}
+
+\pagewidth=200mm
+\pageheight=200mm
+\margin=20mm
+\innermargin=40mm
+\gutter=10mm
+\bleed=3mm
+\safetymargin=5mm
+\spinewidth=7mm
+
+\safezone
+
+\newbeforepage{primary}{
+ \setgrid[height=\margin, y=0mm]{{{}}}
+
+ \leftpage{
+ \text[center]{\thepage}
+ }
+
+ \rightpage{
+ \text[center]{\hspace*{\fill}\thepage}
+ }
+}
+\setbeforepage{primary}
+
+\begin{document}
+ \Large
+ \pagenumbering{roman}
+
+ \template[back cover,margin=0mm, inner margin=0mm]{f}{}
+
+ \page[front cover,color=white,page graphic=kopi, inner margin=\margin]{
+ \text[bottom]{
+ \fontsize{42mm}{46mm}\selectfont
+ \centering
+ KØPI
+ }
+
+ \ifspine{
+ \setgrid[width=\spinewidth,x=-\spinewidth]{{{1}}}
+ \place{0 0 1 1}
+ \tikzgraphic{
+ \node[rotate=90] at (0.5\width,0.5\height){
+ \fontsize{4mm}{8mm}\selectfont
+ KØPI
+ };
+ }
+ }
+ }
+
+ \page{
+ \text{
+ \strut
+ \tableofcontents
+ }
+ }
+
+ \pagenumbering{arabic}
+
+ \setcounter{page}{0}
+ \page[before page=]{}
+
+ \page{
+ \text{
+ \strut
+ \section{Introduction}
+ \lipsum[1][1-7]
+ }
+ }
+
+ \newgraphic{kopi wide}{vpos=0.43, file=kopi}
+ \page[double, page graphic=kopi wide, before page=, color=white]{
+ \rightpage{
+ \text[bottom]{
+ \lipsum[1][8-10]
+ }
+ }
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.pdf b/macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.pdf
new file mode 100644
index 0000000000..41096e77a3
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.tex b/macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.tex
new file mode 100644
index 0000000000..33c0b14e65
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-borders-and-shadows.tex
@@ -0,0 +1,52 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass[draft]{pagelayout}
+\usepackage{lipsum}
+
+\pagewidth=15cm
+\pageheight=15cm
+\gutter=10mm
+
+\newborder{my border}{width=2mm, color=magenta, radius=5mm}
+\newshadow{my shadow}{size=5, color=magenta, opacity=1}
+
+\begin{document}
+
+ \template{ff-ff}{
+ \graphic[
+ border=my border,
+ border radius=10mm
+ ]{1x1}
+
+ \graphic[
+ border=my border,
+ shadow=my shadow
+ ]{1x1}
+
+ \text[
+ shadow=my shadow,
+ shadow color=black,
+ shadow opacity=0.2
+ ]{\lipsum[1][1-5]}
+
+ \graphic[
+ shadow size=5,
+ shadow opacity=0.6,
+ shadow xshift=1mm,
+ shadow yshift=1mm
+ ]{1x1}
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/example-graphic.pdf b/macros/latex/contrib/pagelayout/doc/example-graphic.pdf
new file mode 100644
index 0000000000..2d7519147c
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-graphic.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/example-graphic.tex b/macros/latex/contrib/pagelayout/doc/example-graphic.tex
new file mode 100644
index 0000000000..5eb085bef7
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-graphic.tex
@@ -0,0 +1,35 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass{pagelayout}
+
+\pagewidth=20cm
+\pageheight=20cm
+\bleed=3mm
+
+\optimize[quality=50, density=72]
+\preflight
+\safezone
+
+\newgraphic{kopi scaled}{scale=1.02, hpos=0.2, vpos=1, file=kopi}
+
+\begin{document}
+
+ \page{
+ \graphic[hpos=0, scale=1.2]{3x2}
+ }
+
+ \page[page graphic=kopi scaled]{}
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/example-grid.pdf b/macros/latex/contrib/pagelayout/doc/example-grid.pdf
new file mode 100644
index 0000000000..1263d4883f
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-grid.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/example-grid.tex b/macros/latex/contrib/pagelayout/doc/example-grid.tex
new file mode 100644
index 0000000000..6bc3573867
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-grid.tex
@@ -0,0 +1,150 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass{pagelayout}
+\usepackage{lipsum}
+
+\pagewidth=20cm
+\pageheight=20cm
+\gutter=10mm
+
+\grid
+
+\begin{document}
+
+ \page{
+ \setgrid{
+ {{1}{1}}
+ {{1}{1}}
+ }
+
+ \text{
+ A grid with two rows and two cells in each row.
+ }
+ }
+
+ \page{
+ \setgrid{
+ {{3}{2}}
+ {{2}{3}}
+ }
+
+ \text{
+ A grid with a width relation between cells.
+ }
+ }
+
+ \page{
+ \setgrid{
+ {[3]{1}{1}}
+ {[1]{1}{1}}
+ }
+
+ \text{
+ A grid with a height relation between rows.
+ }
+ }
+
+ \page{
+ \setgrid{
+ {[2]{1}{3!}}
+ {[2]{1}{2!}}
+ }
+
+ \text{
+ A grid with a fixed aspect ratio of some cells.
+ }
+
+ \graphic{3x2}
+
+ \place{1 1 2 2}
+ \graphic{1x1}
+ }
+
+ \page{
+ \setgrid{
+ {[1]{1!}{1!}{1!}}
+ {[2]{4!}{3!}}
+ }
+
+ \text{
+ A grid with a fixed aspect ratio of all cells.
+ }
+
+ \place{0 0 1 1}
+ \graphic{1x1}
+
+ \graphic{1x1}
+
+ \graphic{1x1}
+
+ \graphic{2x1}
+
+ \graphic{3x2}
+ }
+
+ \page{
+ \setgrid{
+ {[2]{2!}{2!}{2!}}
+ {[2!]{4!}{3}}
+ }
+
+ \graphic{1x1}
+
+ \graphic{1x1}
+
+ \graphic{1x1}
+
+ \graphic{2x1}
+
+ \text{
+ A grid with a fixed height relation between rows.
+ }
+ }
+
+ \page[gutter=10mm]{
+ \setgrid[
+ width=0.5\width,
+ x=\margin
+ ]{
+ {{1}}
+ }
+ \text{
+ Multiple grids on one page.
+ }
+ \setgrid[
+ width=0.5\width-\gutter,
+ x=\margin+0.5\width+\gutter
+ ]{
+ {{1}}
+ {{1}}
+ {{1}}
+ }
+ }
+
+ \page{
+ \setgrid[width=\height]{
+ {{1}{1}}
+ {{1}{1}}
+ }
+ \text{
+ A grid with free positioned content. The gutter is preserved.
+ }
+ \place{0.5 0.5 1.5 1.5}
+ \graphic{1x1}
+ \place{1.5 1.5 2 2}
+ \graphic{1x1}
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/example-template.pdf b/macros/latex/contrib/pagelayout/doc/example-template.pdf
new file mode 100644
index 0000000000..def352592f
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-template.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/example-template.tex b/macros/latex/contrib/pagelayout/doc/example-template.tex
new file mode 100644
index 0000000000..b10e8a7486
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-template.tex
@@ -0,0 +1,46 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass[draft]{pagelayout}
+\usepackage{lipsum}
+
+\pagewidth=15cm
+\pageheight=15cm
+\gutter=10mm
+
+\begin{document}
+
+ \template[gutter=5mm]{so-gs}{
+ \text{
+ This is a generic template.
+ }
+ }
+
+ \newtemplate{my template}{
+ \setgrid[height=\height-20mm]{
+ {[1]{1!}{1}}
+ {[1]{1!}{1}}
+ }
+ \placeholder{0 0 1 1}
+ \placeholder{1 0 2 1}
+ \placeholder{0 1 2 2}
+ }
+
+ \template[outer margin=10mm]{my template}{
+ \text{
+ This is a custom template.
+ }
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/example-text.pdf b/macros/latex/contrib/pagelayout/doc/example-text.pdf
new file mode 100644
index 0000000000..34212cb021
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-text.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/example-text.tex b/macros/latex/contrib/pagelayout/doc/example-text.tex
new file mode 100644
index 0000000000..82376d1abc
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/example-text.tex
@@ -0,0 +1,53 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass{pagelayout}
+\usepackage{lipsum}
+
+\pagewidth=15cm
+\pageheight=15cm
+\gutter=10mm
+
+\setgrid{
+ {{1}{1}}
+}
+
+\begin{document}
+
+ \page{
+ \text[breakable, name=lorem]{
+ \lipsum[2-3]
+ \par
+ \lipsum[4]
+ }
+ \usetext[lorem]
+ }
+
+ \page{
+ \usetext[lorem]
+ \tcbset{
+ boxrule=1mm,
+ boxsep=1mm,left=2mm,right=2mm,top=2mm,bottom=2mm,
+ colback=yellow,
+ colframe=red!75!black,
+ opacityframe=1,
+ opacityback=1,
+ arc=1mm
+ }
+ \text{
+ Text boxes use the package tcolorbox, so you can style these with the tcolorbox macro \texttt{tcbset}
+ }
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/kopi.jpg b/macros/latex/contrib/pagelayout/doc/kopi.jpg
new file mode 100644
index 0000000000..b2df8920c7
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/kopi.jpg
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.pdf b/macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.pdf
new file mode 100644
index 0000000000..0ec732a859
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.tex b/macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.tex
new file mode 100644
index 0000000000..def8cdfda0
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/pagelayout-manual-layout-guides.tex
@@ -0,0 +1,41 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass[
+ bleed=3mm,
+ margin=10mm,
+ gutter=5mm,
+ page width=20cm,
+ page height=20cm,
+ safety margin=2mm,
+ draft,
+ safezone,
+ grid,
+ graphpaper
+]{pagelayout}
+
+\begin{document}
+
+ \newtemplate{layoutguidesexample}{
+ \setgrid{
+ {{6}{1}}
+ }
+ \placeholder{0 1 1 2}
+ \placeholder{0 0 1 1}
+ }
+ \template{layoutguidesexample}{
+
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/pagelayout-manual.pdf b/macros/latex/contrib/pagelayout/doc/pagelayout-manual.pdf
new file mode 100644
index 0000000000..6c8c02bfe9
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/pagelayout-manual.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/pagelayout-manual.tex b/macros/latex/contrib/pagelayout/doc/pagelayout-manual.tex
new file mode 100644
index 0000000000..4c636941e3
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/pagelayout-manual.tex
@@ -0,0 +1,473 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass[a4paper]{ltxdoc}
+\usepackage{microtype}
+\usepackage{hyperref}
+\usepackage{tikz}
+\OnlyDescription
+\hypersetup{pdfborder={0 0 0}}
+\def\pagelayoutversion{1.0.3}
+
+\begin{document}
+
+\title{
+ \Huge The \textsf{pagelayout} class\vskip3mm
+ \Large Manual for Version \pagelayoutversion\vskip3mm
+ \normalsize\url{https://github.com/friedemannbartels/latex-pagelayout}
+}
+
+\author{\href{mailto:mail@friedemannbartels.de}{Friedemann Bartels}}
+
+\maketitle
+
+\tableofcontents
+
+\newpage
+
+\section{Introduction}
+
+When Apple discontinued its photo book feature in Apple Photos, I was missing an easy-to-use photo book application.
+In 2020, I started to develop my own solution.
+What started with some SVG templates and shell scripts ended up in the pagelayout class, a declarative desktop publishing approach.
+\par
+With the pagelayout class you can create single- and double-sided documents, create pages with margins, safety margins, and bleed, use templates, align text and graphics in a grid, wrap text across multiple pages and use before pages.
+Generic templates, automatic grid layout and a simple and consistent user interface make it easier than ever to create graphics-rich documents with \LaTeX.
+Under the hood the TikZ and tcolorbox packages, ImageMagick and Inkscape are used.
+
+\section{Document}\label{sec:document}
+
+The document options described in the following can be either set as a document option (|\documentclass[twoside]{pagelayout}|) or with a macro (|\twoside|) in the preamble.
+
+\DescribeMacro {\documentclass}
+Use the class with the |\documentclass|\oarg{options}|{pagelayout}| macro.
+A single sided document is the default.
+\begin{figure}[h!]
+\begin{tikzpicture}
+ \draw[black, thin] (0,0) rectangle (1,1);
+ \draw[black, line width=1.5pt,line cap=round] (0,0) -- (0,1);
+ \draw[black, thin] (1.25,0) rectangle (2.25,1);
+ \draw[black, line width=1.5pt,line cap=round] (1.25,0) -- (1.25,1);
+ \draw[black, thin] (2.5,0) rectangle (3.5,1);
+ \draw[black, line width=1.5pt,line cap=round] (2.5,0) -- (2.5,1);
+\end{tikzpicture}
+\end{figure}
+
+\DescribeMacro {\twoside}
+Using the document option |twoside| results in a document with left and right pages.
+When you create a two-sided document, your document always has an even number of pages.
+If you create a document with an odd number of pages, an additional page is automatically inserted.
+Two-sided documents start with a right page by default.
+\begin{figure}[h!]
+\begin{tikzpicture}
+ \draw[black, thin] (0,0) rectangle (1,1);
+ \draw[black, line width=1.5pt,line cap=round] (0,0) -- (0,1);
+ \draw[black, thin] (1.25,0) rectangle (2.25,1);
+ \draw[black, line width=1.5pt,line cap=round] (2.25,0) -- (2.25,1);
+ \draw[black, thin] (2.35,0) rectangle (3.35,1);
+ \draw[black, line width=1.5pt,line cap=round] (2.35,0) -- (2.35,1);
+ \draw[black, thin] (3.6,0) rectangle (4.6,1);
+ \draw[black, line width=1.5pt,line cap=round] (4.6,0) -- (4.6,1);
+\end{tikzpicture}
+\end{figure}
+
+\DescribeMacro {\beginleft}
+Use the option |beginleft| to begin with a left page.
+\begin{figure}[h!]
+\begin{tikzpicture}
+ \draw[black, thin] (0,0) rectangle (1,1);
+ \draw[black, line width=1.5pt,line cap=round] (1,0) -- (1,1);
+ \draw[black, thin] (1.1,0) rectangle (2.1,1);
+ \draw[black, line width=1.5pt,line cap=round] (1.1,0) -- (1.1,1);
+ \draw[black, thin] (2.35,0) rectangle (3.35,1);
+ \draw[black, line width=1.5pt,line cap=round] (3.35,0) -- (3.35,1);
+ \draw[black, thin] (3.45,0) rectangle (4.45,1);
+ \draw[black, line width=1.5pt,line cap=round] (3.45,0) -- (3.45,1);
+\end{tikzpicture}
+\end{figure}
+
+By default, each page is placed on one paper.
+\DescribeMacro {\fanfold}
+With the |fanfold| option you can change this behavior so that a left and a right page are placed on one paper.
+In this case, the first page is a left one by default.
+\begin{figure}[h!]
+\begin{tikzpicture}
+ \draw[black, thin] (0,0) rectangle (1,1);
+ \draw[black, thin] (1,0) rectangle (2,1);
+ \draw[black, line width=1.5pt,line cap=round] (1,0) -- (1,1);
+ \draw[black, thin] (2.25,0) rectangle (3.25,1);
+ \draw[black, thin] (3.25,0) rectangle (4.25,1);
+ \draw[black, line width=1.5pt,line cap=round] (3.25,0) -- (3.25,1);
+\end{tikzpicture}
+\end{figure}
+
+\DescribeMacro {\cover}
+The |cover| option is similar to the |fanfold| option, but only applied to cover pages.
+Read more about cover pages in section~\ref{sec:pages}.
+\begin{figure}[h!]
+\begin{tikzpicture}
+ \draw[black, thin] (0,0) rectangle (2.3,1);
+ \draw[black, line width=1.5pt,line cap=round] (1,0) -- (1,1);
+(3.25,1);
+ \draw[black, line width=1.5pt,line cap=round] (1.3,0) -- (1.3,1);
+(3.25,1);
+\end{tikzpicture}
+\end{figure}
+
+\DescribeMacro {\beginright}
+If you want your fanfold document to start with a right hand page, you can use the option |beginright|.
+\begin{figure}[h!]
+\begin{tikzpicture}
+ \draw[black, thin] (0,0) rectangle (1,1);
+ \draw[black, thin] (0,0) -- (1,1);
+ \draw[black, thin] (0,1) -- (1,0);
+ \draw[black, thin] (1,0) rectangle (2,1);
+ \draw[black, line width=1.5pt,line cap=round] (1,0) -- (1,1);
+ \draw[black, thin] (2.25,0) rectangle (3.25,1);
+ \draw[black, thin] (3.25,0) rectangle (4.25,1);
+ \draw[black, line width=1.5pt,line cap=round] (3.25,0) -- (3.25,1);
+ \draw[black, thin] (4.5,0) rectangle (5.5,1);
+ \draw[black, thin] (5.5,0) rectangle (6.5,1);
+ \draw[black, thin] (5.5,0) -- (6.5,1);
+ \draw[black, thin] (5.5,1) -- (6.5,0);
+ \draw[black, line width=1.5pt,line cap=round] (5.5,0) -- (5.5,1);
+\end{tikzpicture}
+\end{figure}
+
+\subsection{Lengths}\label{subsec:size}
+
+The document lengths described below can be set either as a document option (|\documentclass[page width=21cm]{pagelayout}|) or by assigning the dimension directly (|\pagewidth=21cm|) in the preamble or in the document.
+
+\DescribeMacro {\pagewidth}
+\DescribeMacro {\pageheight}
+You can set the lengths |page width| and |page height|.
+The default page size is |210mm| by |297mm|.
+
+\DescribeMacro {\bleed}
+You can set the |bleed| length.
+It applies to all paper edges.
+The default bleed is |0mm|.
+You can override the bleed for each edge separately by defining the lengths |top bleed|, |inner bleed|, |bottom bleed|, |outer bleed|.
+The paper size results from the page size and the bleed.
+
+\DescribeMacro {\safetymargin}
+The |safety margin| is the only length that has no influence on the final result.
+Its only purpose is to control the safe zone during editing.
+It is |0mm| by default and can be configured for each edge by defining |top safety margin|, |inner safety margin|, |bottom safety margin| and |outer safety margin|.
+
+\DescribeMacro {\margin}
+\DescribeMacro {\gutter}
+You can set the lengths |margin| and |gutter| for the document, for a page (see section~\ref{sec:pages}) or for a grid (see section~\ref{sec:grid}).
+The default margin is |20mm|, the default gutter is |0mm|.
+Similar to bleed and safety margin, the margin can be defined for each edge individually by setting |top margin|, |outer margin|, |bottom margin| and |inner margin|.
+
+You can create documents with cover pages.
+\DescribeMacro {\coverwidth}
+\DescribeMacro {\coverheight}
+Read more about creating cover pages in section~\ref{sec:pages}.
+You can set the lengths |coverwidth| and |coverheight|.
+By default, the cover pages are the same size as the inside pages.
+If you want to create a cover with a spine, use the |fanfold| or |cover| option described in section~\ref{sec:document}.
+In this case the length |spinewidth| takes effect.
+The default spine width is |3mm|.
+\par
+You can overwrite the bleed and the safety margin for cover pages.
+To do this, prefix the respective lengths described above.
+For example, define |cover inner bleed| or |cover safety margin|.
+
+\subsection{Page Graphics and Colors}\label{subsec:colors}
+
+You can define a page graphic and a page color with the options |page graphic| and |page color|.
+Set the option |color| to define the text color.
+These options can be defined for the document or for each page (see section~\ref{sec:pages}).
+\par
+Read how to set the scale and crop of a page graphic with the |\newgraphic| macro in section~\ref{sec:content}.
+
+\subsection{Layout Guides}
+
+The layout guides described in the following can be either set as a document option (|\documentclass[grid]{pagelayout}|) or using a macro (|\grid|) in the preamble or the document.
+Layout guides can be switched on (|\safezone|) or off (|\nosafezone|).
+
+\DescribeMacro {\grid}
+The |grid| option visualizes the margin and the grid gutters with green lines.
+Read more about the grid in section~\ref{sec:grid}.
+\DescribeMacro {\safezone}
+The |safezone| layout guide shows a red border for the bleed and a thin pink line to indicate the safety margin.
+\DescribeMacro {\cuttingmarks}
+As an alternative to |safezone|, you can also use |cutting marks| to display cutting marks.
+\DescribeMacro {\graphpaper}
+Show a graph paper with the |graph paper| option.
+
+\begin{figure}[h]
+\begin{tikzpicture}
+ \node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[trim={15cm 16.5cm 0cm 0},clip,scale=1,page=1]{pagelayout-manual-layout-guides.pdf}};
+ \node[anchor=south west,text depth=0mm,text width=4cm] (bleed) at (65mm,33mm) {Bleed};
+ \draw (bleed) -- ++(-32mm,0);
+ \node[anchor=south west,text depth=0mm,text width=4cm] (bleed) at (65mm,27mm) {Safety margin};
+ \draw (bleed) -- ++(-35mm,0.0);
+ \node[anchor=south west,text depth=0mm,text width=4cm] (margin) at (65mm,21mm) {Margin};
+ \draw (margin) -- ++(-43mm,0.0);
+ \node[anchor=south west,text depth=0mm,text width=4cm] (gutter) at (65mm,15mm) {Gutter};
+ \draw (gutter) -- ++(-70mm,0.0);
+ \node[anchor=south west,text depth=0mm,text width=4cm] (placeholder) at (65mm,9mm) {Placeholder};
+ \draw (placeholder) -- ++(-50mm,0.0);
+ \node[anchor=south west,text depth=0mm,text width=4cm] (graphpaper) at (65mm,3mm) {Graph paper};
+ \draw (graphpaper) -- ++(-40mm,0.0);
+\end{tikzpicture}%
+\end{figure}
+
+\DescribeMacro {\placeholders}
+The |placeholders| option shows template placeholders.
+Read more about templates in section~\ref{sec:templates}.
+\DescribeMacro {\fillpages}
+If you create a document with a cover and a first right hand page, use the |fill pages| option during editing to add blank pages to get a better impression of the final result.
+
+\subsection{Draft Mode}\label{subsec:draftmode}
+
+The |draft| option is a shortcut to enable the options |placeholders|, |cutting marks| and |fill pages|.
+It also speeds up rebuilding the PDF when changing the document.
+
+\section{Pages}\label{sec:pages}
+
+\DescribeMacro {\page}
+Create a page with the macro |\page|\oarg{options}\marg{content}.
+You can overwrite the document options |margin|, |top margin|, |bottom margin|, |inner margin|, |outer margin|, |gutter|, |page color|, |page graphic| and |color| for each page.
+
+Use the option |double| to create a double page.
+When creating a double page after a left page, a right page is automatically inserted before the double page.
+The option |double| is only recognized for double sided documents.
+\par
+Use the options |front cover| or |back cover| to create a front or back cover.
+If you have a back cover and a front cover, the back cover page must be defined first.
+If no option is active, the front cover is placed as the first page and the back cover as the last page of the document.
+In this case, the only difference from normal pages is that the cover pages are not counted in the page numbering.
+\par
+If the option |fanfold| or |cover| is selected, the back and front covers are laid out on one paper so that the cover is suitable for a book with a hard or soft cover (see section~\ref{sec:document}).
+Space is reserved between the back and front covers for the spine.
+Set the |spine width| document option as described in section~\ref{subsec:size}.
+\par
+With the options |hpos| and |vpos| you can set the default grid alignment for a page.
+Read more about the grid in the next section.
+
+\DescribeMacro {\setpagecolor}Alternativly to the option you can use the macro |\setpagecolor|\marg{color} to set the page color for all following pages.
+
+\DescribeMacro {\setpagegraphic}With the macro |\setpagegraphic|\oarg{options}\marg{name} you can define a page graphic for all following pages.
+The name references a graphic version created with the |\newgraphic| macro (see section~\ref{sec:content}).
+If no graphic version with the given name exists, the macro uses the name as the file name.
+You can change the clipping by defining relative decimal values for the options |scale| (>1), |hpos| and |vpos| (0-1).
+
+\DescribeMacro {\newbeforepage}With the macro |\newbeforepage|\marg{name}\marg{content} you can create a reusable page layer, that can be set before pages.
+\DescribeMacro {\setbeforepage}
+Use the macro |\setbeforepage|\marg{name} to define a before page for all following pages or use the page option |before page| to specify a before page for a individual page.
+
+\DescribeMacro {\ifleftpage}
+\DescribeMacro {\ifrightpage}
+Use the condition |\ifleftpage|\marg{content} and |\ifrightpage|\marg{content} to check for the current page alignment.
+
+\DescribeMacro {\leftpage}
+Within a page scope you can use the |\leftpage|\marg{content} macro to place content only on a left page.
+In comparison to the |\ifleftpage|\marg{content} condition, the macro sets a grid for a single page.
+That way you can combine single with double page layouts.
+\DescribeMacro {\rightpage}
+Accordingly you can use the |\rightpage|\marg{content} macro.
+
+\section{Grid}\label{sec:grid}
+
+The grid allows you to create rows with cells.
+You can define width and height relations between rows and cells.
+All definitions are relative.
+The size and position results from these relations and the configured dimensions page width, page height, margin and gutter.
+
+\DescribeMacro{\setgrid}
+Create a grid with the macro |\setgrid|\oarg{options}\marg{config}.
+The grid configuration is a nested list of rows and cells.
+A cell is defined by a number that describes the width ratio to the other cells in the row.
+The default grid describes a row with one cell:
+
+\begin{verbatim}
+ \setgrid{
+ {{}}}
+\end{verbatim}
+
+You can define a width relation between cells by adding a integer value for each cell:
+
+\begin{verbatim}
+ \setgrid{
+ {{1}{2}}}
+\end{verbatim}
+
+With an optional integer value for each row you can set a height relation between rows:
+
+\begin{verbatim}
+ \setgrid{
+ {[2]{1}{2}}
+ {[1]{1}{2}}}
+\end{verbatim}
+
+You can set an aspect ratio for a cell by adding a |!| to the width.
+This way the aspect ratio is defined by the width of the cell and the height of the row.
+If all cells in a row have a fixed aspect ratio, the aspect ratio of the row is fixed too.
+In the following, a row with only fixed cells is named a fixed row.
+Because the height of a fixed row is determined by the aspect ratios of the cells, the height relation to the flexible rows is broken.
+In this case, you can force a height relation between flexible and fixed rows by adding a |!| to the height of the flexible row.
+In the following, a row with a forced height is named a forced row.
+
+The example defines a first fixed row with one cell and an aspect ratio of 3:2.
+The height of the second row is forced half of the height of the first row.
+The cells in the second row share the available width in the ratio one to two:
+
+\begin{verbatim}
+ \setgrid{
+ {[2]{3!}}
+ {[1!]{1}{2}}}
+\end{verbatim}
+
+If the height of fixed and forced rows exceeds the available height, the grid shrinks to fit the available space.
+The defined aspect ratios of the cells are preserved and the grid is centered horizontally.
+In this case you can define the |hpos| option to align the grid horizontally.
+A value of |0| aligns the grid to the left, a value of |1| aligns the grid to the right.
+The default is a value of |0.5|.
+
+If the height of fixed and forced rows is less than the available height, all flexible rows share the excess height.
+If there are no flexible rows, the grid is centered vertically.
+In this case you can define the |vpos| option to align the grid vertically.
+A value of |0| aligns the grid to the top, a value of |1| aligns the grid to the bottom.
+The default is a value of |0.5|.
+
+As for a document or a page you can set |margin| and |gutter| options for a specific grid.
+With the options |width|, |height|, |x| and |y| you can override the intrinsic grid size and position.
+When overriding the grid size and position, you can calculate with the intrinsic values, for example |x=\x-1cm|.
+
+\subsection{Placing Content}
+
+The grid aligns content (see section~\ref{sec:content}) automatically in the given grid cells.
+To set the position of a content box manually use the macro |\place|\marg{fromrow fromcell torow tocell}.
+\DescribeMacro{\place}
+To place content in the first row and first cell use the macro |\place{0 0 1 1}| before the content.
+The definded place applies only for the following content box.
+The next boxes are then again placed with auto layout.
+\par
+The macro accepts decimals.
+That allows you to place content everywhere within the grid.
+The |gutter| is taken into account when calculating the positions.
+
+\section{Content}\label{sec:content}
+
+\subsection{Text}
+
+\DescribeMacro{\text}
+With the macro |\text|\oarg{options}\marg{text} you can place text.
+Align the text vertically with the |center| and |bottom| options.
+\par
+The |\text| macro uses the package tcolorbox and accepts tcolorbox options, for example to set text, frame or background color and transparency.
+The tcolorbox behaves slightly diffenrent then the standalone version: spacings, rules and background are removed by default.
+You can change the behaviour with the tcolorbox macro |\tcbset|\marg{options}.
+Also the |arc| options behaves different: if you set the |arc| to |0pt| the |outer arc| is also set to |0pt|.
+\par
+Add the option |breakable| to break text over multiple boxes and pages.
+\DescribeMacro{\usetext}
+Use the macro |\usetext|\oarg{name} to place the following text boxes in the grid.
+If you want to use multiple breakable text boxes you can initialize the text with the |name| option and define a name that you then can pass to the |\usetext| option.
+\par
+The |\text| macro accepts the options |shadow|, |shadow size|, |shadow color|, |shadow opacity|, |shadow xshift|, |shadow yshift|, |border|, |border width|,\break |border color| and |border radius|.
+Read more about shadows and borders in section~\ref{subsec:borders}.
+
+\subsection{Graphics}
+
+\DescribeMacro{\newgraphic}
+Create a reusable graphic version with the |\newgraphic|\marg{name}\marg{options} macro.
+Define the options |scale| (>1), |hpos| and |vpos| (0-1) to set the clipping of the graphic.
+With the option |file| you can link a file.
+If no file is defined, the name is used as the file name.
+
+\DescribeMacro{\graphic}
+The |\graphic|\oarg{options}\marg{name} macro places a graphic.
+The name references a graphic version created with the |\newgraphic| macro.
+If no graphic version with the given name exists, the macro uses the name as the file name.
+
+The graphic is scaled to fit in the content box.
+If the aspect ratio of the graphic differs from that of the defined content box, the graphic is cropped.
+You can change the cropping by defining relative decimal values for the options |scale| (>1), |hpos| and |vpos| (0-1).
+Same as the |\text| macro, the |\graphic| macro accepts the |border| and |shadow| options described in section~\ref{subsec:borders}.
+
+\DescribeMacro{\graphicspath}
+You can use the macro |\graphicspath|\marg{dir-list} of the graphics package to specify a list of directories in which to search for graphic files.
+
+\subsection{Other}
+
+\DescribeMacro{\xput}
+The macro |\xput|\marg{code} is an easy way to place arbitrary content in the grid.
+Within the code block the dimensions |\width| and |\height| represent the size of the content area and can be used to create graphics, that fit and adapt to the available size.
+\par
+\DescribeMacro{\tikzgraphic}
+The macro |\tikzgraphic|\marg{tikz code} works like the |\xput| macro, but wraps your input in a |tikzpicture|.
+
+\subsection{Shadows and Borders}\label{subsec:borders}
+
+Text and graphic content can be placed with a border or a shadow.
+You can define a border or shadow for a specific content box by using the options |border width|, |border color|, |border radius| to add a border or |shadow size|, |shadow color|, |shadow opacity|, |shadow xshift|, |shadow yshift| to add a shadow.
+\par
+\DescribeMacro{\newborder}
+\DescribeMacro{\newshadow}
+Define a reusable border or shadow with the |\newborder|\marg{name}\marg{options} or |\newshadow|\marg{name}\marg{options} macros.
+Apply the border or shadow to |\text| or |\graphic| with the option |border| or |shadow|.
+\par
+\DescribeMacro{\setborder}
+\DescribeMacro{\setshadow}
+To set a border or shadow within a page or document scope, use the macros |\setborder|\oarg{options}\marg{name} or |\setshadow|\oarg{options}\marg{name}.
+
+\section{Templates}\label{sec:templates}
+
+\DescribeMacro{\newtemplate}
+With the macro |\newtemplate|\marg{name}\marg{layout} you can create a reusable layout.
+Creating a template works the same way as creating a page.
+In addition to graphics and text you can define placeholders.
+\DescribeMacro{\placeholder}
+Use the macro |\placeholder|\marg{fromrow fromcell torow tocell} to define a content area that can later be filled with a text or a graphic.
+
+\DescribeMacro{\template}
+To use a template use the macro |\template|\oarg{options}\marg{name}\marg{content}.
+The available options are the same as for pages.
+
+The macro |\template| comes with an easy way to generate templates by using a name pattern.
+For example the template name \textit{sp} creates a template with a square and a portrait format placeholder.
+In this case the letter |s| specifies a square (1:1) and the letter |p| a portrait (2:3) format placeholder.
+Use the letter |l| to define a landscape ratio (3:2), |g| for golden ratio (5:3), |o| for golden upright ratio (3:5), |w| for wide ratio (2:1) or |f| for a flexible ratio.
+With the character |-| you can start a new row.
+Within a row you can mix the fixed placeholders (|s|, |p|, |l|, |g|, |o|, |w|) or use only flexible placeholders~(|f|).
+
+\section{Image Optimization}\label{sec:optimization}
+
+\DescribeMacro{\optimize}
+With the macro |\optimize|\oarg{options} you can enable image optimization.
+When enabled, JPG and PNG images are croped, resized and cached.
+This results in fast rebuilds when changing the document.
+You can set the options |density|, |quality|, |unsharp| and |downsample threshold|.
+The |density| option takes a number of the pixels per inch (default |300|), the |quality| option takes numbers between 1 and 100, the |unsharp| option an ImageMagick unsharp configuration (default |2x1|) and the |downsample threshold| a decimal value greater or equal 1 (default |1.2|).
+The |unsharp| option can also be applied for individual graphics.
+\par
+If you use image optimization and change the original graphics files, you must delete the cached versions so that the cache will update.
+\DescribeMacro{\import}
+The |\import| macro helps you to streamline this process.
+When enabled, you need an import directory in which to place the modified files.
+When the document is created, the files are moved to your image directory and the corresponding cached versions are automatically regenerated.
+The import directory is either the directory \emph{import} in your working directory.
+Or you can set a system wide import directory by defining the shell variable |PAGELAYOUT_IMPORT_DIRECTORY|.
+\par
+\DescribeMacro{\preflight}
+Use the |\preflight| macro to proof the image resolution.
+If images have a final resolution less then 300 ppi you get a warning, if less then 200 ppi you get an error.
+With preflight enabled the maximum possible resolution is shown next to each graphic.
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/doc/quickstart-1.svg b/macros/latex/contrib/pagelayout/doc/quickstart-1.svg
new file mode 100644
index 0000000000..f21a2f9710
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/quickstart-1.svg
@@ -0,0 +1 @@
+<svg width="320" height="239" viewBox="0 0 240 179.25" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><symbol overflow="visible" id="a"><path style="stroke:none" d="M.14-4.563h3.485v.532H2.187V0h-.609v-4.031H.141zm0 0"/></symbol><symbol overflow="visible" id="b"><path style="stroke:none" d="M3.203-2.125V0h-.562v-2.125c0-.3-.059-.523-.172-.672-.106-.144-.274-.219-.5-.219-.262 0-.465.094-.61.282-.136.187-.203.453-.203.796V0H.594v-4.75h.562v1.844a1.03 1.03 0 0 1 .407-.438c.164-.101.367-.156.609-.156.344 0 .598.117.765.344.176.23.266.574.266 1.031zm0 0"/></symbol><symbol overflow="visible" id="c"><path style="stroke:none" d="M.969-3.406h1.437v2.969h1.11V0H.719v-.438h1.125v-2.53H.969zm.875-1.328h.562v.703h-.562zm0 0"/></symbol><symbol overflow="visible" id="d"><path style="stroke:none" d="M2.969-3.297v.547a1.853 1.853 0 0 0-.485-.203 1.731 1.731 0 0 0-.5-.078c-.25 0-.437.043-.562.125a.427.427 0 0 0-.188.375c0 .156.047.273.141.344.094.074.32.148.688.218l.234.047c.281.055.488.156.625.313.144.156.219.367.219.625 0 .336-.121.601-.36.796-.242.188-.574.282-1 .282-.168 0-.343-.024-.531-.063a3.437 3.437 0 0 1-.594-.156v-.578c.207.105.406.187.594.25.188.055.367.078.547.078.25 0 .441-.05.578-.156a.505.505 0 0 0 .203-.422c0-.258-.25-.442-.75-.547h-.031l-.203-.047c-.324-.062-.563-.164-.719-.312-.148-.157-.219-.36-.219-.61 0-.332.11-.586.328-.765.227-.176.547-.266.954-.266.187 0 .363.016.53.047.165.031.333.086.5.156zm0 0"/></symbol><symbol overflow="visible" id="e"><path style="stroke:none" d="M1.875-4.39v.968h1.281v.438H1.875v1.859c0 .25.047.43.14.531.094.094.258.14.5.14h.641V0H2.47c-.43 0-.73-.082-.906-.25-.168-.164-.25-.457-.25-.875v-1.86H.405v-.437h.906v-.969zm0 0"/></symbol><symbol overflow="visible" id="f"><path style="stroke:none" d="M3.422-1.984v.265H.984v.016c-.011.469.079.808.266 1.016.195.199.473.296.828.296.176 0 .363-.023.563-.078.195-.062.406-.148.625-.265v.562a3.72 3.72 0 0 1-.625.188c-.2.05-.391.078-.579.078-.53 0-.949-.157-1.25-.469C.52-.695.376-1.141.376-1.703c0-.55.145-.988.438-1.313.289-.32.68-.484 1.171-.484.438 0 .782.152 1.032.453.25.293.382.649.406 1.063zm-.563-.172a1.14 1.14 0 0 0-.265-.61c-.149-.175-.356-.265-.625-.265a.879.879 0 0 0-.672.281.943.943 0 0 0-.297.594Zm0 0"/></symbol><symbol overflow="visible" id="g"><path style="stroke:none" d="m3.406-3.422-1.219 1.64L3.532 0h-.656l-1-1.375L.875 0h-.64l1.343-1.781-1.234-1.64h.625l.906 1.233.906-1.234Zm0 0"/></symbol><symbol overflow="visible" id="h"><path style="stroke:none" d="M3.25-4.75v.469h-.64c-.212 0-.356.043-.438.125-.074.086-.11.23-.11.437v.297H3.25v.438H2.062V0H1.5v-2.984H.594v-.438H1.5v-.234c0-.375.082-.649.25-.828.176-.176.445-.266.813-.266Zm0 0"/></symbol><symbol overflow="visible" id="i"><path style="stroke:none" d="M2.188-1.234c0 .25.046.445.14.578.094.125.235.187.422.187h.656V0h-.719c-.335 0-.593-.102-.78-.313-.188-.218-.282-.523-.282-.921v-3.094h-.89v-.438h1.453Zm0 0"/></symbol><symbol overflow="visible" id="j"><path style="stroke:none" d="M3.531-2.719a1.364 1.364 0 0 0-.375-.203 1.361 1.361 0 0 0-.406-.062c-.355 0-.625.109-.813.328-.18.219-.265.539-.265.953V0h-.563v-3.422h.563v.672c.094-.238.234-.422.422-.547a1.22 1.22 0 0 1 .703-.203c.133 0 .258.023.375.063.125.03.242.085.36.156zm0 0"/></symbol><symbol overflow="visible" id="k"><path style="stroke:none" d="M1.14-.438v1.735H.579v-4.719h.563v.438a.961.961 0 0 1 .375-.375c.156-.094.336-.141.546-.141.407 0 .723.164.954.484.238.313.359.758.359 1.329 0 .554-.121.992-.36 1.312-.23.313-.546.469-.953.469-.21 0-.39-.043-.546-.125a.996.996 0 0 1-.375-.406zm1.657-1.265c0-.438-.074-.766-.219-.984a.67.67 0 0 0-.61-.344.7.7 0 0 0-.624.344c-.137.218-.203.546-.203.984 0 .43.066.758.203.984a.702.702 0 0 0 .625.328c.27 0 .472-.109.61-.328.144-.219.218-.547.218-.984zm0 0"/></symbol><symbol overflow="visible" id="l"><path style="stroke:none" d="M2.14-1.719h-.187c-.324 0-.57.059-.734.172-.168.117-.25.29-.25.516 0 .21.062.37.187.484.125.117.297.172.516.172.312 0 .555-.11.734-.328.176-.219.266-.516.266-.89v-.126zm1.094-.234V0h-.562v-.5c-.125.2-.281.352-.469.453a1.4 1.4 0 0 1-.656.14c-.344 0-.621-.097-.828-.296C.508-.398.406-.664.406-1c0-.375.125-.66.375-.86.258-.195.633-.296 1.125-.296h.766v-.094c0-.27-.074-.469-.219-.594-.137-.125-.351-.187-.64-.187-.2 0-.399.031-.594.094a2.867 2.867 0 0 0-.563.234v-.563a6.11 6.11 0 0 1 .594-.171c.188-.04.375-.063.563-.063.28 0 .519.043.718.125.196.086.36.21.485.375a.92.92 0 0 1 .171.375c.032.148.047.371.047.672zm0 0"/></symbol><symbol overflow="visible" id="m"><path style="stroke:none" d="M3.234-.172a1.732 1.732 0 0 1-.468.188c-.157.05-.32.078-.485.078-.531 0-.949-.157-1.25-.469-.293-.32-.437-.766-.437-1.328 0-.563.144-1 .437-1.313.301-.32.719-.484 1.25-.484.164 0 .328.023.485.063.156.042.312.109.468.203v.578a1.665 1.665 0 0 0-.453-.281 1.268 1.268 0 0 0-.5-.094c-.355 0-.625.117-.812.344-.188.23-.282.558-.282.984 0 .418.094.742.282.969.195.23.468.343.812.343.196 0 .375-.023.531-.078.157-.062.297-.156.422-.281Zm0 0"/></symbol><symbol overflow="visible" id="n"><path style="stroke:none" d="M.313-2.203h3.234v.515H.312Zm0 0"/></symbol><symbol overflow="visible" id="o"><path style="stroke:none" d="M1.875-3.031a.716.716 0 0 0-.64.344c-.15.218-.22.546-.22.984 0 .43.07.758.22.984.144.219.359.328.64.328.29 0 .508-.109.656-.328.145-.226.219-.554.219-.984 0-.438-.074-.766-.219-.984a.738.738 0 0 0-.656-.344Zm0-.469c.477 0 .844.156 1.094.469.25.304.375.746.375 1.328 0 .586-.125 1.031-.375 1.344-.25.304-.617.453-1.094.453-.469 0-.828-.149-1.078-.453-.25-.313-.375-.758-.375-1.344 0-.582.125-1.024.375-1.328.25-.313.61-.469 1.078-.469Zm0 0"/></symbol><symbol overflow="visible" id="p"><path style="stroke:none" d="M2.625-2.984V-4.75h.563V0h-.563v-.438a.996.996 0 0 1-.375.407c-.156.082-.34.125-.547.125-.406 0-.73-.16-.969-.485C.492-.71.375-1.156.375-1.719c0-.55.117-.984.36-1.297a1.15 1.15 0 0 1 .968-.484 1.046 1.046 0 0 1 .922.516zM.969-1.704c0 .438.066.766.203.985.133.219.336.328.61.328a.71.71 0 0 0 .624-.328c.145-.226.219-.554.219-.984 0-.438-.074-.766-.219-.984a.708.708 0 0 0-.625-.344.662.662 0 0 0-.61.344c-.136.218-.202.546-.202.984zm0 0"/></symbol><symbol overflow="visible" id="q"><path style="stroke:none" d="M1.188-1.234h1.078V0H1.187Zm0 0"/></symbol><symbol overflow="visible" id="r"><path style="stroke:none" d="M5.984-3.578h8.672V0H1.578v-3.469l2.219-2.344C6.41-8.601 8-10.316 8.562-10.953c.688-.79 1.18-1.492 1.485-2.11.3-.613.453-1.218.453-1.812 0-.914-.277-1.625-.828-2.125-.555-.5-1.34-.75-2.36-.75-.73 0-1.546.148-2.453.438-.906.28-1.851.699-2.828 1.25v-3.797a20.224 20.224 0 0 1 2.875-.813 13.977 13.977 0 0 1 2.719-.281c2.176 0 3.883.512 5.125 1.531 1.25 1.012 1.875 2.39 1.875 4.14A6.37 6.37 0 0 1 14.219-13c-.274.71-.735 1.496-1.39 2.36-.493.624-1.829 2.03-4.017 4.218a517.956 517.956 0 0 0-2.828 2.844zm0 0"/></symbol></defs><path style="fill:#fff;stroke-width:1.43381" d="M4.065.004h231.869a4.056 4.056 0 0 1 4.065 4.065v170.906a4.056 4.056 0 0 1-4.065 4.064H4.064A4.056 4.056 0 0 1 0 174.975V4.07A4.056 4.056 0 0 1 4.065.004Z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 179.037v-.203h239.999v.203zm0-4.06v-.204h239.999v.204zm0-4.066v-.204h239.999v.204zm0-4.068v-.2h239.999v.2zm0-4.058v-.205h239.999v.204zm0-4.066v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.061v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.06v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.06V126h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.069v-.2h239.999v.2zm0-4.06v-.201h239.999v.2zm0-4.067v-.2h239.999v.2zm0-4.066v-.2h239.999v.2zm0-4.058v-.205h239.999v.205zm0-4.069v-.2h239.999v.2zm0-4.066v-.2h239.999v.2zm0-4.066v-.201h239.999v.2zm0-4.058v-.204h239.999v.204zm0-4.07v-.2h239.999v.2zm0-4.063v-.2h239.999v.2zm0-4.06v-.204h239.999v.204ZM0 69.3v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.06v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.066v-.204h239.999v.204zm0-4.06v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.066v-.204h239.999v.204zm0-4.06v-.204h239.999v.203zm0-4.066v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.06v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.06v-.206h239.999v.205zm0-4.067V8.13h239.999v.205zM0 4.27v-.205h239.999v.205zM0 .21V.003h239.999V.21z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 179.035V0h.2v179.033zm4.065 0V0h.2v179.033zm4.06 0V0h.2v179.033zm4.065 0V0h.202v179.033zm4.066 0V0h.202v179.033zm4.06 0V0h.203v179.033zm4.067 0V0h.202v179.033zm4.066 0V0h.203v179.033zm4.061 0V0h.202v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.205v179.033zm4.06 0V0h.2v179.033zm4.066 0V0h.205v179.033zm4.067 0V0h.205v179.033zm4.06 0V0h.205v179.033zm4.067 0V0h.205v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.208v179.033h-.2Zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.061 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.204v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.203v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.065 0V0h.202v179.033zm4.057 0V0h.205v179.033zm4.07 0V0h.202v179.033zm4.066 0V0h.202v179.033zm4.06 0V0h.203v179.033zm4.064 0V0h.205v179.033zm4.069 0V0h.205v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.205v179.033zm4.063 0V0h.205v179.033zm4.064 0V0h.205v179.033zm4.066 0V0h.205v179.033zm4.066 0V0h.201v179.033zm4.06 0V0h.202v179.033zm4.067 0V0h.205v179.033zm4.066 0V0h.201v179.033zm4.061 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.208v179.033h-.2zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033z"/><path style="fill:#000;stroke-width:1.43381" d="M7.94.004v4.163h.57V.004zm223.546 0v4.163h.572V.004ZM0 7.946v.57h4.164v-.568H0Zm235.833 0v.57H240v-.568h-4.167zM0 170.525v.57h4.164v-.572H0Zm235.833 0v.57H240v-.572h-4.168zm-227.896 4.35v4.164h.571v-4.164zm223.546 0v4.164h.572v-4.164h-.57z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 170.91v-.203h239.999v.204zm0-20.318v-.205h239.999v.205zm0-20.326v-.205h239.999v.205zm0-20.323v-.2h239.999v.2zm0-20.325v-.201h239.999v.2zM0 69.3v-.204h239.999v.204zm0-20.32v-.204h239.999v.204zm0-20.325v-.205h239.999v.205zm0-20.32V8.13h239.999v.205z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M8.125 179.035V0h.2v179.033zm20.324 0V0h.203v179.033zm20.32 0V0h.205v179.033zm20.32 0V0h.208v179.033h-.2Zm20.326 0V0h.2v179.033zm20.32 0V0h.204v179.033zm20.326 0V0h.2v179.033zm20.318 0V0h.203v179.033zm20.32 0V0h.201v179.033zm20.326 0V0h.201v179.033zm20.32 0V0h.201v179.033zm20.32 0V0h.208v179.033h-.2z"/><use xlink:href="#a" x="19.654" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#b" x="23.431" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#c" x="27.208" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#d" x="30.984" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#e" x="38.644" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#f" x="42.421" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#g" x="46.198" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#e" x="49.981" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#h" x="57.635" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#c" x="61.412" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#i" x="65.195" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#i" x="68.971" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#d" x="72.748" y="38.799" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#e" x="19.842" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#b" x="23.619" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#f" x="27.396" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#h" x="34.018" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#c" x="37.794" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#j" x="41.571" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#d" x="45.348" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#e" x="49.131" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#k" x="55.747" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#i" x="59.524" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#l" x="63.3" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#m" x="67.083" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#f" x="70.86" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#n" x="74.637" y="47.366" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#b" x="19.842" y="55.934" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#o" x="23.619" y="55.934" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#i" x="27.396" y="55.934" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#p" x="31.172" y="55.934" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#f" x="34.956" y="55.934" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#j" x="38.732" y="55.934" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><use xlink:href="#q" x="42.509" y="55.934" width="100%" height="100%" style="fill:#000;fill-opacity:1" transform="translate(.102 .102) scale(1.43381)"/><path style="fill:#b3e6fa;fill-opacity:.3;fill-rule:nonzero;stroke:#66ccf5;stroke-width:.28346;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:.3" d="M.002.002v56.691h56.691V.002Zm0 0" transform="matrix(1.43381 0 0 -1.43381 130.162 130.156)"/><use xlink:href="#r" x="110.523" y="72.878" width="100%" height="100%" style="fill:#66ccf5;fill-opacity:.3" transform="translate(.102 .102) scale(1.43381)"/></svg> \ No newline at end of file
diff --git a/macros/latex/contrib/pagelayout/doc/quickstart-2.svg b/macros/latex/contrib/pagelayout/doc/quickstart-2.svg
new file mode 100644
index 0000000000..6f865a348a
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/quickstart-2.svg
@@ -0,0 +1 @@
+<svg width="320" height="239" viewBox="0 0 240 179.25" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><symbol overflow="visible" id="a"><path style="stroke:none" d="M2.078-2.875h3.64v-10.688l-3.39.844v-2.937l3.406-.813h3.141v13.594h3.64V0H2.079zm0 0"/></symbol></defs><path style="fill:#fff;stroke-width:1.43381" d="M4.065.004h231.869a4.056 4.056 0 0 1 4.065 4.065v170.906a4.056 4.056 0 0 1-4.065 4.064H4.064A4.056 4.056 0 0 1 0 174.975V4.07A4.056 4.056 0 0 1 4.065.004Z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 179.037v-.203h239.999v.203zm0-4.06v-.204h239.999v.204zm0-4.066v-.204h239.999v.204zm0-4.068v-.2h239.999v.2zm0-4.058v-.205h239.999v.204zm0-4.066v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.061v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.06v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.06V126h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.069v-.2h239.999v.2zm0-4.06v-.201h239.999v.2zm0-4.067v-.2h239.999v.2zm0-4.066v-.2h239.999v.2zm0-4.058v-.205h239.999v.205zm0-4.069v-.2h239.999v.2zm0-4.066v-.2h239.999v.2zm0-4.066v-.201h239.999v.2zm0-4.058v-.204h239.999v.204zm0-4.07v-.2h239.999v.2zm0-4.063v-.2h239.999v.2zm0-4.06v-.204h239.999v.204ZM0 69.3v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.06v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.066v-.204h239.999v.204zm0-4.06v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.066v-.204h239.999v.204zm0-4.06v-.204h239.999v.203zm0-4.066v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.06v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.06v-.206h239.999v.205zm0-4.067V8.13h239.999v.205zM0 4.27v-.205h239.999v.205zM0 .21V.003h239.999V.21z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 179.035V0h.2v179.033zm4.065 0V0h.2v179.033zm4.06 0V0h.2v179.033zm4.065 0V0h.202v179.033zm4.066 0V0h.202v179.033zm4.06 0V0h.203v179.033zm4.067 0V0h.202v179.033zm4.066 0V0h.203v179.033zm4.061 0V0h.202v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.205v179.033zm4.06 0V0h.2v179.033zm4.066 0V0h.205v179.033zm4.067 0V0h.205v179.033zm4.06 0V0h.205v179.033zm4.067 0V0h.205v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.208v179.033h-.2Zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.061 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.204v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.203v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.065 0V0h.202v179.033zm4.057 0V0h.205v179.033zm4.07 0V0h.202v179.033zm4.066 0V0h.202v179.033zm4.06 0V0h.203v179.033zm4.064 0V0h.205v179.033zm4.069 0V0h.205v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.205v179.033zm4.063 0V0h.205v179.033zm4.064 0V0h.205v179.033zm4.066 0V0h.205v179.033zm4.066 0V0h.201v179.033zm4.06 0V0h.202v179.033zm4.067 0V0h.205v179.033zm4.066 0V0h.201v179.033zm4.061 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.208v179.033h-.2zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033z"/><path style="fill:#000;stroke-width:1.43381" d="M7.94.004v4.163h.57V.004zm223.546 0v4.163h.572V.004ZM0 7.946v.57h4.164v-.568H0Zm235.833 0v.57H240v-.568h-4.167zM0 170.525v.57h4.164v-.572H0Zm235.833 0v.57H240v-.572h-4.168zm-227.896 4.35v4.164h.571v-4.164zm223.546 0v4.164h.572v-4.164h-.57z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 170.91v-.203h239.999v.204zm0-20.318v-.205h239.999v.205zm0-20.326v-.205h239.999v.205zm0-20.323v-.2h239.999v.2zm0-20.325v-.201h239.999v.2zM0 69.3v-.204h239.999v.204zm0-20.32v-.204h239.999v.204zm0-20.325v-.205h239.999v.205zm0-20.32V8.13h239.999v.205z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M8.125 179.035V0h.2v179.033zm20.324 0V0h.203v179.033zm20.32 0V0h.205v179.033zm20.32 0V0h.208v179.033h-.2Zm20.326 0V0h.2v179.033zm20.32 0V0h.204v179.033zm20.326 0V0h.2v179.033zm20.318 0V0h.203v179.033zm20.32 0V0h.201v179.033zm20.326 0V0h.201v179.033zm20.32 0V0h.201v179.033zm20.32 0V0h.208v179.033h-.2z"/><path style="fill:#b3e6fa;fill-opacity:.3;fill-rule:nonzero;stroke:#66ccf5;stroke-width:.28346;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:.3" d="M.002 0v45.355h68.031V0Zm0 0" transform="matrix(1.43382 0 0 -1.43382 28.552 122.026)"/><use xlink:href="#a" x="47.032" y="70.624" width="100%" height="100%" style="fill:#66ccf5;fill-opacity:.3" transform="translate(.102 .102) scale(1.43382)"/><path style="fill:none;stroke:#00e300;stroke-width:14.1734;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:.2" d="M94.96 85.04V39.685" transform="matrix(1.43382 0 0 -1.43382 .102 178.927)"/><path style="fill:none;stroke:#00e300;stroke-width:.56693;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:.8" d="M19.844 85.04V39.685h127.558V85.04zm0 0" transform="matrix(1.43382 0 0 -1.43382 .102 178.927)"/><path style="fill:none;stroke:#00e300;stroke-width:.56693;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:2.83466,2.83466;stroke-opacity:.8" d="M19.844 85.04v19.844h127.558V85.04M19.844 39.685V19.84h127.558v19.844" transform="matrix(1.43382 0 0 -1.43382 .102 178.927)"/></svg> \ No newline at end of file
diff --git a/macros/latex/contrib/pagelayout/doc/quickstart-3.svg b/macros/latex/contrib/pagelayout/doc/quickstart-3.svg
new file mode 100644
index 0000000000..15bf2ea4b6
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/quickstart-3.svg
@@ -0,0 +1 @@
+<svg width="320" height="239" viewBox="0 0 240 179.25" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><symbol overflow="visible" id="k"><path style="stroke:none" d="M1.328-.797H3.25V0H.344v-.766l.5-.515c.57-.625.922-1.004 1.047-1.14.156-.177.265-.333.328-.47.07-.132.11-.27.11-.406a.612.612 0 0 0-.188-.469c-.125-.113-.297-.171-.516-.171-.168 0-.352.039-.547.109-.2.062-.406.152-.625.265v-.828a4.25 4.25 0 0 1 .64-.187c.208-.04.407-.063.595-.063.476 0 .851.118 1.125.344.28.219.421.527.421.922 0 .18-.03.344-.093.5a1.891 1.891 0 0 1-.297.516c-.117.136-.414.449-.89.937l-.626.625zm0 0"/></symbol><symbol overflow="visible" id="l"><path style="stroke:none" d="M.406-4.563h2.89v.641L1.75 0H.828l1.485-3.766H.405Zm0 0"/></symbol><symbol overflow="visible" id="m"><path style="stroke:none" d="M.578-.797h1V-3.75l-.937.234v-.812l.953-.234h.86v3.765h1.015V0H.579Zm0 0"/></symbol><symbol overflow="visible" id="n"><path style="stroke:none" d="M1.344-.484v1.78h-.89v-4.718h.89v.516A.994.994 0 0 1 2.25-3.5c.395 0 .695.156.906.469.219.312.328.758.328 1.328 0 .574-.109 1.016-.328 1.328-.219.313-.531.469-.937.469a.868.868 0 0 1-.485-.14 1.386 1.386 0 0 1-.39-.438zm1.25-1.235c0-.32-.059-.578-.172-.765-.106-.188-.258-.282-.453-.282-.188 0-.34.094-.453.282-.118.187-.172.445-.172.765 0 .336.054.594.172.782.113.187.265.28.453.28.195 0 .347-.093.453-.28.113-.188.172-.446.172-.782Zm0 0"/></symbol><symbol overflow="visible" id="o"><path style="stroke:none" d="M.672-3.422h1.765v2.735h1.126V0H.437v-.688h1.11v-2.046H.672zm.875-1.656h.89v1.047h-.89Zm0 0"/></symbol><clipPath id="g"><path d="M0 0h167.238v124.719H0Zm0 0"/></clipPath><clipPath id="d"><path d="M26.762 5.477h113.742v113.742H26.762Zm0 0"/></clipPath><clipPath id="c"><path d="M0 0h168v125H0z"/></clipPath><image id="b" width="952" height="952" xlink:href="data:image/png;base64,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"/><image id="e" width="952" height="952" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7gAAAO4CAIAAAB3W80MAAAABmJLR0QA/wD/AP+gvaeTAAAKYklEQVR4nO3BgQAAAADDoPlTn+AGVQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAN4LfAAHBu5hPAAAAAElFTkSuQmCC"/><image id="j" width="614" height="614" xlink:href="data:image/jpeg;base64,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"/><mask id="i"><g filter="url(#a)"><path style="fill:#000;fill-opacity:.4;stroke:none" d="M0 0h167.24v124.72H0z"/></g></mask><mask id="f"><use xlink:href="#b" width="100%" height="100%"/></mask><filter id="a" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1"><feColorMatrix in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/></filter><g clip-path="url(#d)" id="h"><use xlink:href="#e" mask="url(#f)" transform="translate(26.764 5.479) scale(.11947)" width="100%" height="100%"/></g></defs><path style="fill:#fff;stroke-width:1.43381" d="M4.065.004h231.869a4.056 4.056 0 0 1 4.065 4.065v170.906a4.056 4.056 0 0 1-4.065 4.064H4.064A4.056 4.056 0 0 1 0 174.975V4.07A4.056 4.056 0 0 1 4.065.004Z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 179.037v-.203h239.999v.203zm0-4.06v-.204h239.999v.204zm0-4.066v-.204h239.999v.204zm0-4.068v-.2h239.999v.2zm0-4.058v-.205h239.999v.204zm0-4.066v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.061v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.06v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.06V126h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.069v-.2h239.999v.2zm0-4.06v-.201h239.999v.2zm0-4.067v-.2h239.999v.2zm0-4.066v-.2h239.999v.2zm0-4.058v-.205h239.999v.205zm0-4.069v-.2h239.999v.2zm0-4.066v-.2h239.999v.2zm0-4.066v-.201h239.999v.2zm0-4.058v-.204h239.999v.204zm0-4.07v-.2h239.999v.2zm0-4.063v-.2h239.999v.2zm0-4.06v-.204h239.999v.204ZM0 69.3v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.06v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.066v-.204h239.999v.204zm0-4.06v-.204h239.999v.204zm0-4.067v-.203h239.999v.203zm0-4.066v-.204h239.999v.204zm0-4.06v-.204h239.999v.203zm0-4.066v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.06v-.205h239.999v.205zm0-4.067v-.205h239.999v.205zm0-4.066v-.205h239.999v.205zm0-4.06v-.206h239.999v.205zm0-4.067V8.13h239.999v.205zM0 4.27v-.205h239.999v.205zM0 .21V.003h239.999V.21z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 179.035V0h.2v179.033zm4.065 0V0h.2v179.033zm4.06 0V0h.2v179.033zm4.065 0V0h.202v179.033zm4.066 0V0h.202v179.033zm4.06 0V0h.203v179.033zm4.067 0V0h.202v179.033zm4.066 0V0h.203v179.033zm4.061 0V0h.202v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.205v179.033zm4.06 0V0h.2v179.033zm4.066 0V0h.205v179.033zm4.067 0V0h.205v179.033zm4.06 0V0h.205v179.033zm4.067 0V0h.205v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.208v179.033h-.2Zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.061 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.204v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.203v179.033zm4.066 0V0h.2v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.065 0V0h.202v179.033zm4.057 0V0h.205v179.033zm4.07 0V0h.202v179.033zm4.066 0V0h.202v179.033zm4.06 0V0h.203v179.033zm4.064 0V0h.205v179.033zm4.069 0V0h.205v179.033zm4.06 0V0h.201v179.033zm4.067 0V0h.205v179.033zm4.063 0V0h.205v179.033zm4.064 0V0h.205v179.033zm4.066 0V0h.205v179.033zm4.066 0V0h.201v179.033zm4.06 0V0h.202v179.033zm4.067 0V0h.205v179.033zm4.066 0V0h.201v179.033zm4.061 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.2v179.033zm4.066 0V0h.201v179.033zm4.067 0V0h.2v179.033zm4.06 0V0h.208v179.033h-.2zm4.067 0V0h.2v179.033zm4.066 0V0h.2v179.033z"/><path style="fill:#000;stroke-width:1.43381" d="M7.94.004v4.163h.57V.004zm223.546 0v4.163h.572V.004ZM0 7.946v.57h4.164v-.568H0Zm235.833 0v.57H240v-.568h-4.167zM0 170.525v.57h4.164v-.572H0Zm235.833 0v.57H240v-.572h-4.168zm-227.896 4.35v4.164h.571v-4.164zm223.546 0v4.164h.572v-4.164h-.57z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M0 170.91v-.203h239.999v.204zm0-20.318v-.205h239.999v.205zm0-20.326v-.205h239.999v.205zm0-20.323v-.2h239.999v.2zm0-20.325v-.201h239.999v.2zM0 69.3v-.204h239.999v.204zm0-20.32v-.204h239.999v.204zm0-20.325v-.205h239.999v.205zm0-20.32V8.13h239.999v.205z"/><path style="fill:#a6a6a6;fill-opacity:.2;stroke-width:1.43381" d="M8.125 179.035V0h.2v179.033zm20.324 0V0h.203v179.033zm20.32 0V0h.205v179.033zm20.32 0V0h.208v179.033h-.2Zm20.326 0V0h.2v179.033zm20.32 0V0h.204v179.033zm20.326 0V0h.2v179.033zm20.318 0V0h.203v179.033zm20.32 0V0h.201v179.033zm20.326 0V0h.201v179.033zm20.32 0V0h.201v179.033zm20.32 0V0h.208v179.033h-.2z"/><g transform="translate(.102 .102) scale(1.43382)"><g clip-path="url(#g)"><use xlink:href="#h" mask="url(#i)" width="100%" height="100%"/></g><path style="color:#000;fill:#fff;stroke-miterlimit:10;-inkscape-stroke:none" d="M-5.67-5.668v85.039h85.041V-5.668Z" transform="matrix(1 0 0 -1 46.772 99.209)"/><use xlink:href="#j" transform="translate(46.772 25.509) scale(.12003)" width="100%" height="100%"/><path style="fill:#fff000;fill-opacity:.9;fill-rule:nonzero;stroke:none" d="M93.617 36.102h26.856V25.508H93.617Zm0 0"/><use xlink:href="#k" x="95.707" y="32.703" width="100%" height="100%" style="fill:#000;fill-opacity:.9"/><use xlink:href="#l" x="99.484" y="32.703" width="100%" height="100%" style="fill:#000;fill-opacity:.9"/><use xlink:href="#m" x="103.261" y="32.703" width="100%" height="100%" style="fill:#000;fill-opacity:.9"/><use xlink:href="#n" x="107.037" y="32.703" width="100%" height="100%" style="fill:#000;fill-opacity:.9"/><use xlink:href="#n" x="110.82" y="32.703" width="100%" height="100%" style="fill:#000;fill-opacity:.9"/><use xlink:href="#o" x="114.597" y="32.703" width="100%" height="100%" style="fill:#000;fill-opacity:.9"/></g></svg> \ No newline at end of file
diff --git a/macros/latex/contrib/pagelayout/doc/quickstart.pdf b/macros/latex/contrib/pagelayout/doc/quickstart.pdf
new file mode 100644
index 0000000000..9fe5b29071
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/quickstart.pdf
Binary files differ
diff --git a/macros/latex/contrib/pagelayout/doc/quickstart.tex b/macros/latex/contrib/pagelayout/doc/quickstart.tex
new file mode 100644
index 0000000000..095c98d288
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/doc/quickstart.tex
@@ -0,0 +1,62 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\documentclass[draft,graphpaper,preflight,optimize={density=600}]{pagelayout}
+\usepackage{microtype}
+\usepackage{fontspec}
+
+\setmainfont{Menlo}
+
+\pagewidth=5.5cm
+\pageheight=4cm
+\margin=5mm
+\gutter=5mm
+\bleed=2mm
+
+\begin{document}
+ \fontsize{6.3pt}{8.6pt}\selectfont
+
+ % generic template
+ \template{ss}{
+ \text{
+ This text fills the first placeholder.
+ }
+ }
+
+ % custom template
+ \grid
+ \newtemplate{my template}{
+ \setgrid{
+ {[2]{3!}{2!}}
+ }
+ \placeholder{0 0 1 1}
+ }
+ \template{my template}{}
+ \nogrid
+
+ % graphics
+ \newborder{my border}{width=2mm, color=white, radius=5mm}
+ \newshadow{my shadow}{size=8}
+ \template[margin=7mm]{s}{
+ \graphic[
+ scale=1.05,
+ hpos=0,
+ vpos=0,
+ shadow=my shadow,
+ border=my border,
+ border radius=0mm
+ ]{kopi}
+ }
+
+\end{document}
diff --git a/macros/latex/contrib/pagelayout/scripts/pagelayoutapi b/macros/latex/contrib/pagelayout/scripts/pagelayoutapi
new file mode 100755
index 0000000000..295beef2f4
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/scripts/pagelayoutapi
@@ -0,0 +1,371 @@
+#!/bin/sh
+#
+# Copyright (c) 2022-2023 by Friedemann Bartels
+#
+# This file may be distributed and/or modified under the
+# conditions of the LaTeX Project Public License, either
+# version 1.3c of this license or (at your option) any later
+# version. The latest version of this license is in:
+#
+# http://www.latex-project.org/lppl.txt
+#
+# and version 1.3c or later is part of all distributions of
+# LaTeX version 2008/05/04 or later.
+#
+
+version=1.0.3
+
+_convert() {
+ turbo=$1
+ filename=$2
+ filenamecache=$3
+ fileextcache=$4
+ originalwidthsp=$5
+ originalheightsp=$6
+ originalcropleftsp=$7
+ originalcroprightsp=$8
+ originalcroptopsp=$9
+ originalcropbottomsp=${10}
+ density=${11}
+ displaywidth=${12}
+ displayheight=${13}
+ resizethreshold=${14}
+ unsharp=${15}
+ quality="${16}"
+
+ mkdir -p cache/"$filenamecache"
+ originalwidth=$( magick identify -ping -format %w "$filename" )
+ originalheight=$( magick identify -ping -format %h "$filename" )
+ width=$(( (10 * originalwidth * (originalwidthsp - originalcropleftsp - originalcroprightsp) / originalwidthsp + 5) / 10 ))
+ height=$(( (10 * originalheight * (originalheightsp - originalcroptopsp - originalcropbottomsp) / originalheightsp + 5) / 10 ))
+ cropleft=$(( (10 * originalwidth * originalcropleftsp / originalwidthsp + 5) / 10 ))
+ croptop=$(( (10 * originalheight * originalcroptopsp / originalheightsp + 5) / 10 ))
+ resizewidth=$(( (10 * displaywidth * 100 * density / 473628672 + 5) / 10 ))
+ if [ $(( resizewidth * resizethreshold / 100 )) -gt $width ]; then
+ resizewidth=$width
+ resizeheight=$height
+ else
+ resizeheight=$(( resizewidth * height / width + 1 ))
+ fi
+
+ x="x"
+ if [ $turbo = 1 ]; then
+ export MAGICK_THREAD_LIMIT=1
+ fi
+ if [ "$quality" != "" ]; then
+ quality="-quality $quality"
+ fi
+ if [ "$unsharp" != "" ]; then
+ unsharp="-unsharp $unsharp"
+ fi
+
+ magick "$filename" -crop $width$x$height+$cropleft+$croptop -resize $resizewidth$x$resizeheight $unsharp $quality "cache/$filenamecache/.g$fileextcache"
+ mv "cache/$filenamecache/.g$fileextcache" "cache/$filenamecache/g$fileextcache"
+}
+
+_startbatchprocess() {
+ success=0
+ for file in cache/*; do
+ if [ -f "$file" ]; then
+ success=1
+ name=$( basename "${file}" )
+ mv "$file" "cache/.$name" 2> /dev/null
+ if [ $? -eq 0 ]; then
+ line=$(head -n 1 "cache/.$name")
+
+ IFS="%"
+ set -- $line
+ IFS=" "
+ _convert 1 "$@"
+
+ rm "cache/.$name"
+ break
+ fi
+ fi
+ done
+
+ if [ $success -eq 1 ]; then
+ _startbatchprocess
+ fi
+}
+
+getwidth() {
+ if command -v magick >/dev/null 2>&1; then
+ filename=$1
+
+ originalwidth=$( magick identify -ping -format %w "$filename" )
+ echo $originalwidth
+ else
+ echo errormagicknotinstalled
+ fi
+}
+
+optimize() {
+ if command -v magick >/dev/null 2>&1; then
+ filenamecache=$2
+ fileextcache=$3
+
+ if [ -f cache/"$filenamecache" ]; then
+ mv cache/"$filenamecache" cache/."$filenamecache" 2> /dev/null
+ if [ $? -eq 0 ]; then
+ line=$(head -n 1 "cache/.$filenamecache")
+
+ IFS="%"
+ set -- $line
+ IFS=" "
+ _convert 1 "$@"
+
+ rm "cache/.$filenamecache"
+ else
+ while [ ! -f cache/"$filenamecache"/g"$fileextcache" ]; do
+ sleep 0.05
+ done
+ fi
+ elif [ -d cache/"$filenamecache" ]; then
+ while [ ! -f cache/"$filenamecache"/g"$fileextcache" ]; do
+ sleep 0.05
+ done
+ else
+ _convert 0 "$@"
+ fi
+
+ echo ok
+ else
+ echo errormagicknotinstalled
+ fi
+}
+
+makeshadow() {
+ if command -v magick >/dev/null 2>&1; then
+ filename=$1
+ stdDeviation=$2
+ opacity=$3
+ fill=$4
+ width=$5
+ height=$6
+ framewidth=$7
+ frameheight=$8
+ frameborder=$9
+ frameradius=${10}
+
+ [ ! -d cache ] && mkdir cache
+ mkdir -p cache/$filename
+ echo "<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+ <svg
+ width='$width'
+ height='$height'
+ version='1.1'
+ xmlns='http://www.w3.org/2000/svg'
+ xmlns:svg='http://www.w3.org/2000/svg'>
+ <defs>
+ <filter
+ style='color-interpolation-filters:sRGB'
+ id='blur'
+ x='-4'
+ y='-4'
+ width='8'
+ height='8'>
+ <feGaussianBlur
+ stdDeviation='$stdDeviation' />
+ </filter>
+ </defs>
+ <rect
+ style='filter:url(#blur);opacity:$opacity;fill:$fill'
+ width='$framewidth'
+ height='$frameheight'
+ x='$frameborder'
+ y='$frameborder'
+ rx='$frameradius'
+ ry='$frameradius' />
+ </svg>
+ " > cache/$filename/s.svg
+ inkscape cache/$filename/s.svg --export-dpi=600 --export-filename cache/$filename/s.pdf
+ rm cache/$filename/s.svg
+
+ echo ok
+ else
+ echo errorinkscapenotinstalled
+ fi
+}
+
+import() {
+ if [ -d import ]; then
+ importdir=import
+ elif [ "$PAGELAYOUT_IMPORT_DIRECTORY" != "" ]; then
+ if [ -d "$PAGELAYOUT_IMPORT_DIRECTORY" ]; then
+ importdir="$PAGELAYOUT_IMPORT_DIRECTORY"
+ else
+ echo $PAGELAYOUT_IMPORT_DIRECTORY
+ exit
+ fi
+ else
+ echo errornoimportdir
+ exit
+ fi
+
+ defaultdirectory=$( echo $1 | sed -e 's/^{//g' | sed -e 's/}{.*//g' )
+ directorylist=$( echo $1 | sed -e 's/^{//g' | sed -e 's/}$//g' | sed -e 's/}{/$/g' )
+
+ for entry in "$importdir"/*.*
+ do
+ if [ -f "$entry" ]; then
+ name=$( basename "${entry}" )
+ if [ "$directorylist" != "" ]; then
+ echo "$directorylist" | tr '$' '\n' | while read directory; do
+ if [ -f "$directory$name" ]; then
+ mv "$entry" "$directory"
+ fi
+ done
+ fi
+ if [ -f "$entry" ]; then
+ if [ -d "$defaultdirectory" ]; then
+ mv "$entry" "$defaultdirectory"
+ else
+ mv "$entry" .
+ fi
+ fi
+ cachename=$( echo "$name" | sed -e 's/\.[a-zA-Z]*$//g' )
+ rm -rf cache/"$cachename"*
+ fi
+ done
+}
+
+startturbo() {
+ file="$(echo $1 | sed -e 's/\.pdflatex$//g')"
+ if [ -f $file.tex ]; then
+ tmpdir=$( mktemp -d 2>/dev/null )/pagelayoutturbo$( date "+%Y%m%d%H%M%S" )$RANDOM
+ mkdir $tmpdir
+
+ cp $file.tex $tmpdir/pagelayoutturbobatchoptimizexyz.tex
+
+ command=$(echo $(ps -p $PPID -o command ))
+ engine=$(echo $command | sed -e 's/^[A-Z ]*//g' | sed -e 's/ .*//g' | tr -d '\n')
+
+ case "$command" in
+ *-shell-escape*)
+ shellescape="--shell-escape"
+ ;;
+ esac
+
+ if [ "$engine" = "xelatex" ]; then
+ nopdf="-no-pdf"
+ fi
+
+ $engine $shellescape -interaction=batchmode $nopdf --output-directory $tmpdir $tmpdir/pagelayoutturbobatchoptimizexyz.tex > /dev/null
+
+ rm -rf $tmpdir
+ fi
+}
+
+batchoptimize() {
+ [ ! -d cache ] && mkdir cache
+
+ length=$(( $# / 15 ))
+ cores=$( nproc )
+ [ $cores -gt $length ] && cores=$length
+
+ while [ $length -gt 0 ]; do
+ filenamecache="$2"
+
+ if [ ! -e cache/"$filenamecache" ]; then
+ index=0
+ while [ $index -lt 15 ]; do
+ if [ $index -eq 0 ]; then
+ item="$1"
+ else
+ item="$item%$1"
+ fi
+
+ shift
+ index=$(( index + 1 ))
+ done
+
+ echo $item > cache/"$filenamecache"
+ else
+ shift 15
+ fi
+
+ length=$(( length - 1 ))
+ done
+
+ cores=$(( cores - 1 ))
+ while [ $cores -gt 0 ]; do
+ _startbatchprocess &
+ sleep 0.01
+ cores=$(( cores - 1 ))
+ done
+}
+
+usage() {
+ cat <<HELP_USAGE
+usage: pagelayoutapi getwidth % FILE
+ pagelayoutapi optimize % FILE % FILENAME % EXTENSION % ORIGINALWIDTH
+ % ORIGINALHEIGHT % CROPLEFT % CROPRIGHT % CROPTOP % CROPBOTTOM
+ % DENSITY % WIDTH % HEIGHT % DOWNSAMPLETHRESHOLD % UNSHARP % QUALITY
+ pagelayoutapi makeshadow % FILENAME % STANDARDDEVIATION % OPACITY % COLOR
+ % WIDTH % HEIGHT % FRAMEWIDTH % FRAMEHEIGHT % MARGIN % BORDERRADIUS
+ pagelayoutapi start [% import % [GRAPHICSPATH]] [% turbo % JOBNAME]
+ pagelayoutapi batchoptimize % BATCHLIST
+
+ --help Prints a help message.
+ --version Prints version information.
+HELP_USAGE
+}
+
+version() {
+ echo pagelayoutapi $version
+}
+
+input=$( echo "$@" | sed -e 's/\\//g' | sed -e 's/ %/%/g' | sed -e 's/% /%/g' )
+IFS="%"
+set -- $input
+IFS=" "
+
+case "$1" in
+getwidth)
+ shift
+
+ getwidth "$1"
+ ;;
+optimize)
+ shift
+
+ optimize "$@"
+ ;;
+makeshadow)
+ shift
+
+ makeshadow "$@"
+ ;;
+start)
+ shift
+
+ if [ "$1" = "import" ]; then
+ shift
+
+ import "$1"
+
+ shift
+ fi
+
+ if [ "$1" = "turbo" ]; then
+ shift
+
+ startturbo "$1" &
+ fi
+
+ echo ok
+ ;;
+batchoptimize)
+ shift
+
+ batchoptimize "$@" &
+
+ echo ok
+ ;;
+--version)
+ version
+ ;;
+--help)
+ usage
+esac
diff --git a/macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1 b/macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1
new file mode 100644
index 0000000000..368e411ef7
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1
@@ -0,0 +1,125 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "PAGELAYOUTAPI" "1" "January 2023" "" ""
+.
+.SH "NAME"
+\fBpagelayoutapi\fR \- API for the pagelayout LaTeX class
+.
+.SH "SYNOPSIS"
+\fBpagelayoutapi getwidth\fR % FILE
+.
+.P
+\fBpagelayoutapi optimize\fR % FILE % FILENAME % EXTENSION % ORIGINALWIDTH % ORIGINALHEIGHT % CROPLEFT % CROPRIGHT % CROPTOP % CROPBOTTOM % DENSITY % WIDTH % HEIGHT % DOWNSAMPLETHRESHOLD % UNSHARP % QUALITY
+.
+.P
+\fBpagelayoutapi makeshadow\fR % FILENAME % STANDARDDEVIATION % OPACITY % COLOR % WIDTH % HEIGHT % FRAMEWIDTH % FRAMEHEIGHT % MARGIN % BORDERRADIUS
+.
+.P
+\fBpagelayoutapi start\fR [% import % [GRAPHICSPATH]] [% turbo % JOBNAME]
+.
+.P
+\fBpagelayoutapi batchoptimize\fR % BATCHLIST
+.
+.SH "DESCRIPTION"
+This script provides an API for the pagelayout LaTeX class\.
+.
+.TP
+\fBpagelayoutapi getwidth\fR
+Returns the width in pixels for the given image file\.
+.
+.TP
+\fBpagelayoutapi optimize\fR
+Creates a cropped, rezised, sharpend and compressed image and stores it in the cache directory\.
+.
+.TP
+\fBpagelayoutapi makeshadow\fR
+Creates a shadow image and stores it in the cache directory\.
+.
+.TP
+\fBpagelayoutapi start\fR
+The import parameter triggers the image import (see pagelayout\-manual\.pdf chapter "Image Optimization")\. Running the command with the parameter turbo, where the jobname is the filename of the document, processes the document in a special batch mode, that creates a batch list and calls the command \fBpagelayoutapi batchoptimize\fR\.
+.
+.TP
+\fBpagelayoutapi batchoptimize\fR
+Optimizes multiple images in parallel\.
+.
+.SH "OPTIONS"
+.
+.TP
+\fB\-\-help\fR
+Prints a help message\.
+.
+.TP
+\fB\-\-version\fR
+Prints version information\.
+.
+.SH "PARAMETERS"
+.
+.TP
+FILE
+filename with extension (eg\. IMG1234\.JPEG)
+.
+.TP
+FILENAME
+filename without extension (eg\. IMG1234)
+.
+.TP
+EXTENSION
+optimized file extension (\.jpg|\.png)
+.
+.TP
+DENSITY
+density in ppi (eg\. 72)
+.
+.TP
+DOWNSAMPLETHRESHOLD
+downsample threshold (integer >= 100)
+.
+.TP
+UNSHARP
+unsharp filter (eg\. 2x1)
+.
+.TP
+QUALITY
+quality (integer > 0, <= 100)
+.
+.TP
+STANDARDDEVIATION
+standard deviation (decimal > 0\.0)
+.
+.TP
+OPACITY
+opacity (decimal >= 0\.0, <= 1\.0)
+.
+.TP
+COLOR
+color string (eg\. pink)
+.
+.TP
+GRAPHICSPATH
+list of directories (eg\. {images/}{tmp/})
+.
+.TP
+JOBNAME
+LaTeX filename without extension (eg\. my\-document)
+.
+.TP
+BATCHLIST
+a flat list of batch items where each batch item is a flat list of the 15 parameters required by the command `pagelayoutapi optimize`
+.
+.P
+All other parameters are length dimensions\. The command \fBpagelayoutapi optimize\fR expects integer values in the LaTeX unit sp (eg\. 65536)\. The command \fBpagelayoutapi makeshadow\fR expects decimal values in a SVG compatible unit (eg\. 420\.0pt)\.
+.
+.SH "ENVIRONMENT"
+\fBpagelayoutapi\fR requires ImageMagick 7\.0 or later and Inkscape 1\.0 or later\.
+.
+.TP
+\fBPAGELAYOUT_IMPORT_DIRECTORY\fR
+Defines a system wide import directory\.
+.
+.SH "AUTHOR"
+\fBpagelayoutapi\fR was written by Friedemann Bartels\. \fIhttps://github\.com/friedemannbartels\fR
+.
+.SH "LICENSE"
+Copyright (c) 2022-2023 Friedemann Bartels\. Free use of this software is granted under the terms of the LaTeX Project Public License version 1\.3c or later\.
diff --git a/macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1.md b/macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1.md
new file mode 100644
index 0000000000..ab04ddd0b8
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/scripts/pagelayoutapi.1.md
@@ -0,0 +1,87 @@
+pagelayoutapi(1) -- API for the pagelayout LaTeX class
+====
+
+## SYNOPSIS
+
+`pagelayoutapi getwidth` % FILE
+
+`pagelayoutapi optimize` % FILE % FILENAME % EXTENSION % ORIGINALWIDTH % ORIGINALHEIGHT % CROPLEFT % CROPRIGHT % CROPTOP % CROPBOTTOM % DENSITY % WIDTH % HEIGHT % DOWNSAMPLETHRESHOLD % UNSHARP % QUALITY
+
+`pagelayoutapi makeshadow` % FILENAME % STANDARDDEVIATION % OPACITY % COLOR % WIDTH % HEIGHT % FRAMEWIDTH % FRAMEHEIGHT % MARGIN % BORDERRADIUS
+
+`pagelayoutapi start` [% import % [GRAPHICSPATH]] [% turbo % JOBNAME]
+
+`pagelayoutapi batchoptimize` % BATCHLIST
+
+## DESCRIPTION
+
+This script provides an API for the pagelayout LaTeX class.
+
+* `pagelayoutapi getwidth`:
+ Returns the width in pixels for the given image file.
+
+* `pagelayoutapi optimize`:
+ Creates a cropped, rezised, sharpend and compressed image and stores it in the cache directory.
+
+* `pagelayoutapi makeshadow`:
+ Creates a shadow image and stores it in the cache directory.
+
+* `pagelayoutapi start`:
+ The import parameter triggers the image import (see pagelayout-manual.pdf chapter "Image Optimization").
+ Running the command with the parameter turbo, where the jobname is the filename of the document, processes the document in a special batch mode, that creates a batch list and calls the command `pagelayoutapi batchoptimize`.
+
+* `pagelayoutapi batchoptimize`:
+ Optimizes multiple images in parallel.
+
+## OPTIONS
+
+* `--help`:
+ Prints a help message.
+* `--version`:
+ Prints version information.
+
+## PARAMETERS
+
+* FILE:
+ filename with extension (eg. IMG1234.JPEG)
+* FILENAME:
+ filename without extension (eg. IMG1234)
+* EXTENSION:
+ optimized file extension (.jpg|.png)
+* DENSITY:
+ density in ppi (eg. 72)
+* DOWNSAMPLETHRESHOLD:
+ downsample threshold (integer >= 100)
+* UNSHARP:
+ unsharp filter (eg. 2x1)
+* QUALITY:
+ quality (integer > 0, <= 100)
+* STANDARDDEVIATION:
+ standard deviation (decimal > 0.0)
+* OPACITY:
+ opacity (decimal >= 0.0, <= 1.0)
+* COLOR:
+ color string (eg. pink)
+* GRAPHICSPATH:
+ list of directories (eg. {images/}{tmp/})
+* JOBNAME:
+ LaTeX filename without extension (eg. my-document)
+* BATCHLIST:
+ a flat list of batch items where each batch item is a flat list of the 15 parameters required by the command \`pagelayoutapi optimize\`
+
+All other parameters are length dimensions. The command `pagelayoutapi optimize` expects integer values in the LaTeX unit sp (eg. 65536). The command `pagelayoutapi makeshadow` expects decimal values in a SVG compatible unit (eg. 420.0pt).
+
+## ENVIRONMENT
+
+`pagelayoutapi` requires ImageMagick 7.0 or later and Inkscape 1.0 or later.
+
+* `PAGELAYOUT_IMPORT_DIRECTORY`:
+ Defines a system wide import directory.
+
+## AUTHOR
+
+`pagelayoutapi` was written by Friedemann Bartels. <https://github.com/friedemannbartels>
+
+## LICENSE
+
+Copyright (c) 2022-2023 Friedemann Bartels. Free use of this software is granted under the terms of the LaTeX Project Public License version 1.3c or later.
diff --git a/macros/latex/contrib/pagelayout/scripts/textestvis b/macros/latex/contrib/pagelayout/scripts/textestvis
new file mode 100755
index 0000000000..36b3ff6cfb
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/scripts/textestvis
@@ -0,0 +1,506 @@
+#!/bin/sh
+#
+# Copyright (c) 2022-2023 by Friedemann Bartels
+#
+# This file may be distributed and/or modified under the
+# conditions of the LaTeX Project Public License, either
+# version 1.3c of this license or (at your option) any later
+# version. The latest version of this license is in:
+#
+# http://www.latex-project.org/lppl.txt
+#
+# and version 1.3c or later is part of all distributions of
+# LaTeX version 2008/05/04 or later.
+#
+
+version=1.0.3
+
+OK="$( tput setaf 2 )•$( tput sgr0 )"
+FAILED="$( tput setaf 1 )$( tput bold )x$( tput sgr0 )"
+NEW="$( tput setaf 3 )$( tput bold )+$( tput sgr0 )"
+REMOVED="$( tput setaf 5 )$( tput bold )-$( tput sgr0 )"
+ERROR="$( tput setaf 1 )$( tput bold )!$( tput sgr0 )"
+
+_playok() {
+ if [ -f /System/Library/Sounds/Glass.aiff ]; then
+ afplay /System/Library/Sounds/Glass.aiff >/dev/null 2>&1
+ fi
+}
+
+_playhm() {
+ if [ -f /System/Library/Sounds/Basso.aiff ]; then
+ afplay /System/Library/Sounds/Basso.aiff >/dev/null 2>&1
+ fi
+}
+
+_playerror() {
+ if [ -f /System/Library/Sounds/Sosumi.aiff ]; then
+ afplay /System/Library/Sounds/Sosumi.aiff >/dev/null 2>&1
+ fi
+}
+
+_gettime() {
+ if command -v gdate &> /dev/null; then
+ echo $( gdate +%s%3N )
+ else
+ if command -v date &> /dev/null; then
+ milliseconds=$( date +%3N )
+ if [ $milliseconds = 3N ]; then
+ echo $(( SECONDS * 1000 ))
+ else
+ echo $( date +%s%3N )
+ fi
+ else
+ echo $(( SECONDS * 1000 ))
+ fi
+ fi
+}
+
+_starttimer() {
+ starttime=$( _gettime )
+}
+
+_stoptimer() {
+ endtime=$( _gettime )
+
+ elapsedtime=$(( endtime - starttime ))
+ elapsedseconds=$(( elapsedtime / 1000 ))
+ elapsedmilliseconds=$(( elapsedtime % 1000 ))
+ elapsed=$elapsedseconds.$( printf "%03d" "$elapsedmilliseconds" )
+}
+
+test() {
+ _starttimer
+ tmpdir=$( mktemp -d 2>/dev/null )/textest$( date "+%Y%m%d%H%M%S" )$RANDOM
+ mkdir $tmpdir
+
+ if [ $3 = true ] && [ -d cache ]; then
+ rm -rf cache
+ fi
+
+ okcount=0
+ failedcount=0
+ newcount=0
+ removedcount=0
+ fileokcount=0
+ filefailedcount=0
+ defaultfiller=23
+
+ echo ""
+ for entry in *$5*.tex
+ do
+ if [ $entry != "*$5*.tex" ]; then
+ name=$( echo $entry | sed -e 's/\.tex$//g' )
+ if [ ${name:0:1} != _ ]; then
+ printf "$( tput sgr0 )$name"
+
+ runtwice=0
+ if [ "${name:$(( ${#name} - 2 )):2}" = "@2" ]; then
+ runtwice=1
+ fi
+
+ if [ "$4" != "xelatex" ]; then
+ name="$name.$4"
+ fi
+
+ passed=1
+ rm -f $name.failed.*
+
+ cp $entry $tmpdir/$name.tex
+ shell=""
+ if [ $1 = true ]; then
+ shell="--shell-escape"
+ fi
+ $4 -interaction=batchmode $shell --output-directory $tmpdir $tmpdir/$name.tex > /dev/null
+ if [ $? -eq 1 ]; then
+ passed=0
+ fi
+ if [ $runtwice -eq 1 ]; then
+ $4 -interaction=batchmode $shell --output-directory $tmpdir $tmpdir/$name.tex > /dev/null
+ if [ $? -eq 1 ]; then
+ passed=0
+ fi
+ fi
+
+ magick convert -density $2 -quiet $tmpdir/$name.pdf $tmpdir/$name.png
+ if [ -f "$tmpdir/$name.png" ]; then
+ mv $tmpdir/$name.png $tmpdir/$name-0.png
+ fi
+
+ if [ -f "$name.approved.pdf" ]; then
+ magick convert -density $2 -quiet $name.approved.pdf $tmpdir/$name.approved.png
+ if [ -f "$tmpdir/$name.approved.png" ]; then
+ mv $tmpdir/$name.approved.png $tmpdir/$name.approved-0.png
+ fi
+ fi
+
+ if [ $passed -eq 0 ]; then
+ filler=$(( defaultfiller - ${#name} - 2 ))
+ else
+ filler=$(( defaultfiller - ${#name} ))
+ fi
+ while [ 0 -le $filler ]; do
+ printf " "
+ filler=$(( filler - 1 ))
+ done
+ if [ $passed -eq 0 ]; then
+ printf " $ERROR"
+ fi
+
+ index=0
+ while [ -f "$tmpdir/$name-$index.png" ]; do
+ if [ -f "$tmpdir/$name.approved-$index.png" ]; then
+ changedpixels=$( magick compare -quiet -metric AE $tmpdir/$name-$index.png $tmpdir/$name.approved-$index.png null: 2>&1 )
+ if [ $changedpixels -eq 0 ]; then
+ okcount=$(( okcount + 1 ))
+ printf " $OK"
+ else
+ failedcount=$(( failedcount + 1 ))
+ passed=0
+ printf " $FAILED"
+ magick compare -quiet $tmpdir/$name-$index.png $tmpdir/$name.approved-$index.png $name.failed.$(( index + 1 )).png
+ if [ -f "$tmpdir/$name.pdf" ]; then
+ mv $tmpdir/$name.pdf $name.failed.pdf
+ fi
+ fi
+ else
+ newcount=$(( newcount + 1 ))
+ passed=0
+ printf " $NEW"
+ mv $tmpdir/$name-$index.png $name.failed.$(( index + 1 )).png
+ if [ -f "$tmpdir/$name.pdf" ]; then
+ mv $tmpdir/$name.pdf $name.failed.pdf
+ fi
+ fi
+ index=$(( index + 1 ))
+ if [ `expr $index % 20` -eq 0 ] && [ -f "$tmpdir/$name-$index.png" ]; then
+ echo ""
+ filler=$defaultfiller
+ while [ 0 -le $filler ]; do
+ printf " "
+ filler=$(( filler - 1 ))
+ done
+ fi
+ done
+ while [ -f "$tmpdir/$name.approved-$index.png" ]; do
+ removedcount=$(( removedcount + 1 ))
+ passed=0
+ printf " $REMOVED"
+ mv $tmpdir/$name.approved-$index.png $name.failed.$(( index + 1 )).png
+ if [ -f "$tmpdir/$name.pdf" ]; then
+ mv $tmpdir/$name.pdf $name.failed.pdf
+ fi
+ index=$(( index + 1 ))
+ if [ `expr $index % 20` -eq 0 ] && [ -f "$tmpdir/$name.approved-$index.png" ]; then
+ echo ""
+ filler=$defaultfiller
+ while [ 0 -le $filler ]; do
+ printf " "
+ filler=$(( filler - 1 ))
+ done
+ fi
+ done
+
+ if [ $passed -eq 1 ]; then
+ fileokcount=$(( fileokcount + 1 ))
+ else
+ filefailedcount=$(( filefailedcount + 1 ))
+ fi
+
+ echo ""
+ fi
+ fi
+ done
+
+ rm -rf $tmpdir
+ _stoptimer
+ seconds=$( printf "%.1f" "$elapsed" )
+
+ filecount=$(( fileokcount + filefailedcount ))
+
+ if [ $filecount -gt 0 ]; then
+ echo ""
+ fi
+ if [ $filecount -eq $fileokcount ]; then
+ if [ $filecount -eq 0 ]; then
+ _playhm &
+ echo "$( tput sgr0 )Tested 0 files 🧐."
+ else
+ _playok &
+ echo "$( tput sgr0 )Successfully tested $filecount files in $seconds seconds 🎉."
+ fi
+ echo ""
+ else
+ _playerror &
+ echo "$( tput sgr0 )Tested $filecount files in $seconds seconds."
+ echo ""
+
+ if [ $fileokcount -gt 0 ]; then
+ filler=$(( 6 + ${#filecount} - ${#fileokcount} ))
+ while [ 0 -le $filler ]; do
+ printf " "
+ filler=$(( filler - 1 ))
+ done
+ printf "$( tput setaf 2 )$fileokcount OK$( tput sgr0 )"
+ echo ""
+ fi
+ if [ $filefailedcount -gt 0 ]; then
+ filler=$(( 6 + ${#filecount} - ${#filefailedcount} ))
+ while [ 0 -le $filler ]; do
+ printf " "
+ filler=$(( filler - 1 ))
+ done
+ printf "$( tput setaf 1 )$filefailedcount Failed$( tput sgr0 )"
+ echo ""
+ fi
+ echo ""
+ exit 1
+ fi
+}
+
+approve() {
+ filecount=0
+
+ suffix=""
+ if [ "$1" != "xelatex" ]; then
+ suffix=".$1"
+ fi
+
+ echo ""
+ for entry in *$2*$suffix.failed.pdf
+ do
+ if [ $entry != "*$2*$suffix.failed.pdf" ]; then
+ filecount=$(( filecount + 1 ))
+ name=$( echo $entry | sed -e "s/$suffix.failed.pdf//" )
+ echo $name
+ rm -f $name$suffix.approved.pdf
+ if [ -f "$name.aux" ]; then
+ cp $name$suffix.failed.pdf $name$suffix.approved.pdf
+ else
+ mv $name$suffix.failed.pdf $name$suffix.approved.pdf
+ fi
+
+ rm -f $name$suffix.failed.*
+ fi
+ done
+
+ if [ $filecount -gt 0 ]; then
+ echo ""
+ fi
+ if [ $filecount -eq 1 ]; then
+ echo "Approved 1 file."
+ else
+ echo "Approved $filecount files."
+ fi
+ echo ""
+}
+
+compare() {
+ filea=$2
+ fileb=$3
+ tmpdir=$( mktemp -d 2>/dev/null)/textest$( date "+%Y%m%d%H%M%S" )$RANDOM
+ mkdir $tmpdir
+
+ namea=$( echo $filea | sed -e 's/\.\///g' | sed -e 's/\.pdf$//g' )
+ nameb=$( echo $fileb | sed -e 's/\.\///g' | sed -e 's/\.pdf$//g' )
+ basenamea=$(basename $namea)
+ basenameb=$(basename $nameb)
+
+ rm -f $namea.diff.*.png
+
+ spacer=""
+ if [ -f "$filea" ]; then
+ if [ -f "$fileb" ]; then
+ magick convert -density $1 -quiet $filea $tmpdir/$basenamea.png
+ if [ -f "$tmpdir/$basenamea.png" ]; then
+ mv $tmpdir/$basenamea.png $tmpdir/$basenamea-0.png
+ fi
+ magick convert -density $1 -quiet $fileb $tmpdir/$basenameb.png
+ if [ -f "$tmpdir/$basenameb.png" ]; then
+ mv $tmpdir/$basenameb.png $tmpdir/$basenameb-0.png
+ fi
+
+ index=0
+ while [ -f "$tmpdir/$basenamea-$index.png" ]; do
+ if [ -f "$tmpdir/$basenameb-$index.png" ]; then
+ changedpixels=$( magick compare -quiet -metric AE $tmpdir/$basenamea-$index.png $tmpdir/$basenameb-$index.png null: 2>&1 )
+ if [ $changedpixels -eq 0 ]; then
+ printf "$spacer$OK"
+ spacer=" "
+ else
+ printf "$spacer$FAILED"
+ spacer=" "
+ magick compare -quiet $tmpdir/$basenamea-$index.png $tmpdir/$basenameb-$index.png $namea.diff.$(( index + 1 )).png
+ fi
+ else
+ printf "$spacer$NEW"
+ spacer=" "
+ fi
+ index=$(( index + 1 ))
+ done
+ while [ -f "$tmpdir/$basenameb-$index.png" ]; do
+ printf "$spacer$REMOVED"
+ spacer=" "
+ index=$(( index + 1 ))
+ done
+ echo ""
+ else
+ echo "File $fileb not found."
+ fi
+ else
+ echo "File $filea not found."
+ fi
+
+ rm -rf $tmpdir
+}
+
+perf() {
+ if [ -f $4 ]; then
+ tmpdir=$( mktemp -d 2>/dev/null )/textestperf$( date "+%Y%m%d%H%M%S" )$RANDOM
+ mkdir $tmpdir
+ basename=$(basename $4)
+
+ if [ $1 = true ] && [ -d cache ]; then
+ rm -rf cache
+ fi
+
+ cp $4 $tmpdir
+ shell=""
+ if [ $2 = true ]; then
+ shell="--shell-escape"
+ fi
+ _starttimer
+ $3 -interaction=batchmode $shell --output-directory $tmpdir $tmpdir/$basename > /dev/null
+ _stoptimer
+ echo "$elapsed"
+
+ rm -rf $tmpdir
+ else
+ echo "File $4 not found."
+ fi
+}
+
+usage() {
+ cat <<HELP_USAGE
+usage: textest [-cs] [-e ENGINE] [-d DENSITY] [PATTERN]
+ textest approve [-e ENGINE] [PATTERN]
+ textest compare [-d DENSITY] FILE FILE
+ textest perf [-cs] [-e ENGINE] FILE
+
+ -c Clears cache.
+ -s Enables shell escape.
+ -d DENSITY Sets density in ppi (default 72).
+ -e ENGINE Sets latex engine (default xelatex).
+ --help Prints a help message.
+ --version Prints version information.
+HELP_USAGE
+}
+
+version() {
+ echo textest $version
+}
+
+case "$1" in
+approve)
+ shift
+ engine=xelatex
+
+ while getopts ":e:" arg; do
+ case "${arg}" in
+ e)
+ engine="${OPTARG}"
+ ;;
+ ?)
+ echo "Invalid option: -${OPTARG}."
+ ;;
+ esac
+ done
+
+ shift "$(( OPTIND - 1 ))"
+
+ approve $engine $1
+ ;;
+compare)
+ shift
+
+ density=72
+
+ while getopts ":d:" arg; do
+ case "${arg}" in
+ d)
+ density="${OPTARG}"
+ ;;
+ ?)
+ echo "Invalid option: -${OPTARG}."
+ ;;
+ esac
+ done
+
+ shift "$(( OPTIND - 1 ))"
+
+ compare $density $1 $2
+ ;;
+perf)
+ shift
+
+ shell=false
+ clear=false
+ engine=xelatex
+
+ while getopts ":e:sc" arg; do
+ case "${arg}" in
+ c)
+ clear=true
+ ;;
+ e)
+ engine="${OPTARG}"
+ ;;
+ s)
+ shell=true
+ ;;
+ ?)
+ echo "Invalid option: -${OPTARG}."
+ ;;
+ esac
+ done
+
+ shift "$(( OPTIND - 1 ))"
+
+ perf $clear $shell $engine $1
+ ;;
+--version)
+ version
+ ;;
+--help)
+ usage
+ ;;
+*)
+ density=72
+ shell=false
+ clear=false
+ engine=xelatex
+
+ while getopts ":e:d:sc" arg; do
+ case "${arg}" in
+ c)
+ clear=true
+ ;;
+ d)
+ density="${OPTARG}"
+ ;;
+ e)
+ engine="${OPTARG}"
+ ;;
+ s)
+ shell=true
+ ;;
+ ?)
+ echo "Invalid option: -${OPTARG}."
+ ;;
+ esac
+ done
+
+ shift "$(( OPTIND - 1 ))"
+
+ test $shell $density $clear $engine $1
+esac
diff --git a/macros/latex/contrib/pagelayout/scripts/textestvis.1 b/macros/latex/contrib/pagelayout/scripts/textestvis.1
new file mode 100644
index 0000000000..7f7b7df740
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/scripts/textestvis.1
@@ -0,0 +1,73 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "TEXTESTVIS" "1" "January 2023" "" ""
+.
+.SH "NAME"
+\fBtextestvis\fR \- visual regression tests for LaTeX
+.
+.SH "SYNOPSIS"
+\fBtextestvis\fR [\-cs] [\-e ENGINE] [\-d DENSITY] [PATTERN]
+.
+.P
+\fBtextestvis approve\fR [\-e ENGINE] [PATTERN]
+.
+.P
+\fBtextestvis compare\fR [\-d DENSITY] FILE FILE
+.
+.P
+\fBtextestvis perf\fR [\-cs] [\-e ENGINE] FILE
+.
+.SH "DESCRIPTION"
+Perform visual regression tests for LaTeX documents\.
+.
+.TP
+\fBtextestvis\fR
+Creates PDF files for all tex files matching the pattern and performs a visual regression test\. If no pattern is specified, all files in the current directory are tested except for files whose names begin with an underscore\.
+.
+.TP
+\fBtextestvis approve\fR
+Replaces the reference files with the test files\.
+.
+.TP
+\fBtextestvis compare\fR
+Creates a visual diff for two pdf files\.
+.
+.TP
+\fBtextestvis perf\fR
+Measures the time for creating a pdf file from the given tex file\.
+.
+.SH "OPTIONS"
+.
+.TP
+\fB\-c\fR
+Clears cache\.
+.
+.TP
+\fB\-s\fR
+Enables shell escape\.
+.
+.TP
+\fB\-d\fR \fIDENSITY\fR
+Sets density in ppi (default 72)\.
+.
+.TP
+\fB\-e\fR \fIENGINE\fR
+Sets latex engine (default xelatex)\.
+.
+.TP
+\fB\-\-help\fR
+Prints a help message\.
+.
+.TP
+\fB\-\-version\fR
+Prints version information\.
+.
+.SH "ENVIRONMENT"
+\fBtextestvis\fR requires ImageMagick 7\.0 or later\.
+.
+.SH "AUTHOR"
+\fBtextestvis\fR was written by Friedemann Bartels\. \fIhttps://github\.com/friedemannbartels\fR
+.
+.SH "LICENSE"
+Copyright (c) 2022-2023 Friedemann Bartels\. Free use of this software is granted under the terms of the LaTeX Project Public License version 1\.3c or later\.
diff --git a/macros/latex/contrib/pagelayout/scripts/textestvis.1.md b/macros/latex/contrib/pagelayout/scripts/textestvis.1.md
new file mode 100644
index 0000000000..00b475d935
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/scripts/textestvis.1.md
@@ -0,0 +1,55 @@
+textestvis(1) -- visual regression tests for LaTeX
+====
+
+## SYNOPSIS
+
+`textestvis` [-cs] [-e ENGINE] [-d DENSITY] [PATTERN]
+
+`textestvis approve` [-e ENGINE] [PATTERN]
+
+`textestvis compare` [-d DENSITY] FILE FILE
+
+`textestvis perf` [-cs] [-e ENGINE] FILE
+
+## DESCRIPTION
+
+Perform visual regression tests for LaTeX documents.
+
+* `textestvis`:
+ Creates PDF files for all tex files matching the pattern and performs a visual regression test. If no pattern is specified, all files in the current directory are tested except for files whose names begin with an underscore.
+
+* `textestvis approve`:
+ Replaces the reference files with the test files.
+
+* `textestvis compare`:
+ Creates a visual diff for two pdf files.
+
+* `textestvis perf`:
+ Measures the time for creating a pdf file from the given tex file.
+
+## OPTIONS
+
+* `-c`:
+ Clears cache.
+* `-s`:
+ Enables shell escape.
+* `-d` <DENSITY>:
+ Sets density in ppi (default 72).
+* `-e` <ENGINE>:
+ Sets latex engine (default xelatex).
+* `--help`:
+ Prints a help message.
+* `--version`:
+ Prints version information.
+
+## ENVIRONMENT
+
+`textestvis` requires ImageMagick 7.0 or later.
+
+## AUTHOR
+
+`textestvis` was written by Friedemann Bartels. <https://github.com/friedemannbartels>
+
+## LICENSE
+
+Copyright (c) 2022-2023 Friedemann Bartels. Free use of this software is granted under the terms of the LaTeX Project Public License version 1.3c or later.
diff --git a/macros/latex/contrib/pagelayout/tex/pagelayout.cls b/macros/latex/contrib/pagelayout/tex/pagelayout.cls
new file mode 100644
index 0000000000..2f0257de2a
--- /dev/null
+++ b/macros/latex/contrib/pagelayout/tex/pagelayout.cls
@@ -0,0 +1,3747 @@
+%%
+%% Copyright (c) 2022-2023 by Friedemann Bartels
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\ProvidesClass{pagelayout}[2023/01/23 Layout graphic rich documents]
+\def\pagelayoutversion{1.0.3}
+
+% packages
+\RequirePackage{pgfopts}
+\RequirePackage{tikz}
+\RequirePackage{tcolorbox}
+\tcbuselibrary{magazine}
+
+% helper
+\def\pal@emptystring{}
+\def\pal@striplastexclamationmark#1{\pal@striplastexclamationmarka{#1}#1\end !\end\eend}
+\def\pal@striplastexclamationmarka#1#2!\end#3\eend{\ifx\end#3\end#1\else#2\fi}
+\def\pal@instring#1#2{TT\fi\begingroup\edef\pal@x{\endgroup\noexpand\in@{#1}{#2}}\pal@x\ifin@}
+\def\pal@dimentonumber#1{\strip@pt\dimexpr #1*65536/\number\dimexpr 1\unitlength}
+
+% ifs
+\newif\ifpal@leftpage
+\newif\ifpal@rightpage
+
+\newif\ifpal@twoside
+\newif\ifpal@fanfold
+\newif\ifpal@cover
+\newif\ifpal@beginleft
+\newif\ifpal@beginright
+\newif\ifpal@grid
+\newif\ifpal@preflight
+\newif\ifpal@graphpaper
+\newif\ifpal@placeholder
+\newif\ifpal@safezone
+\newif\ifpal@cuttingmarks
+\newif\ifpal@fillpages
+\newif\ifpal@frontcover
+\newif\ifpal@backcover
+
+\newif\ifpal@hascover
+\newif\ifpal@haspages
+\newif\ifpal@isdoublepage
+\newif\ifpal@ispage
+\newif\ifpal@isemptypage
+\newif\ifpal@haslastemptypage
+\newif\ifpal@hasoddnumberofpages
+\newif\ifpal@cuttingmarksvisible
+\newif\ifpal@isfanfoldopen
+\newif\ifpal@isinitgrid
+\newif\ifpal@haspagegraphic
+\newif\ifpal@isperformancemode
+\newif\ifpal@isturbomode
+\newif\ifpal@isbatchmode
+\newif\ifpal@ismaskrequired
+\newif\ifpal@optimize
+\newif\ifpal@import
+\newif\ifpal@isluatex
+
+% dimensions
+\newdimen\pal@null\pal@null=0pt
+\newdimen\pal@undefdim\pal@undefdim=-1sp
+
+\ifdefined\pagewidth\pal@isluatextrue\else\newdimen\pagewidth\newdimen\pageheight\fi
+\newdimen\bleed\newdimen\outerbleed\newdimen\innerbleed\newdimen\topbleed\newdimen\bottombleed
+\newdimen\safetymargin\newdimen\topsafetymargin\newdimen\bottomsafetymargin\newdimen\innersafetymargin\newdimen\outersafetymargin
+\newdimen\innermargin\newdimen\bottommargin\newdimen\outermargin\newdimen\margin
+\newdimen\gutter\newdimen\spinewidth\newdimen\bindingoffset
+\newdimen\coverwidth\newdimen\coverheight
+\newdimen\coverbleed\newdimen\coverouterbleed\newdimen\coverinnerbleed\newdimen\covertopbleed\newdimen\coverbottombleed
+\newdimen\coversafetymargin\newdimen\covertopsafetymargin\newdimen\coverbottomsafetymargin\newdimen\coverinnersafetymargin\newdimen\coveroutersafetymargin
+
+\newdimen\pal@pagewidth\newdimen\pal@pageheight
+\newdimen\pal@outerbleed\newdimen\pal@innerbleed\newdimen\pal@topbleed\newdimen\pal@bottombleed
+\newdimen\pal@topsafetymargin\newdimen\pal@bottomsafetymargin\newdimen\pal@innersafetymargin\newdimen\pal@outersafetymargin
+\newdimen\pal@topmargin\newdimen\pal@topmargintmp\newdimen\pal@innermargin\newdimen\pal@bottommargin\newdimen\pal@outermargin
+\newdimen\pal@gutter
+\newdimen\pal@x\newdimen\pal@y\newdimen\pal@xx\newdimen\pal@yy\newdimen\width\newdimen\height\newdimen\x\newdimen\y
+\newdimen\pal@gridoffsethorizontal\newdimen\pal@gridoffsetvertical\newdimen\pal@gridoffsethorizontaln\newdimen\pal@gridoffsetverticaln
+\newdimen\pal@graphpaperx\newdimen\pal@graphpapery\newdimen\pal@graphpaperoffset\newdimen\pal@graphpapersnap
+
+% interface
+\newcommand\ifleftpage[1]{\ifpal@leftpage#1\fi}
+\newcommand\ifrightpage[1]{\ifpal@rightpage#1\fi}
+\newcommand\ifspine[1]{\ifpal@cover#1\fi}
+\def\twoside{\pal@twosidetrue}
+\def\fanfold{\pal@fanfoldtrue}
+\def\cover{\pal@covertrue}
+\def\beginleft{\pal@beginlefttrue}
+\def\beginright{\pal@beginrighttrue}
+\def\grid{\pal@gridtrue}\def\nogrid{\pal@gridfalse}
+\def\preflight{\pal@preflighttrue}\def\nopreflight{\pal@preflightfalse}
+\def\graphpaper{\pal@graphpapertrue}\def\nographpaper{\pal@graphpaperfalse}
+\def\placeholders{\pal@placeholdertrue}\def\noplaceholders{\pal@placeholderfalse}
+\def\safezone{\pal@safezonetrue}\def\nosafezone{\pal@safezonefalse}
+\def\cuttingmarks{\pal@cuttingmarkstrue}\def\nocuttingmarks{\pal@cuttingmarksfalse}
+\def\fillpages{\pal@fillpagestrue}\def\nofillpages{\pal@fillpagesfalse}
+\newcommand\optimize[1][]{\pal@optimizetrue\pgfkeys{optimize,#1}}
+\def\density#1{\def\pal@density{#1}}
+\def\quality#1{\def\pal@quality{#1}}
+\def\import{\pal@importtrue}
+
+\def\setgraphpaper#1{
+ \def\pal@graphpaperconfig{#1}
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \global\pal@graphpapersnap=\pal@graphpaperconfigitem
+ }
+}
+\setgraphpaper{1mm,5mm}
+
+\def\pal@pagecolormodel{}
+\def\pal@pagecolor{}
+\renewcommand\pagecolor[2][]{
+ \ifpal@ispage
+ \def\pal@pagecolormodel{#1}
+ \def\pal@pagecolor{#2}
+ \else
+ \global\def\pal@pagecolormodel{#1}
+ \global\def\pal@pagecolor{#2}
+ \fi
+}
+\newcommand\setpagecolor[2][]{\pagecolor[#1]{#2}}
+\def\nopagecolor{\pagecolor{}}
+
+\def\pal@current@color{black}
+\let\pal@originalcolor\color
+\def\color#1{\ifpal@ispage\ifx\pal@current@color#1\else\def\pal@current@color{#1}\pal@originalcolor{#1}\fi\else\def\paloptions@color{#1}\fi}
+\def\setcolor#1{\color{#1}}
+
+\let\pal@originalpagenumbering\pagenumbering
+\newif\ifpal@pagenumberinghaschanged
+\renewcommand\pagenumbering[1]{\pal@pagenumberinghaschangedtrue\pal@originalpagenumbering{#1}}
+
+% options
+\def\pal@density{300}
+\def\pal@downsamplethreshold{120}
+\def\pal@quality{}
+\def\pal@unsharp{2x1}
+\pgfkeysdef{/optimize/downsample threshold}{
+ \pgfmathqparse{#1pt*100pt}
+ \pgfmathround{\pgfmathresult}
+ \pgfmathint{\pgfmathresult}
+ \edef\pal@downsamplethreshold{\pgfmathresult}
+}
+\pgfkeys{
+ /optimize/.is family,
+ /optimize,
+ density/.store in=\pal@density,
+ quality/.store in=\pal@quality,
+ unsharp/.store in=\pal@unsharp,
+}
+\pgfkeys{
+ /pal/.cd,
+ % page dimensions
+ pagewidth/.code={\setlength{\pagewidth}{#1}},pagewidth=210mm,
+ pageheight/.code={\setlength{\pageheight}{#1}},pageheight=297mm,
+ bleed/.code={\setlength{\bleed}{#1}},bleed=0pt,
+ outerbleed/.code={\setlength{\outerbleed}{#1}},outerbleed=\pal@undefdim,
+ innerbleed/.code={\setlength{\innerbleed}{#1}},innerbleed=\pal@undefdim,
+ topbleed/.code={\setlength{\topbleed}{#1}},topbleed=\pal@undefdim,
+ bottombleed/.code={\setlength{\bottombleed}{#1}},bottombleed=\pal@undefdim,
+ safetymargin/.code={\setlength{\safetymargin}{#1}},safetymargin=0pt,
+ outersafetymargin/.code={\setlength{\outersafetymargin}{#1}},outersafetymargin=\pal@undefdim,
+ innersafetymargin/.code={\setlength{\innersafetymargin}{#1}},innersafetymargin=\pal@undefdim,
+ topsafetymargin/.code={\setlength{\topsafetymargin}{#1}},topsafetymargin=\pal@undefdim,
+ bottomsafetymargin/.code={\setlength{\bottomsafetymargin}{#1}},bottomsafetymargin=\pal@undefdim,
+ % cover dimensions
+ coverwidth/.code={\setlength{\coverwidth}{#1}},coverwidth=\pal@undefdim,
+ coverheight/.code={\setlength{\coverheight}{#1}},coverheight=\pal@undefdim,
+ coverbleed/.code={\setlength{\coverbleed}{#1}},coverbleed=\pal@undefdim,
+ coverouterbleed/.code={\setlength{\coverouterbleed}{#1}},coverouterbleed=\pal@undefdim,
+ coverinnerbleed/.code={\setlength{\coverinnerbleed}{#1}},coverinnerbleed=\pal@undefdim,
+ covertopbleed/.code={\setlength{\covertopbleed}{#1}},covertopbleed=\pal@undefdim,
+ coverbottombleed/.code={\setlength{\coverbottombleed}{#1}},coverbottombleed=\pal@undefdim,
+ coversafetymargin/.code={\setlength{\coversafetymargin}{#1}},coversafetymargin=\pal@undefdim,
+ coveroutersafetymargin/.code={\setlength{\coveroutersafetymargin}{#1}},coveroutersafetymargin=\pal@undefdim,
+ coverinnersafetymargin/.code={\setlength{\coverinnersafetymargin}{#1}},coverinnersafetymargin=\pal@undefdim,
+ covertopsafetymargin/.code={\setlength{\covertopsafetymargin}{#1}},covertopsafetymargin=\pal@undefdim,
+ coverbottomsafetymargin/.code={\setlength{\coverbottomsafetymargin}{#1}},coverbottomsafetymargin=\pal@undefdim,
+ spinewidth/.code={\setlength{\spinewidth}{#1}},spinewidth=3mm,
+ bindingoffset/.code={\setlength{\bindingoffset}{#1}},bindingoffset=0pt,
+ % grid dimensions
+ margin/.code={\setlength{\margin}{#1}},margin=20mm,
+ outermargin/.code={\setlength{\outermargin}{#1}},outermargin=\pal@undefdim,
+ innermargin/.code={\setlength{\innermargin}{#1}},innermargin=\pal@undefdim,
+ topmargin/.store in=\paloptions@topmargin,topmargin=-1sp,
+ bottommargin/.code={\setlength{\bottommargin}{#1}},bottommargin=\pal@undefdim,
+ gutter/.code={\setlength{\gutter}{#1}},gutter=0pt,
+ pagecolor/.store in=\pal@pagecolor,
+ pagegraphic/.store in=\paloptions@pagegraphic,pagegraphic=,
+ color/.store in=\paloptions@color,color=black,
+ grid/.is if=pal@grid,
+ safezone/.is if=pal@safezone,
+ cuttingmarks/.is if=pal@cuttingmarks,
+ graphpaper/.is if=pal@graphpaper,
+ placeholder/.is if=pal@placeholder,
+ fillpages/.is if=pal@fillpages,
+ draft/.code={\pal@placeholdertrue\pal@fillpagestrue\pal@cuttingmarkstrue\pal@isperformancemodetrue},
+ preflight/.is if=pal@preflight,
+ twoside/.is if=pal@twoside,
+ fanfold/.code={\pal@fanfoldtrue\pal@covertrue\pal@twosidetrue\pal@beginlefttrue},
+ cover/.is if=pal@cover,
+ beginleft/.is if=pal@beginleft,
+ beginright/.is if=pal@beginright,
+ optimize/.code={\pal@optimizetrue\pgfkeys{optimize,#1}},
+ density/.store in=\pal@density,
+ quality/.store in=\pal@quality,
+ turbo/.is if=pal@isturbomode,turbo=\ifpal@isluatex false\else true\fi,
+ import/.is if=pal@import
+}
+\ProcessPgfOptions{/pal}
+
+\pal@originalcolor{\paloptions@color}
+
+\Gin@draftfalse
+
+\LoadClass[multi=picture]{standalone}
+\setlength{\topmargin}{\paloptions@topmargin}
+
+% grid
+\newdimen\pal@gridoffsetx
+\newdimen\pal@gridwidth\newdimen\pal@gridheight\newdimen\pal@maxgridheight\newdimen\pal@maxgridwidth
+\newcount\pal@gridtmp\newcount\pal@gridtmpRowH
+\newcount\pal@rowscount\newcount\pal@flexrowscount\newcount\pal@fixrowscount\newcount\pal@cellscount
+\newcount\rowsH\newcount\rowsF\newcount\rowsFlex
+\newif\ifpal@gridisflexrow
+\def\pal@set#1#2{
+ \ifcsname pal@data#1\endcsname
+ \else
+ \expandafter\newcount\csname pal@data#1\endcsname
+ \fi
+ \csname pal@data#1\endcsname#2\relax
+}
+\def\pal@get#1{
+ \ifcsname pal@data#1\endcsname
+ \csname pal@data#1\endcsname%
+ \else
+ 0
+ \fi
+}
+\def\pal@advance#1#2{
+ \advance\csname pal@data#1\endcsname by \csname pal@data#2\endcsname
+}
+\newif\ifpal@flexmode
+\newif\ifpal@forcerow
+\newif\ifpal@forcecell
+\def\pal@leftsafetymargin{
+ \ifpal@backcover%
+ \pal@outersafetymargin%
+ \else%
+ \ifpal@frontcover%
+ \pal@innersafetymargin%
+ \else%
+ \ifpal@leftpage%
+ \pal@outersafetymargin%
+ \else%
+ \pal@innersafetymargin%
+ \fi%
+ \fi%
+ \fi%
+}
+\def\pal@rightsafetymargin{
+ \ifpal@backcover%
+ \pal@innersafetymargin%
+ \else%
+ \ifpal@frontcover%
+ \pal@outersafetymargin%
+ \else%
+ \ifpal@leftpage%
+ \pal@innersafetymargin%
+ \else%
+ \pal@outersafetymargin%
+ \fi%
+ \fi%
+ \fi%
+}
+\def\pal@leftbleed{
+ \ifpal@backcover%
+ \pal@outerbleed%
+ \else%
+ \ifpal@frontcover%
+ \pal@innerbleed%
+ \else%
+ \ifpal@leftpage%
+ \pal@outerbleed%
+ \else%
+ \pal@innerbleed%
+ \fi%
+ \fi%
+ \fi%
+}
+\def\pal@rightbleed{
+ \ifpal@backcover%
+ \pal@innerbleed%
+ \else%
+ \ifpal@frontcover%
+ \pal@outerbleed%
+ \else%
+ \ifpal@leftpage%
+ \pal@innerbleed%
+ \else%
+ \pal@outerbleed%
+ \fi%
+ \fi%
+ \fi%
+}
+\def\pal@leftmargin{
+ \ifpal@backcover%
+ \pal@outermargin%
+ \else%
+ \ifpal@frontcover%
+ \pal@innermargin%
+ \else%
+ \ifpal@leftpage%
+ \pal@outermargin%
+ \else%
+ \pal@innermargin%
+ \fi%
+ \fi%
+ \fi%
+}
+\newcommand\pal@addrow[1]{
+ \advance\pal@rowscount by 1
+ \pal@cells#1
+}
+\newdimen\pal@gridheightdiff
+\newdimen\pal@gridwidthdiff
+\newdimen\pal@gridstartxdim
+\newdimen\pal@gridstartydim
+\newcount\looprows
+\newcount\loopcells
+\newcommand\pal@processrows{
+ \advance\looprows 1
+ \ifnum\pal@get{if\the\looprows F}=1
+ \pal@set{\the\looprows HR}{\numexpr(\pal@gridheight-\pal@gutter*\pal@rowscount)*\pal@get{\the\looprows H}/\rowsH+\pal@gutter}
+ \else
+ \ifnum\pal@get{if\the\looprows Fix}=0
+ \pal@set{\the\looprows HR}{\numexpr(\pal@maxgridheight-\pal@gridheight)*\pal@get{\the\looprows H}/\rowsFlex+\pal@gutter}
+ \else
+ \pal@set{\the\looprows HR}{\numexpr(\pal@gridwidth-\pal@gutter*\pal@get{\the\looprows C})*\pal@get{\the\looprows H}/\pal@get{\the\looprows W}+\pal@gutter}
+ \fi
+ \fi
+ \loopcells=0
+ \loop
+ \advance\loopcells 1
+ \ifnum\pal@get{if\the\looprows-\the\loopcells F}=1
+ \pal@set{\the\looprows-\the\loopcells WR}{\numexpr(\pal@get{\the\looprows HR}-\pal@gutter)*\pal@get{\the\looprows-\the\loopcells W}/\pal@get{\the\looprows H}+\pal@gutter}
+ \else
+ \pal@set{\the\looprows-\the\loopcells WR}{\numexpr((\pal@gridwidth-\pal@gutter*\pal@get{\the\looprows C})\ifnum\pal@get{\the\looprows H}>0 -(\pal@get{\the\looprows HR}-\pal@gutter)*\pal@get{\the\looprows F}/\pal@get{\the\looprows H}\fi)*\pal@get{\the\looprows-\the\loopcells W}/(\pal@get{\the\looprows W}-\pal@get{\the\looprows F})+\pal@gutter}
+ \fi
+ \ifnum \loopcells<\pal@get{\the\looprows C}
+ \repeat
+
+ \ifnum \looprows<\pal@rowscount
+ \pal@processrows
+ \fi
+}
+\newcommand\pal@closerows{
+ \pal@topmargin=\ifdim\pal@gridtopmargin=\pal@undefdim\pal@gridmargin\else\pal@gridtopmargin\fi
+ \pal@bottommargin=\ifdim\pal@gridbottommargin=\pal@undefdim\pal@gridmargin\else\pal@gridbottommargin\fi
+ \pal@innermargin=\ifdim\pal@gridinnermargin=\pal@undefdim\pal@gridmargin\else\pal@gridinnermargin\fi
+ \pal@outermargin=\ifdim\pal@gridoutermargin=\pal@undefdim\pal@gridmargin\else\pal@gridoutermargin\fi
+
+ \height=\dimexpr\pal@pageheight - \pal@topmargin - \pal@bottommargin\relax
+ \width=\dimexpr\pal@pagewidth - \pal@innermargin - \pal@outermargin\relax
+ \ifdim\dimexpr\pal@gridoptionheight\relax=\pal@undefdim
+ \else
+ \pal@gridheightdiff=\dimexpr0.5\height - 0.5\dimexpr\pal@gridoptionheight\relax\relax
+ \pal@bottommargin=\dimexpr\pal@bottommargin+\pal@gridheightdiff\relax
+ \pal@topmargin=\dimexpr\pal@topmargin+\pal@gridheightdiff\relax
+ \fi
+ \ifdim\dimexpr\pal@gridoptionwidth\relax=\pal@undefdim
+ \else
+ \pal@gridwidthdiff=\dimexpr\pal@calculaterealgridwidth/2 - 0.5\dimexpr\pal@gridoptionwidth\relax\relax
+ \pal@innermargin=\dimexpr\pal@innermargin+\pal@gridwidthdiff\relax
+ \pal@outermargin=\dimexpr\pal@outermargin+\pal@gridwidthdiff\relax
+ \fi
+
+ \pal@gutter=\pal@gridgutter
+
+ \x=\dimexpr\pal@gridstartx{\pal@undefdim}-\pal@leftbleed\relax
+ \y=\dimexpr\pal@gridstarty{\pal@undefdim}-\pal@bottombleed\relax
+
+ \pal@gridstartxdim=\dimexpr\pal@gridstartx{\pal@gridoptionx}\relax
+ \pal@gridstartydim=\dimexpr\pal@gridstarty{\pal@gridoptiony}\relax
+
+ \pal@gridwidth=\dimexpr\pal@calculatefullgridwidth\relax
+ \ifnum\rowsH>0
+ \pal@calculategridheight
+ \else
+ \pal@gridheight=\dimexpr\pal@gutter*\pal@rowscount\relax
+ \fi
+ \pal@gridoffsetvertical=\pal@null
+ \pal@gridoffsethorizontal=\pal@null
+ \pal@gridoffsetverticaln=\pal@null
+ \pal@gridoffsethorizontaln=\pal@null
+
+ \pal@maxgridheight=\dimexpr\pal@calculatefullgridheight\relax
+ \ifdim\pal@gridheight>\pal@maxgridheight
+ \pal@gridheight=\pal@maxgridheight
+ \pal@calculategridwidth
+ \pal@gridoffsethorizontal=\dimexpr\pal@gridoptionhpos\pal@gridwidth-\pal@gridoptionhpos\pal@maxgridwidth\relax
+ \pal@gridoffsethorizontaln=\dimexpr\pal@gridwidth-\pal@maxgridwidth-\pal@gridoffsethorizontal\relax
+ \pal@gridwidth=\pal@maxgridwidth
+ \else
+ \ifpal@flexmode
+ \else
+ \ifdim\pal@gridheight<\pal@maxgridheight
+ \pal@gridoffsetvertical=\dimexpr\pal@gridoptionvpos\pal@maxgridheight-\pal@gridoptionvpos\pal@gridheight\relax
+ \pal@gridoffsetverticaln=\dimexpr\pal@maxgridheight-\pal@gridheight-\pal@gridoffsetvertical\relax
+ \fi
+ \fi
+ \fi
+
+ \looprows=0
+ \pal@processrows
+}
+\newcommand\pal@addcell[1]{
+ \advance\pal@cellscount by 1
+ \if\pal@instring{!}{#1}
+ \pal@gridtmp \pal@striplastexclamationmark{#1}\relax
+ \pal@forcecelltrue
+ \else
+ \pal@gridisflexrowtrue
+ \ifnum\numexpr0#1\relax=0
+ \pal@gridtmp 1\relax
+ \else
+ \pal@gridtmp #1\relax
+ \fi
+ \pal@forcecellfalse
+ \fi
+ \pal@set{\the\pal@rowscount-\the\pal@cellscount W}{\pal@gridtmp}
+ \ifpal@forcecell
+ \pal@set{if\the\pal@rowscount-\the\pal@cellscount F}{1}
+ \pal@advance{\the\pal@rowscount F}{\the\pal@rowscount-\the\pal@cellscount W}
+ \else
+ \pal@set{if\the\pal@rowscount-\the\pal@cellscount F}{0}
+ \fi
+ \pal@advance{\the\pal@rowscount W}{\the\pal@rowscount-\the\pal@cellscount W}
+}
+\newif\ifpal@gridtop
+\newif\ifpal@gridbottom
+\newif\ifpal@gridleft
+\newif\ifpal@gridright
+\newif\ifpal@gridfull
+\pgfkeys{
+ /grid/.is family,
+ /grid,
+ gutter/.store in=\pal@gridgutter,
+ margin/.store in=\pal@gridmargin,
+ top margin/.store in=\pal@gridtopmargin,
+ bottom margin/.store in=\pal@gridbottommargin,
+ inner margin/.store in=\pal@gridinnermargin,
+ outer margin/.store in=\pal@gridoutermargin,
+ width/.store in=\pal@gridoptionwidth,
+ height/.store in=\pal@gridoptionheight,
+ x/.store in=\pal@gridoptionx,
+ y/.store in=\pal@gridoptiony,
+ vpos/.store in=\pal@gridoptionvpos,
+ hpos/.store in=\pal@gridoptionhpos,
+}
+\def\pal@resetautogrid{
+ \global\pal@gridfullfalse
+ \def\pal@framey{0}\def\pal@framex{0}\def\pal@frameyy{1}\def\pal@framexx{1}
+ \def\pal@frameyymax{0}\def\pal@framexxmax{0}
+}
+\newcommand\setgrid[2][]{
+ \ifpal@haspages
+ \else
+ \def\pal@tmpgrid{\setgrid{#2}}
+ \fi
+ \pal@resetautogrid
+ \pgfkeys{
+ /grid,
+ gutter=\gutter,
+ margin=\margin,
+ top margin=\topmargin,
+ bottom margin=\bottommargin,
+ inner margin=\innermargin,
+ outer margin=\outermargin,
+ width=\pal@undefdim,
+ height=\pal@undefdim,
+ x=\pal@undefdim,
+ y=\pal@undefdim,
+ vpos=\pal@verticalpagealign,
+ hpos=\pal@horizontalpagealign,%
+ #1
+ }
+ \rowsH 0\relax
+ \rowsFlex 0\relax
+ \pal@flexrowscount 0\relax
+ \pal@fixrowscount 0\relax
+ \rowsF 0\relax
+ \pal@rowscount 0\relax
+ \pal@flexmodefalse
+ \def\pal@grid@input{#2}
+ \ifx\pal@grid@input\pal@emptystring
+ \pal@gobblenextrow{{1}}
+ \else
+ \pal@gobblenextrow#2
+ \fi
+}
+\newcommand\pal@gobblenextrow[1]{
+ \pal@addrow{#1}
+ \@ifnextchar\bgroup{
+ \pal@gobblenextrow
+ }{
+ \ifpal@isinitgrid
+ \else
+ \pal@closerows
+ \fi
+ }
+}
+\newcommand\pal@cells[2][1]{
+ \if\pal@instring{!}{#1}
+ \pal@gridtmpRowH \pal@striplastexclamationmark{#1}\relax
+ \pal@forcerowtrue
+ \advance\rowsF by \pal@gridtmpRowH
+ \advance\rowsH by \pal@gridtmpRowH
+ \pal@set{\the\pal@rowscount H}{\pal@gridtmpRowH}
+ \advance \pal@fixrowscount by 1
+ \else
+ \pal@forcerowfalse
+ \pal@gridtmpRowH #1\relax
+ \fi
+
+ \pal@cellscount 0\relax
+ \pal@set{\the\pal@rowscount W}{0}
+ \pal@set{\the\pal@rowscount F}{0}
+ \ifpal@forcerow\pal@set{if\the\pal@rowscount F}{1}\else\pal@set{if\the\pal@rowscount F}{0}\fi
+ \pal@gridisflexrowfalse
+
+ \pal@gobblenextcell{#2}
+}
+\newcommand\pal@gobblenextcell[1]{
+ \pal@addcell{#1}
+ \@ifnextchar\bgroup{
+ \pal@gobblenextcell
+ }{
+ \ifpal@forcerow
+ \else
+ \ifpal@gridisflexrow
+ \pal@flexmodetrue
+ \advance \pal@flexrowscount by 1
+ \advance\rowsFlex by \pal@gridtmpRowH
+ \pal@set{\the\pal@rowscount H}{\pal@gridtmpRowH}
+ \pal@set{if\the\pal@rowscount Fix}{0}
+ \else
+ \advance \pal@fixrowscount by 1
+ \advance\rowsH by \pal@gridtmpRowH
+ \pal@set{\the\pal@rowscount H}{\pal@gridtmpRowH}
+ \pal@set{if\the\pal@rowscount Fix}{1}
+ \fi
+ \fi
+ \pal@set{\the\pal@rowscount C}{\pal@cellscount}
+ }
+}
+
+% grid shortcut
+\def\pal@flexkey{f}
+\def\pal@portraitkey{p}
+\def\pal@squarekey{s}
+\def\pal@landscapekey{l}
+\def\pal@goldenkey{g}
+\def\pal@goldenuprightkey{o}
+\def\pal@widekey{w}
+\def\pal@rowbreakkey{-}
+\newcount\pal@rowcountsc
+\newcount\pal@cellcountsc
+\newcommand\pal@breakrow{
+ \edef\pal@result{\pal@result{[30]\pal@rowindex}}
+}
+\newif\ifpal@isgridvalid
+\newcommand\pal@transformgridconfig[1]{
+ \ifx\pal@rowbreakkey#1
+ \pal@breakrow
+ \def\pal@rowindex{}
+ \else
+ \ifx\pal@flexkey#1
+ \edef\pal@rowindex{\pal@rowindex{1}}
+ \else
+ \ifx\pal@portraitkey#1
+ \edef\pal@rowindex{\pal@rowindex{20!}}
+ \else
+ \ifx\pal@squarekey#1
+ \edef\pal@rowindex{\pal@rowindex{30!}}
+ \else
+ \ifx\pal@landscapekey#1
+ \edef\pal@rowindex{\pal@rowindex{45!}}
+ \else
+ \ifx\pal@widekey#1
+ \edef\pal@rowindex{\pal@rowindex{60!}}
+ \else
+ \ifx\pal@goldenkey#1
+ \edef\pal@rowindex{\pal@rowindex{50!}}
+ \else
+ \ifx\pal@goldenuprightkey#1
+ \edef\pal@rowindex{\pal@rowindex{18!}}
+ \else
+ \pal@isgridvalidfalse
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\newcommand\pal@setplaceholder[1]{
+ \ifx\pal@rowbreakkey#1
+ \advance\pal@rowcountsc by 1
+ \pal@cellcountsc 0\relax
+ \else
+ \placeholder{{\pal@rowcountsc} {\pal@cellcountsc} {\numexpr\pal@rowcountsc+1\relax} {\numexpr\pal@cellcountsc+1\relax}}
+ \advance\pal@cellcountsc by 1
+ \fi
+}
+\newcommand\pal@gridsc[1]{
+ \edef\pal@gridsc@input{#1}
+ \def\pal@rowindex{}
+ \def\pal@result{}
+ \pal@isgridvalidtrue
+ \@tfor\next:=#1\do{\pal@transformgridconfig{\next}}%
+ \ifpal@isgridvalid
+ \pal@breakrow
+ \edef\pal@result{{\pal@result}}
+ \expandafter\setgrid\pal@result
+ \pal@rowcountsc 0\relax
+ \pal@cellcountsc 0\relax
+ \@tfor\next:=#1\do{\pal@setplaceholder{\next}}%
+ \else
+ \pal@errmsg@undefined{template}{\pal@gridsc@input}
+ \fi
+}
+
+% grid dimensions
+\newif\ifpal@flexgrid
+\newcommand\pal@calculategridheight{
+ \pal@flexgridtrue
+ \pal@gridheight=\pal@null
+ \looprows=0
+ \loop
+ \advance\looprows 1
+ \ifnum\pal@get{if\the\looprows F}=1
+ \pal@gridheight=\dimexpr\pal@gridheight+\pal@gutter\relax%
+ \else
+ \ifnum\pal@get{if\the\looprows Fix}=0
+ \pal@gridheight=\dimexpr\pal@gridheight+\pal@gutter\relax%
+ \else
+ \pal@flexgridfalse
+ \pal@gridheight=\dimexpr\pal@gridheight+(\pal@gridwidth-\pal@gutter*\pal@get{\the\looprows C})*\pal@get{\the\looprows H}/(\pal@get{\the\looprows W}*(\rowsH-\rowsF))*\rowsH+\pal@gutter\relax
+ \fi
+ \fi
+ \ifnum \looprows<\pal@rowscount
+ \repeat
+ \ifpal@flexgrid
+ \pal@gridheight=\dimexpr\pal@calculatefullgridheight\relax
+ \fi
+}
+\newcommand\pal@calculatefullgridheight{
+ \pal@pageheight - \pal@topmargin - \pal@bottommargin + \pal@gutter
+}
+\newcommand\pal@calculategridwidth{
+ \def\pal@calculategridwidthcalc{(\pal@gridheight*(\rowsH-\rowsF)/\rowsH-\pal@gutter*(\rowsH-\rowsF)*\pal@rowscount/\rowsH}
+ \looprows=0
+ \loop
+ \advance\looprows 1
+ \ifnum\pal@get{if\the\looprows F}=1
+ \else
+ \ifnum\pal@get{if\the\looprows Fix}=0
+ \else
+ \edef\pal@calculategridwidthcalc{\pal@calculategridwidthcalc+\pal@gutter*\pal@get{\the\looprows C}*\pal@get{\the\looprows H}/\pal@get{\the\looprows W}}
+ \fi
+ \fi
+ \ifnum \looprows<\pal@rowscount
+ \repeat
+
+ \edef\pal@calculategridwidthcalc{\pal@calculategridwidthcalc) * 10000 / (\pal@null}
+ \looprows=0
+ \loop
+ \advance\looprows 1
+ \ifnum\pal@get{if\the\looprows F}=1
+ \else
+ \ifnum\pal@get{if\the\looprows Fix}=0
+ \else
+ \edef\pal@calculategridwidthcalc{\pal@calculategridwidthcalc+10000*\pal@get{\the\looprows H}/\pal@get{\the\looprows W}}
+ \fi
+ \fi
+ \ifnum \looprows<\pal@rowscount
+ \repeat
+
+ \edef\pal@calculategridwidthcalc{\pal@calculategridwidthcalc)}
+ \pal@maxgridwidth=\dimexpr\pal@calculategridwidthcalc\relax
+}
+\newcommand\pal@calculatefullgridwidth{
+ \ifpal@isdoublepage
+ \pal@pagewidth * 2 - \pal@outermargin * 2
+ \ifpal@frontcover
+ \else
+ \ifpal@fanfold
+ \else
+ - \bindingoffset * 2
+ \fi
+ \fi
+ \else
+ \pal@pagewidth - \pal@innermargin - \pal@outermargin
+ \fi
+ + \pal@gutter
+}
+\newcommand\pal@calculaterealgridwidth{
+ \ifpal@isdoublepage
+ (\pal@pagewidth * 2 - \pal@outermargin * 2)
+ \else
+ (\pal@pagewidth - \pal@innermargin - \pal@outermargin)
+ \fi
+}
+\newcommand\pal@gridstartx[1]{
+ \ifdim\dimexpr#1\relax=\pal@undefdim
+ \ifpal@isdoublepage
+ (\pal@outermargin + \pal@leftbleed - \pal@gutter / 2
+ \ifpal@frontcover
+ \else
+ \ifpal@fanfold
+ \else
+ \ifpal@rightpage
+ + \bindingoffset * 2
+ \fi
+ \fi
+ \fi
+ )
+ \else
+ (\pal@leftmargin + \pal@leftbleed - \pal@gutter / 2)
+ \fi
+ \else%
+ \ifpal@isdoublepage
+ (#1 + \pal@leftbleed - \pal@gutter / 2
+ \ifpal@frontcover
+ \else
+ \ifpal@fanfold
+ \else
+ \ifpal@rightpage
+ + \bindingoffset * 2
+ \fi
+ \fi
+ \fi
+ )
+ \else
+ (#1 + \pal@leftbleed - \pal@gutter / 2)
+ \fi
+ \fi%
+}
+\newcommand\pal@gridstarty[1]{
+ \ifdim\dimexpr#1\relax=\pal@undefdim
+ (\pal@bottommargin + \pal@bottombleed - \pal@gutter / 2)%
+ \else%
+ (#1 + \pal@bottombleed - \pal@gutter / 2)
+ \fi%
+}
+\newcommand\pal@setdimensions{
+ \global\pal@gridfullfalse
+ \global\def\pal@framey{0}\global\def\pal@framex{0}\global\def\pal@frameyy{1}\global\def\pal@framexx{1}
+ \global\def\pal@frameyymax{0}\global\def\pal@framexxmax{0}
+ \paperheight=\dimexpr(\pal@pageheight + \pal@topbleed + \pal@bottombleed)\relax
+ \pal@gridoffsetx=\pal@null
+
+ \ifpal@isdoublepage
+ % doublepage
+ \ifpal@fanfold
+ \paperwidth=\dimexpr((\pal@pagewidth + \pal@outerbleed) * 2)\relax
+ \else
+ \paperwidth=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed)\relax
+ \ifpal@rightpage
+ \pal@gridoffsetx=\dimexpr(-\pal@pagewidth)\relax
+ \fi
+ \fi
+ \else
+ \ifpal@frontcover
+ % frontcover
+ \paperwidth=\dimexpr((\pal@pagewidth + \pal@outerbleed) * 2 + \spinewidth)\relax
+ \else
+ % page
+ \ifpal@fanfold
+ \paperwidth=\dimexpr((\pal@pagewidth + \pal@outerbleed) * 2)\relax
+ \ifpal@rightpage
+ \pal@gridoffsetx=\dimexpr(\pal@pagewidth + \pal@outerbleed - \pal@innerbleed)\relax
+ \fi
+ \else
+ \paperwidth=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed)\relax
+ \fi
+ \fi
+ \fi
+}
+
+% grid coordinates
+\newcommand\pal@coordxrow[3]{\ifdim\dimexpr#2\dimexpr1pt\relax\relax<\dimexpr(#3\dimexpr1pt\relax-#1sp)\relax\the\numexpr#3\relax\else\pal@coordxrow{#1}{#2}{\numexpr#3+1\relax}\fi}
+\newcommand\pal@coordxcell[2]{\ifnum\numexpr(10000*#1)\relax<\numexpr(#2*10000+1)\relax\the\numexpr#2\relax\else\pal@coordxcell{#1}{\numexpr#2+1\relax}\fi}
+\newcommand\pal@coordx[3]{
+ \pal@get{%
+ \pal@coordxrow{#1}{#2}{1}-%
+ \pal@coordxcell{#3}{1}%
+ WR%
+ }
+}
+\newcommand\posxcell[3]{
+ \ifnum#3>0
+ + \pal@coordx{#1}{#2}{#3}sp%
+ \fi%
+ \ifnum#3>1
+ \posxcell{#1}{#2}{\numexpr#3-1\relax}%
+ \fi%
+}
+\newcommand\posxrow[4]{
+ \ifdim#4\dimexpr1pt\relax<\dimexpr#3\dimexpr1pt\relax+1sp\relax
+ \pal@gridstartxdim + #4\dimexpr\pal@coordx{#1}{#2}{#3}sp\relax - \pal@coordx{#1}{#2}{#3}sp * \numexpr#3 - 1\relax\posxcell{#1}{#2}{\numexpr#3-1\relax}%
+ \else%
+ \posxrow{#1}{#2}{\numexpr#3+1\relax}{#4}%
+ \fi%
+}
+\newcommand\posx[4]{
+ \dimexpr(%
+ \posxrow{#1}{#2}{1}{#4}
+ + #3\pal@gutter / 2 + \pal@gridoffsetx + \pal@gridoffsethorizontal%
+ )\relax%
+}
+\newcommand\posycell[1]{
+ \ifnum#1>0
+ - \pal@get{#1HR} sp
+ \fi%
+ \ifnum#1>1
+ \posycell{\the\numexpr#1-1\relax}%
+ \fi%
+}
+\newcommand\posyrow[2]{
+ \ifdim#1\dimexpr1pt\relax<\dimexpr#2\dimexpr1pt\relax+1sp\relax
+ \pal@gridstartydim + \pal@maxgridheight - #1\dimexpr\pal@get{#2HR} sp\relax + \pal@get{#2HR} sp * \numexpr#2 - 1\relax\posycell{\the\numexpr#2-1\relax}%
+ \else
+ \posyrow{#1}{\the\numexpr#2+1\relax}%
+ \fi
+}
+\newcommand\posy[2]{
+ \dimexpr(%
+ \posyrow{#2}{1}
+ - #1\pal@gutter / 2 - \pal@gridoffsetvertical%
+ )\relax%
+}
+\newcommand\pal@gridhalign[1]{
+ \def\pal@horizontalpagealign{#1}
+}
+\newcommand\pal@gridvalign[1]{
+ \def\pal@verticalpagealign{#1}
+}
+\pal@gridhalign{0.5}
+\pal@gridvalign{0.5}
+\pal@isinitgridtrue
+\setgrid{{{1}}}
+
+% graphic
+\newif\ifpal@isvisible
+\newif\ifpal@calculatecrop
+\newdimen\pal@originalgraphicwidth\newdimen\pal@originalgraphicheight
+\newdimen\pal@cropx\newdimen\pal@cropy
+\newdimen\pal@cropleft\newdimen\pal@cropright
+\newdimen\pal@cropbottom\newdimen\pal@croptop
+\newdimen\pal@cropstart\newdimen\pal@cropend
+\newdimen\pal@snapleft\newdimen\pal@snapright
+\newdimen\pal@snapbottom\newdimen\pal@snaptop
+\newdimen\pal@viewportwidth\newdimen\pal@viewportheight
+\newdimen\pal@frameborderwidth
+\newdimen\pal@frameborderradius
+\newdimen\pal@frameshadowradius
+\newdimen\pal@snapcroptmp
+\newdimen\pal@overprint
+\pal@overprint=0pt
+\def\pal@cropleftside{
+ \ifdim\pal@x>\pal@cropstart
+ \ifdim\pal@x<\pal@cropend
+ \pal@snapleft=\dimexpr(\pal@x - \pal@cropstart)\relax
+ \pal@x=\dimexpr(\pal@cropstart)\relax
+ \fi
+ \fi
+}
+\def\pal@croprightside{
+ \ifdim\pal@xx>\pal@cropstart
+ \ifdim\pal@xx<\pal@cropend
+ \pal@snapright=\dimexpr(\pal@cropend - \pal@xx)\relax
+ \pal@xx=\dimexpr(\pal@cropend)\relax
+ \fi
+ \fi
+}
+\def\pal@snapsafezonevertical{
+ \pal@snapbottom=\pal@null
+ \pal@snaptop=\pal@null
+ \pal@cropstart=-\pal@overprint
+ \pal@cropend=\dimexpr(\pal@null + \pal@bottombleed + 1pt)\relax
+ \ifdim\pal@y>\pal@cropstart
+ \ifdim\pal@y<\pal@cropend
+ \pal@snapbottom=\dimexpr(\pal@y - \pal@cropstart)\relax
+ \pal@y=\dimexpr(\pal@cropstart)\relax
+ \fi
+ \fi
+ \pal@cropstart=\dimexpr(\pal@pageheight + \pal@bottombleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pageheight + \pal@bottombleed + \pal@topbleed + \pal@overprint)\relax
+ \ifdim\pal@yy>\pal@cropstart
+ \ifdim\pal@yy<\pal@cropend
+ \pal@snaptop=\dimexpr(\pal@cropend - \pal@yy)\relax
+ \pal@yy=\dimexpr(\pal@cropend)\relax
+ \fi
+ \fi
+}
+\def\pal@snapsafezonehorizontal{
+ \pal@snapleft=\pal@null
+ \pal@snapright=\pal@null
+ \ifpal@isdoublepage
+ % doublepage
+ \ifpal@fanfold
+ \pal@cropstart=-\pal@overprint
+ \pal@cropend=\dimexpr(\pal@null + \pal@leftbleed + 1pt)\relax
+ \pal@cropleftside
+ \pal@cropstart=\dimexpr(\pal@pagewidth * 2 + \pal@outerbleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth * 2 + \pal@outerbleed * 2 + \pal@overprint)\relax
+ \pal@croprightside
+ \else
+ \pal@cropstart=-\pal@overprint
+ \pal@cropend=\dimexpr(\pal@null + \pal@leftbleed + 1pt)\relax
+ \pal@cropleftside
+ \pal@cropstart=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed - \pal@rightbleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed + \pal@overprint)\relax
+ \pal@croprightside
+ \ifpal@leftpage
+ \pal@cropstart=\dimexpr(\pal@pagewidth * 2 + \pal@outerbleed - \bindingoffset * 2 - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth * 2 + \pal@outerbleed + \pal@outerbleed - \bindingoffset * 2 + \pal@overprint)\relax
+ \pal@croprightside
+ \else
+ \pal@cropstart=\dimexpr(\pal@innerbleed -\pal@pagewidth - \pal@outerbleed + \bindingoffset * 2 - \pal@overprint)\relax
+ \pal@cropend=\dimexpr(-\pal@pagewidth + \pal@innerbleed + \bindingoffset * 2 + 1pt)\relax
+ \pal@cropleftside
+ \fi
+ \fi
+ \else
+ % frontcover
+ \ifpal@frontcover
+ \ifpal@cover
+ \ifpal@backcover
+ \pal@cropstart=-\pal@overprint
+ \pal@cropend=\dimexpr(\pal@null + \pal@leftbleed + 1pt)\relax
+ \else
+ \pal@cropstart=\dimexpr(\pal@pagewidth + \pal@outerbleed)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth + \pal@outerbleed + \spinewidth + 1pt)\relax
+ \fi
+ \pal@cropleftside
+ \ifpal@backcover
+ \pal@cropstart=\dimexpr(\pal@pagewidth + \pal@outerbleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth + \pal@outerbleed)\relax
+ \else
+ \pal@cropstart=\dimexpr(\pal@pagewidth * 2 + \spinewidth + \pal@outerbleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth * 2 + \pal@outerbleed * 2 + \spinewidth + \pal@overprint)\relax
+ \fi
+ \pal@croprightside
+ \else
+ \pal@cropstart=-\pal@overprint
+ \pal@cropend=\dimexpr(\pal@null + \pal@leftbleed + 1pt)\relax
+ \pal@cropleftside
+ \pal@cropstart=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed - \pal@rightbleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed + \pal@overprint)\relax
+ \pal@croprightside
+ \fi
+ \else
+ % page
+ \ifpal@fanfold
+ \pal@cropstart=-\pal@overprint
+ \pal@cropend=\dimexpr(\pal@null + \pal@leftbleed + 1pt)\relax
+ \pal@cropleftside
+ \pal@cropstart=\dimexpr(\pal@pagewidth * 2 + \pal@outerbleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth * 2 + \pal@outerbleed * 2 + \pal@overprint)\relax
+ \pal@croprightside
+ \else
+ \pal@cropstart=-\pal@overprint
+ \pal@cropend=\dimexpr(\pal@null + \pal@leftbleed + 1pt)\relax
+ \pal@cropleftside
+ \pal@cropstart=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed - \pal@rightbleed - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed + \pal@overprint)\relax
+ \pal@croprightside
+ \fi
+ \fi
+ \fi
+}
+\pgfkeys{
+ /graphic/.is family,
+ /graphic,
+ file/.store in=\pal@graphicoptionfile,
+ scale/.store in=\pal@graphicoptionscale,
+ vpos/.store in=\pal@graphicoptionvpos,
+ hpos/.store in=\pal@graphicoptionhpos,
+ unsharp/.store in=\pal@graphicoptionunsharp,
+ border/.forward to=/defaultborder/name,
+ border radius/.forward to=/defaultborder/radius,
+ border width/.forward to=/defaultborder/width,
+ border color/.forward to=/defaultborder/color,
+ border opacity/.forward to=/defaultborder/opacity,
+ shadow/.forward to=/defaultshadow/name,
+ shadow size/.forward to=/defaultshadow/size,
+ shadow color/.forward to=/defaultshadow/color,
+ shadow opacity/.forward to=/defaultshadow/opacity,
+ shadow xshift/.forward to=/defaultshadow/xshift,
+ shadow yshift/.forward to=/defaultshadow/yshift,
+}
+\def\pal@checkvisibility{
+ \pal@isvisibletrue
+
+ \ifpal@frontcover
+ \else
+ \ifpal@fanfold
+ \else
+ \ifpal@isdoublepage
+ \ifpal@leftpage
+ \pal@cropstart=\dimexpr(\pal@pagewidth + \pal@outerbleed - \bindingoffset - 1pt)\relax
+ \pal@cropend=\dimexpr(\pal@pagewidth + \pal@outerbleed + \pal@innerbleed)\relax
+ \ifdim\pal@x>\pal@cropstart
+ \pal@isvisiblefalse
+ \fi
+ \else
+ \pal@cropstart=\dimexpr(\pal@null)\relax
+ \pal@cropend=\dimexpr(\pal@null + \pal@leftbleed + \bindingoffset + 1pt)\relax
+ \ifdim\pal@xx<\pal@cropend
+ \pal@isvisiblefalse
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\def\pal@snapoptimizedgraphic{
+ \ifdim\pal@snapleft>\pal@null
+ \width=\dimexpr\width+\pal@snapleft\relax
+ \fi
+ \ifdim\pal@snapright>\pal@null
+ \width=\dimexpr\width+\pal@snapright\relax
+ \fi
+ \ifdim\pal@snaptop>\pal@null
+ \height=\dimexpr\height+\pal@snaptop\relax
+ \fi
+ \ifdim\pal@snapbottom>\pal@null
+ \height=\dimexpr\height+\pal@snapbottom\relax
+ \fi
+}
+\def\pal@snapgraphic{
+ \pgfmathqparse{(\pal@originalgraphicheight-\pal@croptop-\pal@cropbottom)/\height}
+ \edef\pal@scale{\pgfmathresult}
+ \pgfmathqparse{\height/(\pal@originalgraphicheight-\pal@croptop-\pal@cropbottom)}
+ \edef\pal@scalerez{\pgfmathresult}
+
+ % snap
+ \ifdim\pal@snapleft>\pal@null
+ \ifdim\pal@cropleft>\pal@null
+ \ifdim\pal@scale\pal@snapleft>\pal@cropleft
+ \pal@snapbleedleft=\pal@cropleft
+ \pal@snapleft=\dimexpr\pal@snapleft-\pal@scalerez\pal@cropleft\relax
+ \width=\dimexpr\width+\pal@scalerez\pal@cropleft\relax
+ \pal@cropleft=\pal@null
+ \else
+ \pal@snapbleedleft=\dimexpr\pal@scale\pal@snapleft\relax
+ \pal@cropleft=\dimexpr\pal@cropleft-\pal@scale\pal@snapleft\relax
+ \width=\dimexpr\width+\pal@snapleft\relax
+ \pal@snapleft=\pal@null
+ \fi
+ \fi
+ \fi
+ \ifdim\pal@snapright>\pal@null
+ \ifdim\pal@cropright>\pal@null
+ \ifdim\pal@scale\pal@snapright>\pal@cropright
+ \pal@snapbleedright=\pal@cropright
+ \pal@snapright=\dimexpr\pal@snapright-\pal@scalerez\pal@cropright\relax
+ \width=\dimexpr\width+\pal@scalerez\pal@cropright\relax
+ \pal@cropright=\pal@null
+ \else
+ \pal@snapbleedright=\dimexpr\pal@scale\pal@snapright\relax
+ \pal@cropright=\dimexpr\pal@cropright-\pal@scale\pal@snapright\relax
+ \width=\dimexpr\width+\pal@snapright\relax
+ \pal@snapright=\pal@null
+ \fi
+ \fi
+ \fi
+ \ifdim\pal@snaptop>\pal@null
+ \ifdim\pal@croptop>\pal@null
+ \ifdim\pal@scale\pal@snaptop>\pal@croptop
+ \pal@snapbleedtop=\pal@croptop
+ \pal@snaptop=\dimexpr\pal@snaptop-\pal@scalerez\pal@croptop\relax
+ \height=\dimexpr\height+\pal@scalerez\pal@croptop\relax
+ \pal@croptop=\pal@null
+ \else
+ \pal@snapbleedtop=\dimexpr\pal@scale\pal@snaptop\relax
+ \pal@croptop=\dimexpr\pal@croptop-\pal@scale\pal@snaptop\relax
+ \height=\dimexpr\height+\pal@snaptop\relax
+ \pal@snaptop=\pal@null
+ \fi
+ \fi
+ \fi
+ \ifdim\pal@snapbottom>\pal@null
+ \ifdim\pal@cropbottom>\pal@null
+ \ifdim\pal@scale\pal@snapbottom>\pal@cropbottom
+ \pal@snapbleedbottom=\pal@cropbottom
+ \pal@snapbottom=\dimexpr\pal@snapbottom-\pal@scalerez\pal@cropbottom\relax
+ \height=\dimexpr\height+\pal@scalerez\pal@cropbottom\relax
+ \pal@cropbottom=\pal@null
+ \else
+ \pal@snapbleedbottom=\dimexpr\pal@scale\pal@snapbottom\relax
+ \pal@cropbottom=\dimexpr\pal@cropbottom-\pal@scale\pal@snapbottom\relax
+ \height=\dimexpr\height+\pal@snapbottom\relax
+ \pal@snapbottom=\pal@null
+ \fi
+ \fi
+ \fi
+
+ % move
+ \ifdim\pal@snapbottom=\pal@null
+ \ifdim\pal@snaptop=\pal@null
+ \ifdim\pal@snapright>\pal@null
+ \ifdim\pal@cropleft>\pal@null
+ \ifdim\pal@scale\pal@snapright>\pal@cropleft
+ \pal@snapright=\dimexpr\pal@snapright-\pal@scalerez\pal@cropleft\relax
+ \width=\dimexpr\width+\pal@scalerez\pal@cropleft\relax
+ \pal@cropleft=\pal@null
+ \else
+ \pal@cropleft=\dimexpr\pal@cropleft-\pal@scale\pal@snapright\relax
+ \width=\dimexpr\width+\pal@snapright\relax
+ \pal@snapright=\pal@null
+ \fi
+ \fi
+ \fi
+ \ifdim\pal@snapleft>\pal@null
+ \ifdim\pal@cropright>\pal@null
+ \ifdim\pal@scale\pal@snapleft>\pal@cropright
+ \pal@snapleft=\dimexpr\pal@snapleft-\pal@scalerez\pal@cropright\relax
+ \width=\dimexpr\width+\pal@scalerez\pal@cropright\relax
+ \pal@cropright=\pal@null
+ \else
+ \pal@cropright=\dimexpr\pal@cropright-\pal@scale\pal@snapleft\relax
+ \width=\dimexpr\width+\pal@snapleft\relax
+ \pal@snapleft=\pal@null
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifdim\pal@snapleft=\pal@null
+ \ifdim\pal@snapright=\pal@null
+ \ifdim\pal@snaptop>\pal@null
+ \ifdim\pal@cropbottom>\pal@null
+ \ifdim\pal@scale\pal@snaptop>\pal@cropbottom
+ \pal@snaptop=\dimexpr\pal@snaptop-\pal@scalerez\pal@cropbottom\relax
+ \height=\dimexpr\height+\pal@scalerez\pal@cropbottom\relax
+ \pal@cropbottom=\pal@null
+ \else
+ \pal@cropbottom=\dimexpr\pal@cropbottom-\pal@scale\pal@snaptop\relax
+ \height=\dimexpr\height+\pal@snaptop\relax
+ \pal@snaptop=\pal@null
+ \fi
+ \fi
+ \fi
+ \ifdim\pal@snapbottom>\pal@null
+ \ifdim\pal@croptop>\pal@null
+ \ifdim\pal@scale\pal@snapbottom>\pal@croptop
+ \pal@snapbottom=\dimexpr\pal@snapbottom-\pal@scalerez\pal@croptop\relax
+ \height=\dimexpr\height+\pal@scalerez\pal@croptop\relax
+ \pal@croptop=\pal@null
+ \else
+ \pal@croptop=\dimexpr\pal@croptop-\pal@scale\pal@snapbottom\relax
+ \height=\dimexpr\height+\pal@snapbottom\relax
+ \pal@snapbottom=\pal@null
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\newdimen\pal@snapcropoffset
+\newdimen\pal@snapbleedleft\newdimen\pal@snapbleedright
+\newdimen\pal@snapbleedtop\newdimen\pal@snapbleedbottom
+\def\pal@hscalegraphic{
+ \pgfmathqparse{\width/(\width+\pal@snapleft+\pal@snapright)}
+ \edef\pal@snapscale{\pgfmathresult}
+ \pal@snapcroptmp=\dimexpr\pal@originalgraphicheight-\pal@cropbottom-\pal@croptop-\pal@snapscale\pal@originalgraphicheight+\pal@snapscale\pal@cropbottom+\pal@snapscale\pal@croptop\relax
+ \pal@snapcropoffset=\dimexpr\pal@snapbleedbottom-\pal@snapscale\pal@snapbleedbottom-\pal@snapbleedtop+\pal@snapscale\pal@snapbleedtop\relax
+ \pal@cropbottom=\dimexpr\pal@cropbottom+0.5\pal@snapcroptmp+0.5\pal@snapcropoffset\relax
+ \pal@croptop=\dimexpr\pal@croptop+0.5\pal@snapcroptmp-0.5\pal@snapcropoffset\relax
+
+ \width=\dimexpr\width+\pal@snapleft+\pal@snapright\relax
+ \pal@snapright=\pal@null
+ \pal@snapleft=\pal@null
+}
+\def\pal@vscalegraphic{
+ \pgfmathqparse{\height/(\height+\pal@snaptop+\pal@snapbottom)}
+ \edef\pal@snapscale{\pgfmathresult}
+ \pal@snapcroptmp=\dimexpr\pal@originalgraphicwidth-\pal@cropleft-\pal@cropright-\pal@snapscale\pal@originalgraphicwidth+\pal@snapscale\pal@cropleft+\pal@snapscale\pal@cropright\relax
+ \pal@snapcropoffset=\dimexpr\pal@snapbleedleft-\pal@snapscale\pal@snapbleedleft-\pal@snapbleedright+\pal@snapscale\pal@snapbleedright\relax
+ \pal@cropleft=\dimexpr\pal@cropleft+0.5\pal@snapcroptmp+0.5\pal@snapcropoffset\relax
+ \pal@cropright=\dimexpr\pal@cropright+0.5\pal@snapcroptmp-0.5\pal@snapcropoffset\relax
+
+ \height=\dimexpr\height+\pal@snaptop+\pal@snapbottom\relax
+ \pal@snaptop=\pal@null
+ \pal@snapbottom=\pal@null
+}
+\def\pal@getbase#1{\edef\Gin@base{\filename@area\filename@base}\edef\Gin@ext{#1}}
+\let\pal@getbaseorginal\Gin@getbase
+\def\pal@disablegraphicsfilecheck{
+ \let\Gin@getbase\pal@getbase
+}
+\def\pal@enablegraphicsfilecheck{
+ \let\Gin@getbase\pal@getbaseorginal
+}
+\let\pal@setfileorginal\Gin@setfile
+\def\pal@setfile#1#2#3{
+ \global\edef\pal@currfilebase{\Gin@base}
+ \global\edef\pal@currfileext{\Gin@ext}
+ \global\@onelevel@sanitize\pal@currfileext
+}
+\edef\pal@extjpeg{.jpeg}\@onelevel@sanitize\pal@extjpeg
+\edef\pal@extJPEG{.JPEG}\@onelevel@sanitize\pal@extJPEG
+\edef\pal@extjpg{.jpg}\@onelevel@sanitize\pal@extjpg
+\edef\pal@extJPG{.JPG}\@onelevel@sanitize\pal@extJPG
+\edef\pal@extpng{.png}\@onelevel@sanitize\pal@extpng
+\edef\pal@extPNG{.PNG}\@onelevel@sanitize\pal@extPNG
+\def\isoptimizable#1#2{
+ \ifx#1\pal@extjpg
+ \def\pal@optimizedext{.jpg}#2
+ \else
+ \ifx#1\pal@extJPG
+ \def\pal@optimizedext{.jpg}#2
+ \else
+ \ifx#1\pal@extjpeg
+ \def\pal@optimizedext{.jpg}#2
+ \else
+ \ifx#1\pal@extJPEG
+ \def\pal@optimizedext{.jpg}#2
+ \else
+ \ifx#1\pal@extpng
+ \def\pal@optimizedext{.png}#2
+ \else
+ \ifx#1\pal@extPNG
+ \def\pal@optimizedext{.png}#2
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\def\newgraphic#1#2{
+ \expandafter\newcommand\csname pal@graphic@#1\endcsname[2][0]{%
+ \ifnum##1=0
+ \pgfkeys{pagegraphic,file={#1},scale=1,vpos=0.5,hpos=0.5,unsharp=\pal@unsharp,#2,##2}
+ \else
+ \ifnum##1=1
+ \pgfkeys{backcoverpagegraphic,file={#1},scale=1,vpos=0.5,hpos=0.5,unsharp=\pal@unsharp,#2}
+ \else
+ \pgfkeys{graphic,file={#1},scale=1,vpos=0.5,hpos=0.5,unsharp=\pal@unsharp,#2,##2}
+ \fi
+ \fi
+ }%
+}
+\newcommand\pal@putgraphic[6][]{
+ \pal@x=\posx{1}{#2}{1}{#3}
+ \pal@yy=\posy{1}{#2}
+ \pal@xx=\posx{-1}{#4}{-1}{#5}
+ \pal@y=\posy{-1}{#4}
+
+ \pal@checkvisibility
+
+ \ifpal@isvisible
+ \pal@cropleft=\pal@null
+ \pal@cropbottom=\pal@null
+ \pal@cropright=\pal@null
+ \pal@croptop=\pal@null
+
+ \width=\dimexpr(\pal@xx - \pal@x)\relax
+ \height=\dimexpr(\pal@yy - \pal@y)\relax
+
+ % safezone horizontal
+ \pal@snapsafezonehorizontal
+
+ % safezone vertical
+ \pal@snapsafezonevertical
+
+ \pal@snapbleedleft=\pal@null
+ \pal@snapbleedright=\pal@null
+ \pal@snapbleedtop=\pal@null
+ \pal@snapbleedbottom=\pal@null
+
+ \begingroup
+ \xdef\pal@filename{#6-\pal@density-\pal@graphicoptionscale-\pal@graphicoptionhpos-\pal@graphicoptionvpos-\the\numexpr\pal@snaptop\relax-\the\numexpr\pal@snapright\relax-\the\numexpr\pal@snapbottom\relax-\the\numexpr\pal@snapleft\relax-\the\numexpr\width\relax-\the\numexpr\height\relax-\pal@downsamplethreshold-\pal@graphicoptionunsharp-\pal@quality}
+ \ifpal@optimize
+ \IfFileExists{./cache/\pal@filename/g.jpg}{
+ \def\pal@nextincludegraphic{\includegraphics[width=\width]{cache/\pal@filename/g.jpg}}
+ }{
+ \IfFileExists{./cache/\pal@filename/g.png}{
+ \def\pal@nextincludegraphic{\includegraphics[width=\width]{cache/\pal@filename/g.png}}
+ }{
+ \pal@calculatecroptrue
+ }
+ }
+
+ \ifpal@preflight
+ \pal@calculatecroptrue
+ \fi
+ \else
+ \pal@calculatecroptrue
+ \fi
+
+ \ifpal@calculatecrop
+ \global\edef\pal@currfilebase{}
+ \global\edef\pal@currfileext{}
+ \let\Gin@setfile\pal@setfile
+ \Ginclude@graphics#6
+ \let\Gin@setfile\pal@setfileorginal
+ \ifx\pal@currfileext\pal@emptystring
+ \pal@calculatecropfalse
+ \def\pal@nextincludegraphic{}
+ \fi
+ \fi
+
+ \pal@disablegraphicsfilecheck
+ \ifpal@calculatecrop
+ % graphic crop
+ \settowidth{\pal@originalgraphicwidth}{\includegraphics{\pal@currfilebase\pal@currfileext}}
+ \settoheight{\pal@originalgraphicheight}{\includegraphics{\pal@currfilebase\pal@currfileext}}
+ \pgfmathqparse{1pt-\pal@graphicoptionvpos pt}
+ \edef\pal@graphicoptionvpos{\pgfmathresult}
+ \pgfmathqparse{\pal@originalgraphicwidth/\pal@originalgraphicheight}
+ \edef\pal@graphicratio{\pgfmathresult}
+ \pgfmathqparse{\width/\height}
+ \edef\pal@vpratio{\pgfmathresult}
+ \pgfmathqparse{\pal@graphicratio pt>\pal@vpratio pt}
+ \ifnum\pgfmathresult=1
+ \pal@cropx=\dimexpr(\numexpr(\pal@originalgraphicwidth - \width * \pal@originalgraphicheight / \height)\relax sp)\relax
+ \pal@cropy=\pal@null
+ \else
+ \pal@cropy=\dimexpr(\numexpr(\pal@originalgraphicheight - \height * \pal@originalgraphicwidth / \width)\relax sp)\relax
+ \pal@cropx=\pal@null
+ \fi
+ \pal@viewportwidth=\dimexpr\pal@originalgraphicwidth-\pal@cropx\relax
+ \pal@viewportheight=\dimexpr\pal@originalgraphicheight-\pal@cropy\relax
+ \pgfmathqparse{1pt/\pal@graphicoptionscale pt}
+ \edef\pal@reciprocalscale{\pgfmathresult}
+ \pal@cropx=\dimexpr\pal@cropx + \pal@viewportwidth - \pal@reciprocalscale\pal@viewportwidth\relax
+ \pal@cropy=\dimexpr\pal@cropy + \pal@viewportheight - \pal@reciprocalscale\pal@viewportheight\relax
+ \ifdim\pal@cropx>\pal@null
+ \pal@cropleft=\dimexpr(\pal@graphicoptionhpos\pal@cropx)\relax
+ \ifdim\pal@cropleft<\pal@null
+ \pal@cropleft=\pal@null
+ \fi
+ \ifdim\pal@cropleft>\pal@cropx
+ \pal@cropleft=\pal@cropx
+ \fi
+ \pal@cropright=\dimexpr(\pal@cropx - \pal@cropleft)\relax
+ \fi
+ \ifdim\pal@cropy>\pal@null
+ \pal@cropbottom=\dimexpr(\pal@graphicoptionvpos\pal@cropy)\relax
+ \ifdim\pal@cropbottom<\pal@null
+ \pal@cropbottom=\pal@null
+ \fi
+ \ifdim\pal@cropbottom>\pal@cropy
+ \pal@cropbottom=\pal@cropy
+ \fi
+ \pal@croptop=\dimexpr(\pal@cropy - \pal@cropbottom)\relax
+ \fi
+
+ \pal@snapgraphic
+ \ifdim\dimexpr\pal@snapleft+\pal@snapright\relax=\pal@null
+ \ifdim\dimexpr\pal@snaptop+\pal@snapbottom\relax>\pal@null
+ \pal@vscalegraphic
+ \fi
+ \else
+ \ifdim\dimexpr\pal@snaptop+\pal@snapbottom\relax=\pal@null
+ \ifdim\dimexpr\pal@snapleft+\pal@snapright\relax>\pal@null
+ \pal@hscalegraphic
+ \fi
+ \else
+ \ifdim\dimexpr\width/(\pal@snapleft + \pal@snapright)\relax<\dimexpr\height/(\pal@snaptop + \pal@snapbottom)\relax
+ \pal@hscalegraphic
+
+ \pal@snapgraphic
+ \else
+ \pal@vscalegraphic
+
+ \pal@snapgraphic
+ \fi
+ \fi
+ \fi
+
+ \ifdim\pal@snapleft>\pal@null
+ \pal@x=\dimexpr\pal@x+\pal@snapleft\relax
+ \fi
+ \ifdim\pal@snapbottom>\pal@null
+ \pal@y=\dimexpr\pal@y+\pal@snapbottom\relax
+ \fi
+ \else
+ \pal@snapoptimizedgraphic
+ \fi
+
+ \ifdefined\pal@nextincludegraphic
+ \else
+ \ifpal@optimize
+ \ifpal@isbatchmode
+ \isoptimizable{\pal@currfileext}{\pal@addtobatchlist{\pal@currfilebase}{\pal@currfileext}}
+ \def\pal@nextincludegraphic{}
+ \else
+ \isoptimizable{\pal@currfileext}{\pal@optimizegraphic{\pal@currfilebase}{\pal@currfileext}}
+ \ifdefined\pal@optimizedext
+ \IfFileExists{./cache/\pal@filename/g\pal@optimizedext}{
+ \def\pal@nextincludegraphic{\includegraphics[width=\width]{cache/\pal@filename/g\pal@optimizedext}}
+ }{
+ \ifx\pal@processresult\pal@ok
+ \ClassError{pagelayout}{Unexpected error. File not optimized}{File `cache/#6/g\pal@optimizedext' not found.\MessageBreak Try to delete the `cache' directory.\MessageBreak\MessageBreak\@ehc}
+ \fi
+ \def\pal@nextincludegraphic{\includegraphics[trim={\pal@cropleft} {\pal@cropbottom} {\pal@cropright} {\pal@croptop},\pal@clip,width=\width]{\pal@currfilebase\pal@currfileext}}
+ }
+ \else
+ \def\pal@nextincludegraphic{\includegraphics[trim={\pal@cropleft} {\pal@cropbottom} {\pal@cropright} {\pal@croptop},\pal@clip,width=\width]{\pal@currfilebase\pal@currfileext}}
+ \fi
+ \fi
+ \else
+ \def\pal@nextincludegraphic{\includegraphics[trim={\pal@cropleft} {\pal@cropbottom} {\pal@cropright} {\pal@croptop},\pal@clip,width=\width]{\pal@currfilebase\pal@currfileext}}
+ \fi
+ \fi
+
+ \ifdim\pal@defaultborderradius>0.5\height
+ \def\pal@defaultborderradius{0.5\height}
+ \fi
+ \ifdim\pal@defaultborderradius>0.5\width
+ \def\pal@defaultborderradius{0.5\width}
+ \fi
+
+ \pal@frameborderwidth=\dimexpr\pal@defaultborderwidth\relax
+ \ifdim\pal@defaultborderradius=0pt
+ \pal@frameborderradius=0pt
+ \pal@frameshadowradius=0pt
+ \else
+ \pal@frameborderradius=\dimexpr\pal@defaultborderradius+0.5\pal@frameborderwidth\relax
+ \pal@frameshadowradius=\dimexpr\pal@defaultborderradius+\pal@frameborderwidth\relax
+ \fi
+
+ % draw shadow
+ \ifpal@isbatchmode
+ \else
+ \def\pal@frameshadowoffsetx{\pal@frameborderwidth}
+ \def\pal@frameshadowoffsety{\pal@frameborderwidth}
+ \def\pal@frameshadowwidth{\dimexpr\width+10cm+2\pal@frameborderwidth\relax}
+ \def\pal@frameshadowheight{\dimexpr\height+10cm+2\pal@frameborderwidth\relax}
+ \def\pal@frameshadowframewidth{\dimexpr\width+2\pal@frameborderwidth\relax}
+ \def\pal@frameshadowframeheight{\dimexpr\height+2\pal@frameborderwidth\relax}
+ \def\pal@frameshadowborder{\dimexpr5cm\relax}
+ \pal@drawshadow
+ \fi
+
+ % draw graphic and border
+ \ifpal@isbatchmode
+ \pal@ismaskrequiredfalse
+ \def\pal@nextincludegraphic{}
+ \else
+ \ifpal@isperformancemode
+ \ifdim\pal@defaultborderwidth>0pt
+ \pal@ismaskrequiredtrue
+ \else
+ \ifdim\pal@defaultborderradius>0pt
+ \pal@ismaskrequiredtrue
+ \else
+ \pal@ismaskrequiredfalse
+ \fi
+ \fi
+ \else
+ \pal@ismaskrequiredtrue
+ \fi
+ \fi
+
+ \ifpal@ismaskrequired
+ \def\pal@clip{}%
+ \else
+ \def\pal@clip{clip}%
+ \fi
+
+ \put(\pal@dimentonumber{\pal@x},\pal@dimentonumber{\pal@y}){%
+ \ifpal@ismaskrequired%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+ \ifdim\pal@defaultborderwidth>0pt
+ \draw[draw=\pal@defaultbordercolor,draw opacity=\pal@defaultborderopacity,line width=\pal@frameborderwidth,rounded corners=\pal@frameborderradius] (-0.5\pal@frameborderwidth,-0.5\pal@frameborderwidth) rectangle ++(\width+\pal@frameborderwidth,\height+\pal@frameborderwidth);%
+ \fi
+
+ \draw[draw opacity=0,rounded corners=\pal@defaultborderradius,path picture={
+ \node at (0.5\width,0.5\height){
+ \pal@nextincludegraphic
+ };
+ }] (0,0) rectangle ++(\width,\height);%
+ \end{tikzpicture}%
+ \else%
+ \pal@nextincludegraphic
+ \fi%
+ }
+
+ \pal@enablegraphicsfilecheck
+
+ % draw ppi
+ \ifpal@preflight
+ \ifx\pal@nextincludegraphic\pal@emptystring
+ \else
+ \isoptimizable{\pal@currfileext}{\pal@getppi{\pal@currfilebase\pal@currfileext}}
+ \ifdefined\pal@graphicdensity
+ \pal@drawppi{#2}{#3}{#4}{#5}{#6}{\pal@graphicdensity}
+ \fi
+ \fi
+ \fi
+ \endgroup
+ \fi
+}
+\newcommand\pal@drawppi[6]{
+ \pal@x=\posx{1}{#1}{1}{#2}
+ \pal@yy=\posy{1}{#1}
+ \pal@xx=\posx{-1}{#3}{-1}{#4}
+ \pal@y=\posy{-1}{#3}
+ \width=\dimexpr(\pal@xx - \pal@x)\relax
+ \height=\dimexpr(\pal@yy - \pal@y)\relax
+ \pal@x=\dimexpr(\pal@x + \width)\relax
+ \pal@y=\dimexpr(\pal@y + \height)\relax
+ \ifdim\pal@x>\dimexpr\pal@pagewidth+\pal@innerbleed+\pal@outerbleed\relax
+ \pal@x=\dimexpr\pal@pagewidth+\pal@innerbleed+\pal@outerbleed\relax
+ \fi
+ \ifdim\pal@y>\dimexpr\pal@pageheight+\pal@topbleed+\pal@bottombleed\relax
+ \pal@y=\dimexpr\pal@pageheight+\pal@topbleed+\pal@bottombleed\relax
+ \fi
+ \def\pal@ppicolor{green!50!black}
+ \def\pal@ppicolortext{white}
+ \ifnum#6<300
+ \def\pal@ppicolor{yellow}
+ \def\pal@ppicolortext{black}
+ \ifnum#6<200
+ \def\pal@ppicolor{red}
+ \def\pal@ppicolortext{white}
+ \pal@errmsg@lowdensity{1}{#5}{#6}
+ \else
+ \pal@errmsg@lowdensity{0}{#5}{#6}
+ \fi
+ \fi
+ \put(\pal@dimentonumber{\pal@x},\pal@dimentonumber{\pal@y}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+ \node[fill=\pal@ppicolor,fill opacity=0.9,line width=0pt,anchor=north east] at (0,0){
+ \color{\pal@ppicolortext}\textbf{#6ppi}
+ };
+ \end{tikzpicture}%
+ }
+}
+
+% pagegraphic
+\def\pal@pagegraphic{}
+\pgfkeys{
+ /pagegraphic/.is family,
+ /pagegraphic,
+ file/.store in=\pal@pagegraphic,
+ scale/.store in=\pal@pagegraphicoptionscale,
+ vpos/.store in=\pal@pagegraphicoptionvpos,
+ hpos/.store in=\pal@pagegraphicoptionhpos,
+ unsharp/.store in=\pal@pagegraphicoptionunsharp,
+}
+\pgfkeys{
+ /backcoverpagegraphic/.is family,
+ /backcoverpagegraphic,
+ file/.store in=\pal@backcoveroptionpagegraphicfile,
+ scale/.store in=\pal@backcoveroptionpagegraphicscale,
+ vpos/.store in=\pal@backcoveroptionpagegraphicvpos,
+ hpos/.store in=\pal@backcoveroptionpagegraphichpos,
+ unsharp/.store in=\pal@backcoveroptionpagegraphicunsharp,
+}
+\def\pal@putpagegraphic{
+ \begingroup
+ \margin=\pal@null
+ \topmargin=\pal@null
+ \bottommargin=\pal@null
+ \innermargin=\pal@null
+ \outermargin=\pal@null
+ \setgrid{{{1}}}
+ \pgfkeys{graphic,scale=\pal@pagegraphicoptionscale,hpos=\pal@pagegraphicoptionhpos,vpos=\pal@pagegraphicoptionvpos,unsharp=\pal@pagegraphicoptionunsharp,border width=0pt,border radius=0pt,shadow size=0,shadow xshift=0pt,shadow yshift=0pt}
+ \pal@putgraphic{0}{0}{1}{1}{\pal@pagegraphic}
+ \endgroup
+}
+\newcommand\setpagegraphic[2][]{
+ \ifcsname pal@graphic@#2\endcsname%
+ \csname pal@graphic@#2\endcsname{#1}
+ \else%
+ \pgfkeys{pagegraphic,file={#2},scale=1,vpos=0.5,hpos=0.5,unsharp=\pal@unsharp,#1}
+ \fi
+}
+\def\nopagegraphic{\setpagegraphic{}}
+
+% text
+\newdimen\pal@textboxheight
+\newdimen\pal@textboxwidth
+\newdimen\pal@leftwidth
+\newdimen\pal@rightwidth
+\newcommand\pal@checkside[1]{
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \pal@leftwidth=\dimexpr(\pal@pagewidth + \pal@outerbleed - \pal@x)\relax
+ \pal@rightwidth=\dimexpr(\pal@xx - \pal@pagewidth - \pal@outerbleed)\relax
+ \ifdim\pal@rightwidth>\pal@leftwidth
+ \ifnum#1=1
+ \pal@leftpagefalse
+ \pal@rightpagetrue
+ \else
+ \pal@leftpagetrue
+ \pal@rightpagefalse
+ \fi
+ \addtocounter{page}{#1}
+ \fi
+ \fi
+ \fi
+}
+\def\pal@textoptionbottom{bottom}
+\def\pal@textoptioncenter{center}
+\newif\ifpal@text@option@top
+\newif\ifpal@text@option@center
+\newif\ifpal@text@option@bottom
+\newif\ifpal@text@option@parbox
+\newif\ifpal@text@option@breakable
+\let\originaltcbset\tcbset
+\pgfkeys{
+ /inittext/.is family,
+ /inittext,
+ color/.code={\color{#1}},
+ coltext/.forward to=/inittext/color,
+ boxrule/.code={\def\pal@defaultborderwidth{#1}\def\pal@text@option@leftrule{#1}\def\pal@text@option@rightrule{#1}\def\pal@text@option@toprule{#1}\def\pal@text@option@bottomrule{#1}},
+ toprule/.code={\def\pal@text@option@toprule{#1}},
+ rightrule/.code={\def\pal@text@option@rightrule{#1}},
+ bottomrule/.code={\def\pal@text@option@bottomrule{#1}},
+ leftrule/.code={\def\pal@text@option@leftrule{#1}},
+ height/.code={\def\pal@text@option@height{#1}},
+ arc/.code={\ifdim\pal@null=\dimexpr#1\relax\originaltcbset{outer arc=#1}\else\originaltcbset{auto outer arc}\fi\def\pal@defaultborderradius{#1}},
+ colframe/.store in=\pal@defaultbordercolor,
+ opacityframe/.store in=\pal@defaultborderopacity,
+ breakable/.is if=pal@text@option@breakable,
+ .unknown/.code=,
+ library/.unknown/.code=,
+}
+\renewcommand\tcbset[1]{\originaltcbset{#1}\pgfkeys{inittext,#1}}
+\tcbset{
+ boxrule=0pt,
+ boxsep=0pt,left=0pt,right=0pt,top=0pt,bottom=0pt,
+ opacityframe=1,
+ colframe=black,
+ opacityback=0,
+ arc=0pt,
+}
+\pgfkeysdef{/text/border}{
+ \ifcsname pal@border@#1\endcsname
+ \csname pal@border@#1\endcsname[1]{}
+ \else
+ \pgfkeys{textborder,opacity=1,width=0pt,color=black,radius=0pt}
+ \pal@errmsg@undefined{border}{#1}
+ \fi
+}
+\pgfkeys{
+ /text/.is family,
+ /text,
+ name/.store in=\pal@text@option@name,
+ color/.code={\originaltcbset{coltext=#1}\def\pal@text@option@color{#1}},
+ opacity/.code={\originaltcbset{opacitytext=#1}},
+ top/.code={\originaltcbset{valign=top}\pal@text@option@toptrue},
+ center/.code={\originaltcbset{valign=center}\pal@text@option@centertrue},
+ bottom/.code={\originaltcbset{valign=bottom}\pal@text@option@bottomtrue},
+ boxrule/.code={\originaltcbset{boxrule=#1}\def\pal@defaultborderwidth{#1}\def\pal@text@option@leftrule{#1}\def\pal@text@option@rightrule{#1}\def\pal@text@option@toprule{#1}\def\pal@text@option@bottomrule{#1}},
+ toprule/.code={\originaltcbset{toprule=#1}\def\pal@text@option@toprule{#1}},
+ rightrule/.code={\originaltcbset{rightrule=#1}\def\pal@text@option@rightrule{#1}},
+ bottomrule/.code={\originaltcbset{bottomrule=#1}\def\pal@text@option@bottomrule{#1}},
+ leftrule/.code={\originaltcbset{leftrule=#1}\def\pal@text@option@leftrule{#1}},
+ height/.code={\originaltcbset{height=#1}\def\pal@text@option@height{#1}},
+ parbox/.is if=pal@text@option@parbox,
+ breakable/.is if=pal@text@option@breakable,
+ border radius/.code={\originaltcbset{arc=#1}\ifdim\pal@null=\dimexpr#1\relax\originaltcbset{outer arc=#1}\else\originaltcbset{auto outer arc}\fi\def\pal@defaultborderradius{#1}},
+ arc/.forward to=/text/border radius,
+ border width/.forward to=/text/boxrule,
+ border color/.code={\originaltcbset{colframe=#1}\def\pal@defaultbordercolor{#1}},
+ border opacity/.code={\originaltcbset{opacityframe=#1}\def\pal@defaultborderopacity{#1}},
+ shadow/.forward to=/defaultshadow/name,
+ shadow size/.forward to=/defaultshadow/size,
+ shadow color/.forward to=/defaultshadow/color,
+ shadow opacity/.forward to=/defaultshadow/opacity,
+ shadow xshift/.forward to=/defaultshadow/xshift,
+ shadow yshift/.forward to=/defaultshadow/yshift,
+ .unknown/.code={\originaltcbset{\pgfkeyscurrentname=#1}}
+}
+\newdimen\pal@tcbheight
+\newcommand\pal@puttext[5]{
+ \ifpal@isbatchmode
+ \else
+ \pal@x=\posx{1}{#1}{1}{#2}
+ \pal@xx=\posx{-1}{#3}{-1}{#4}
+ \pal@y=\posy{-1}{#3}
+ \pal@yy=\posy{1}{#1}
+
+ \pal@xx=\dimexpr\pal@xx+\pal@text@option@rightrule\relax
+ \pal@x=\dimexpr\pal@x-\pal@text@option@leftrule\relax
+ \pal@yy=\dimexpr\pal@yy+\pal@text@option@toprule\relax
+ \pal@y=\dimexpr\pal@y-\pal@text@option@bottomrule\relax
+
+ \width=\dimexpr(\pal@xx - \pal@x)\relax
+ \height=\dimexpr(\pal@yy - \pal@y)\relax
+ \pal@textboxwidth=\dimexpr(\pal@xx - \pal@x)\relax
+ \pal@textboxheight=\dimexpr(\pal@yy - \pal@y)\relax
+
+ \ifdefined\pal@text@option@height
+ \ifdim\pal@text@option@height=\height
+ \else
+ \pal@tcbheight=\dimexpr\pal@text@option@height\ifdefined\pal@text@option@toprule+\pal@text@option@toprule\else\ifdefined\pal@defaultborderwidth+\pal@defaultborderwidth\fi\fi\ifdefined\pal@text@option@bottomrule+\pal@text@option@bottomrule\else\ifdefined\pal@defaultborderwidth+\pal@defaultborderwidth\fi\fi\relax
+ \originaltcbset{height=\pal@tcbheight}
+ \fi
+ \else
+ \fi
+
+ \pal@checkvisibility
+ \ifpal@isvisible
+ \pal@checkside{1}
+ \ifpal@text@option@parbox
+ \ifdim\pal@textboxheight<\pal@null
+ \pal@yy=\dimexpr\pal@yy-\pal@textboxheight\relax
+ \pal@textboxheight=\dimexpr-1\pal@textboxheight\relax
+ \fi
+ \put(\pal@dimentonumber{\pal@x},\pal@dimentonumber{\pal@yy}){%
+ \parbox[t][\pal@textboxheight][\ifpal@text@option@center c\else\ifpal@text@option@bottom b\else t\fi\fi]{\pal@textboxwidth}{\vskip \pal@null
+ \color{\pal@text@option@color}%
+ #5%
+ }
+ }
+ \else
+ \ifdim\pal@text@option@bottomrule<\pal@text@option@toprule
+ \def\pal@text@minvborderwidth{\pal@text@option@bottomrule}
+ \def\pal@text@maxvborderwidth{\pal@text@option@toprule}
+ \else
+ \def\pal@text@minvborderwidth{\pal@text@option@toprule}
+ \def\pal@text@maxvborderwidth{\pal@text@option@bottomrule}
+ \fi
+ \ifdim\pal@text@option@leftrule<\pal@text@option@rightrule
+ \def\pal@text@minhborderwidth{\pal@text@option@leftrule}
+ \def\pal@text@maxhborderwidth{\pal@text@option@rightrule}
+ \else
+ \def\pal@text@minhborderwidth{\pal@text@option@rightrule}
+ \def\pal@text@maxhborderwidth{\pal@text@option@leftrule}
+ \fi
+ \ifdim\pal@text@minvborderwidth<\pal@text@minhborderwidth
+ \def\pal@text@minborderwidth{\pal@text@minvborderwidth}
+ \def\pal@text@maxborderwidth{\pal@text@maxhborderwidth}
+ \else
+ \def\pal@text@minborderwidth{\pal@text@minhborderwidth}
+ \def\pal@text@maxborderwidth{\pal@text@maxvborderwidth}
+ \fi
+ \ifdim\pal@text@maxborderwidth=\pal@null
+ \originaltcbset{opacityframe=0}
+ \fi
+
+ \ifpal@text@option@breakable
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @offsetx\endcsname{\pal@text@option@leftrule}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @offsety\endcsname{\pal@text@option@bottomrule}
+ \else
+ \def\pal@text@option@name{pal@unbreakable}
+ \fi
+ \ifcsname pal@textarray@\pal@text@option@name @index\endcsname
+ \global\expandafter\csname pal@textarray@\pal@text@option@name @index\endcsname 0 \relax%
+ \boxarrayclear[\pal@text@option@name]
+ \else
+ \global\expandafter\newcount\csname pal@textarray@\pal@text@option@name @index\endcsname%
+ \newboxarray{\pal@text@option@name}
+ \fi
+ \put(0,0){
+ \ifpal@text@option@breakable%
+ \begin{tcolorbox}[
+ standard jigsaw,
+ width=\width,
+ enforce breakable,
+ break at=\height,
+ height fixed for=all,
+ reset box array=\pal@text@option@name,
+ store to box array=\pal@text@option@name,
+ ]%
+ #5
+ \end{tcolorbox}%
+ \else%
+ \begin{tcolorbox}[
+ standard jigsaw,
+ width=\width,
+ reset box array=\pal@text@option@name,
+ store to box array=\pal@text@option@name,
+ ]%
+ #5
+ \end{tcolorbox}%
+ \fi%
+ }
+ \global\expandafter\advance\csname pal@textarray@\pal@text@option@name @index\endcsname by 1%
+
+ \boxarraygetheight[\pal@text@option@name]{\pal@text@height}{1}
+ \ifpal@text@option@bottom
+ \pal@yy=\dimexpr\pal@yy-(\pal@textboxheight-\pal@text@height)\relax
+ \else
+ \ifpal@text@option@center
+ \pal@yy=\dimexpr\pal@yy-(\pal@textboxheight-\pal@text@height)/2\relax
+ \fi
+ \fi
+ \pal@textboxheight=\pal@text@height
+ \pal@y=\dimexpr\pal@yy-\pal@textboxheight\relax
+
+ % draw shadow
+ \pal@ifshadow{
+ \ifdefined\pal@defaultborderradius
+ \ifdim\pal@defaultborderradius=0pt
+ \pal@frameshadowradius=0pt
+ \else
+ \pal@frameshadowradius=\dimexpr\pal@defaultborderradius+\pal@text@minborderwidth\relax
+ \fi
+ \else
+ \pal@frameshadowradius=0pt
+ \fi
+
+ \def\pal@frameshadowoffsetx{0pt}
+ \def\pal@frameshadowoffsety{0pt}
+
+ \def\pal@frameshadowwidth{\dimexpr\width+10cm\relax}
+ \def\pal@frameshadowheight{\dimexpr\pal@textboxheight+10cm\relax}
+ \def\pal@frameshadowframewidth{\width}
+ \def\pal@frameshadowframeheight{\pal@textboxheight}
+ \def\pal@frameshadowborder{\dimexpr5cm\relax}
+ \ifpal@text@option@breakable
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @shadowsize\endcsname{\pal@defaultshadowsize}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @shadowcolor\endcsname{\pal@defaultshadowcolor}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @shadowopacity\endcsname{\pal@defaultshadowopacity}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @shadowxshift\endcsname{\pal@defaultshadowxshift}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @shadowyshift\endcsname{\pal@defaultshadowyshift}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @frameshadowwidth\endcsname{\the\pal@frameshadowwidth}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @frameshadowheight\endcsname{\the\pal@frameshadowheight}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @frameshadowframewidth\endcsname{\the\pal@frameshadowframewidth}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @frameshadowframeheight\endcsname{\the\pal@frameshadowframeheight}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @frameshadowborder\endcsname{\the\pal@frameshadowborder}
+ \expandafter\xdef\csname pal@textarray@\pal@text@option@name @frameshadowradius\endcsname{\the\pal@frameshadowradius}
+ \fi
+ \pal@drawshadow
+ }
+
+ \put(\pal@dimentonumber{\pal@x},\pal@dimentonumber{\pal@y}){%
+ \consumeboxarray[\pal@text@option@name]{\the\csname pal@textarray@\pal@text@option@name @index\endcsname}%
+ }
+ \fi
+ \pal@checkside{-1}
+ \fi
+ \fi
+}
+\newcommand\pal@putusetext[5][default]{
+ \ifpal@isbatchmode
+ \else
+ \pal@x=\posx{1}{#2}{1}{#3}
+ \pal@xx=\posx{-1}{#4}{-1}{#5}
+ \pal@y=\posy{-1}{#4}
+ \pal@yy=\posy{1}{#2}
+ \width=\dimexpr(\pal@xx - \pal@x)\relax
+ \height=\dimexpr(\pal@yy - \pal@y)\relax
+ \pal@textboxwidth=\dimexpr(\pal@xx - \pal@x)\relax
+ \pal@textboxheight=\dimexpr(\pal@yy - \pal@y)\relax
+
+ \pal@checkvisibility
+ \ifpal@isvisible
+ \ifcsname pal@textarray@#1@index\endcsname
+ \global\expandafter\advance\csname pal@textarray@#1@index\endcsname by 1%
+
+ \pal@y=\dimexpr\pal@yy-\pal@textboxheight\relax
+
+ \ifcsname pal@textarray@#1@shadowsize\endcsname
+ \def\pal@frameshadowoffsetx{\expandafter\csname pal@textarray@#1@offsetx\endcsname}
+ \def\pal@frameshadowoffsety{\expandafter\csname pal@textarray@#1@offsety\endcsname}
+
+ \def\pal@frameshadowwidth{\dimexpr\expandafter\csname pal@textarray@#1@frameshadowwidth\endcsname\relax}
+ \def\pal@frameshadowheight{\dimexpr\expandafter\csname pal@textarray@#1@frameshadowheight\endcsname\relax}
+ \def\pal@frameshadowframewidth{\dimexpr\expandafter\csname pal@textarray@#1@frameshadowframewidth\endcsname\relax}
+ \def\pal@frameshadowframeheight{\dimexpr\expandafter\csname pal@textarray@#1@frameshadowframeheight\endcsname\relax}
+ \def\pal@frameshadowborder{\dimexpr\expandafter\csname pal@textarray@#1@frameshadowborder\endcsname\relax}
+ \def\pal@frameshadowradius{\dimexpr\expandafter\csname pal@textarray@#1@frameshadowradius\endcsname\relax}
+
+ \def\pal@defaultshadowsize{\expandafter\csname pal@textarray@#1@shadowsize\endcsname}
+ \def\pal@defaultshadowcolor{\expandafter\csname pal@textarray@#1@shadowcolor\endcsname}
+ \def\pal@defaultshadowopacity{\expandafter\csname pal@textarray@#1@shadowopacity\endcsname}
+ \def\pal@defaultshadowxshift{\dimexpr\expandafter\csname pal@textarray@#1@shadowxshift\endcsname\relax}
+ \def\pal@defaultshadowyshift{\dimexpr\expandafter\csname pal@textarray@#1@shadowyshift\endcsname\relax}
+
+ \pal@drawshadow
+ \fi
+
+ \pal@checkside{1}
+ \put(\pal@dimentonumber{\pal@x-\expandafter\csname pal@textarray@#1@offsetx\endcsname},\pal@dimentonumber{\pal@y-\expandafter\csname pal@textarray@#1@offsety\endcsname}){%
+ \consumeboxarray[#1]{\the\csname pal@textarray@#1@index\endcsname}%
+ }
+ \pal@checkside{-1}
+ \else
+ \pal@errmsg@undefined{breakable text}{#1}
+ \fi
+ \fi
+ \fi
+}
+
+% xput
+\newcommand\pal@putxput[6][0]{
+ \pal@x=\posx{1}{#2}{1}{#3}
+ \pal@xx=\posx{-1}{#4}{-1}{#5}
+ \pal@y=\posy{-1}{#4}
+ \pal@yy=\posy{1}{#2}
+
+ \pal@checkvisibility
+ \ifpal@isvisible
+ \ifnum#1=1
+ \pal@snapsafezonehorizontal
+ \pal@snapsafezonevertical
+ \fi
+
+ \width=\dimexpr(\pal@xx - \pal@x)\relax
+ \height=\dimexpr(\pal@yy - \pal@y)\relax
+
+ \put(\pal@dimentonumber{\pal@x},\pal@dimentonumber{\pal@y}){%
+ \ifx\pal@pageoptioncolor\pal@emptystring
+ \color{\paloptions@color}%
+ \else
+ \color{\pal@pageoptioncolor}%
+ \fi
+ #6
+ }
+ \fi
+}
+
+% tikzgraphic
+\newcommand\pal@puttikz[6][0]{
+ \ifpal@isbatchmode
+ \else
+ \pal@putxput[#1]{#2}{#3}{#4}{#5}{%
+ \begin{tikzpicture}
+ \pgflowlevelsynccm
+ #6
+ \end{tikzpicture}
+ }
+ \fi
+}
+
+% border
+\def\pal@defaultborderwidth{0pt}
+\def\pal@defaultborderradius{0pt}
+\def\pal@defaultbordercolor{black}
+\def\pal@defaultborderopacity{1}
+\pgfkeysdef{/defaultborder/name}{
+ \ifcsname pal@border@#1\endcsname
+ \csname pal@border@#1\endcsname{}
+ \else
+ \pgfkeys{defaultborder,opacity=1,width=0pt,color=black,radius=0pt}
+ \pal@errmsg@undefined{border}{#1}
+ \fi
+}
+\newcommand\newborder[2]{
+ \expandafter\newcommand\csname pal@border@#1\endcsname[2][0]{%
+ \ifnum##1=1
+ \pgfkeys{textborder,opacity=1,width=0pt,color=black,radius=0pt,#2}
+ \else
+ \pgfkeys{defaultborder,opacity=1,width=0pt,color=black,radius=0pt,#2,##2}
+ \fi
+ }%
+}
+\pgfkeys{
+ /textborder/.is family,
+ /textborder,
+ radius/.forward to=/text/border radius,
+ width/.forward to=/text/border width,
+ color/.forward to=/text/border color,
+ opacity/.forward to=/text/border opacity,
+}
+\pgfkeys{
+ /defaultborder/.is family,
+ /defaultborder,
+ radius/.store in=\pal@defaultborderradius,
+ width/.store in=\pal@defaultborderwidth,
+ color/.store in=\pal@defaultbordercolor,
+ opacity/.store in=\pal@defaultborderopacity,
+}
+\newcommand\setborder[2][]{
+ \ifpal@placeholdermode
+ \ifnum\pal@contentcounter<\pal@placeholdercounter
+ \pal@border{#1}{#2}
+ \fi
+ \else
+ \pal@border{#1}{#2}
+ \fi
+}
+\def\noborder{\setborder{}}
+\newcommand\pal@border[2]{
+ \pgfkeys{defaultborder,width=0pt,color=black,opacity=1,radius=0pt,#1}
+ \ifcsname pal@border@#2\endcsname
+ \csname pal@border@#2\endcsname{#1}
+ \fi
+}
+
+% shadow
+\def\pal@defaultshadowsize{0}
+\def\pal@defaultshadowopacity{0.4}
+\def\pal@defaultshadowcolor{black}
+\def\pal@defaultshadowxshift{0pt}
+\def\pal@defaultshadowyshift{0pt}
+\pgfkeysdef{/defaultshadow/name}{
+ \ifcsname pal@shadow@#1\endcsname
+ \csname pal@shadow@#1\endcsname{}
+ \else
+ \pgfkeys{defaultshadow,size=0,color=black,opacity=0.4,xshift=0pt,yshift=0pt}
+ \pal@errmsg@undefined{shadow}{#1}
+ \fi
+}
+\newcommand\newshadow[2]{
+ \expandafter\newcommand\csname pal@shadow@#1\endcsname[1]{%
+ \pgfkeys{defaultshadow,size=0,color=black,opacity=0.4,xshift=0pt,yshift=0pt,#2,##1}
+ }%
+}
+\pgfkeys{
+ /defaultshadow/.is family,
+ /defaultshadow,
+ size/.store in=\pal@defaultshadowsize,
+ color/.store in=\pal@defaultshadowcolor,
+ opacity/.store in=\pal@defaultshadowopacity,
+ xshift/.store in=\pal@defaultshadowxshift,
+ yshift/.store in=\pal@defaultshadowyshift,
+}
+\newcommand\setshadow[2][]{
+ \ifpal@placeholdermode
+ \ifnum\pal@contentcounter<\pal@placeholdercounter
+ \pal@shadow{#1}{#2}
+ \fi
+ \else
+ \pal@shadow{#1}{#2}
+ \fi
+}
+\def\noshadow{\setshadow{}}
+\newcommand\pal@shadow[2]{
+ \pgfkeys{defaultshadow,size=0,color=black,opacity=0.4,xshift=0pt,yshift=0pt,#1}
+ \ifcsname pal@shadow@#2\endcsname
+ \csname pal@shadow@#2\endcsname{#1}
+ \fi
+}
+\newcommand\pal@ifshadow[1]{
+ \ifdim\dimexpr\pal@defaultshadowsize pt\relax>\pal@null
+ #1
+ \else
+ \ifdim\pal@defaultshadowxshift>\pal@null
+ #1
+ \else
+ \ifdim\pal@defaultshadowyshift>\pal@null
+ #1
+ \fi
+ \fi
+ \fi
+}
+\def\pal@drawshadow{
+ \pal@ifshadow{
+ \xdef\pal@shadowid{shadow-\pal@defaultshadowsize-\pal@defaultshadowcolor-\pal@defaultshadowopacity-\the\numexpr\pal@frameshadowwidth\relax-\the\numexpr\pal@frameshadowheight\relax-\the\numexpr\pal@frameshadowradius\relax-\the\numexpr\pal@frameshadowborder\relax}
+ \IfFileExists{./cache/\pal@shadowid/s.pdf}{
+ \put(\pal@dimentonumber{\dimexpr\pal@x-5cm-\pal@frameshadowoffsetx+\pal@defaultshadowxshift\relax},\pal@dimentonumber{\dimexpr\pal@y-5cm-\pal@frameshadowoffsety-\pal@defaultshadowyshift\relax}){%
+ \includegraphics[width=\pal@frameshadowwidth]{cache/\pal@shadowid/s.pdf}
+ }
+ }{
+ \pal@makeshadow{\pal@shadowid}
+ \IfFileExists{./cache/\pal@shadowid/s.pdf}{
+ \put(\pal@dimentonumber{\dimexpr\pal@x-5cm-\pal@frameshadowoffsetx+\pal@defaultshadowxshift\relax},\pal@dimentonumber{\dimexpr\pal@y-5cm-\pal@frameshadowoffsety-\pal@defaultshadowyshift\relax}){%
+ \includegraphics[width=\pal@frameshadowwidth]{cache/\pal@shadowid/s.pdf}
+ }
+ }{
+ \ifx\pal@processresult\pal@ok
+ \ClassError{pagelayout}{Unexpected error. Shadow not created}{File `cache/\pal@shadowid/s.pdf' not\MessageBreak found.\MessageBreak\MessageBreak\@ehc}
+ \fi
+ }
+ }
+ }
+}
+
+% layout helper
+\def\pal@gridcolor{green!90!black}
+\def\pal@gridopacity{0.8}
+\def\pal@gutteropacity{0.2}
+\newdimen\pal@gridx
+\newdimen\pal@gridxx
+\newdimen\pal@gridy
+\newdimen\pal@gridyy
+\newcommand\pal@putgrid{
+ \ifpal@isemptypage
+ \else
+ \ifpal@grid
+ \pal@gridx=\posx{1}{1}{1}{0}
+ \pal@gridxx=\posx{-1}{1}{-1}{\pal@get{1C}}
+ \pal@gridy=\posy{1}{0}
+ \pal@gridyy=\posy{-1}{\pal@rowscount}
+ \put(0,0){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+ \foreach \rowI in {1,...,\pal@rowscount} {
+ \ifnum\rowI<\pal@rowscount
+ \ifdim\pal@gutter=\pal@null
+ \draw[line cap=rect,line width=0.2mm,draw=\pal@gridcolor,opacity=\pal@gridopacity] ({\pal@gridx+0.05mm},{\posy{0}{\rowI}}) -- ({\pal@gridxx-0.05mm},{\posy{0}{\rowI}});%
+ \else
+ \draw[line cap=rect,line width=\pal@gutter,draw=\pal@gridcolor,opacity=\pal@gutteropacity] ({\pal@gridx+\pal@gutter/2},{\posy{0}{\rowI}}) -- ({\pal@gridxx-\pal@gutter/2},{\posy{0}{\rowI}});%
+ \fi
+ \fi
+ \ifnum\numexpr\pal@get{\rowI C} - 1\relax>0
+ \foreach \cellI in {1,...,\numexpr\pal@get{\rowI C} - 1\relax} {
+ \ifdim\pal@gutter=\pal@null
+ \draw[line width=0.2mm,draw=\pal@gridcolor,opacity=\pal@gridopacity] ({\posx{-1}{\rowI}{0}{\cellI}},{\posy{1}{\numexpr\rowI - 1\relax}}) -- ({\posx{-1}{\rowI}{0}{\cellI}},{\posy{-1}{\rowI}});%
+ \else
+ \draw[line width=\pal@gutter,draw=\pal@gridcolor,opacity=\pal@gutteropacity] ({\posx{-1}{\rowI}{0}{\cellI}},{\posy{1}{\numexpr\rowI - 1\relax}}) -- ({\posx{-1}{\rowI}{0}{\cellI}},{\posy{-1}{\rowI}});%
+ \fi
+ }
+ \fi
+ }
+ \draw[line width=0.2mm,draw=\pal@gridcolor,opacity=\pal@gridopacity] ({\pal@gridx},{\pal@gridy}) rectangle ({\pal@gridxx},{\pal@gridyy});%
+ \ifdim\pal@gridoffsethorizontal>0.001pt
+ \draw[line width=0.2mm,dash pattern={on 1mm off 1mm},draw=\pal@gridcolor,opacity=\pal@gridopacity] (\pal@gridx,\pal@gridy) -- (\pal@gridx-\pal@gridoffsethorizontal,\pal@gridy) -- (\pal@gridx-\pal@gridoffsethorizontal,\pal@gridyy) -- (\pal@gridx,\pal@gridyy);%
+ \fi
+ \ifdim\pal@gridoffsethorizontaln>0.001pt
+ \draw[line width=0.2mm,dash pattern={on 1mm off 1mm},draw=\pal@gridcolor,opacity=\pal@gridopacity] (\pal@gridxx,\pal@gridy) -- (\pal@gridxx+\pal@gridoffsethorizontaln,\pal@gridy) -- (\pal@gridxx+\pal@gridoffsethorizontaln,\pal@gridyy) -- (\pal@gridxx,\pal@gridyy);%
+ \fi
+ \ifdim\pal@gridoffsetvertical>0.001pt
+ \draw[line width=0.2mm,dash pattern={on 1mm off 1mm},draw=\pal@gridcolor,opacity=\pal@gridopacity] (\pal@gridx,\pal@gridy) -- (\pal@gridx,\pal@gridy+\pal@gridoffsetvertical)-- (\pal@gridxx,\pal@gridy+\pal@gridoffsetvertical) -- (\pal@gridxx,\pal@gridy);%
+ \fi
+ \ifdim\pal@gridoffsetverticaln>0.001pt
+ \draw[line width=0.2mm,dash pattern={on 1mm off 1mm},draw=\pal@gridcolor,opacity=\pal@gridopacity] ({\pal@gridx},{\pal@gridyy}) --({\pal@gridx},{\pal@gridyy-\pal@gridoffsetverticaln}) -- ({\pal@gridxx},{\pal@gridyy-\pal@gridoffsetverticaln}) -- ({\pal@gridxx},{\pal@gridyy});%
+ \fi
+ \end{tikzpicture}%
+ }
+ \fi
+ \fi
+}
+\def\pal@bleedcolor{red}
+\def\pal@bleedopacity{0.5}
+\newif\ifpal@putbleed
+\newcommand\pal@checkbleed{
+ \ifdim\pal@topbleed>\pal@null
+ \pal@putbleedtrue
+ \else
+ \ifdim\pal@bottombleed>\pal@null
+ \pal@putbleedtrue
+ \else
+ \ifdim\pal@innerbleed>\pal@null
+ \pal@putbleedtrue
+ \else
+ \ifdim\pal@outerbleed>\pal@null
+ \pal@putbleedtrue
+ \else
+ \pal@putbleedfalse
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\newcommand\pal@putbleed{
+ \ifpal@isemptypage
+ \else
+ \ifpal@safezone
+ \pal@checkbleed
+ \ifpal@putbleed
+ \put(0,0){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \ifpal@frontcover
+ \ifpal@backcover
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@pageheight + \pal@bottombleed) rectangle ++(\pal@pagewidth + \pal@outerbleed,\pal@topbleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, 0) rectangle ++(\pal@pagewidth + \pal@outerbleed,\pal@bottombleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@bottombleed) rectangle ++(\pal@outerbleed,\pal@pageheight);%
+ \else
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth + \pal@outerbleed, \pal@pageheight + \pal@bottombleed) rectangle ++(\pal@pagewidth + \pal@outerbleed + \spinewidth,\pal@topbleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth + \pal@outerbleed, 0) rectangle ++(\pal@pagewidth + \pal@outerbleed + \spinewidth,\pal@bottombleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth * 2 + \pal@outerbleed + \spinewidth, \pal@bottombleed) rectangle ++(\pal@outerbleed,\pal@pageheight);%
+ \fi
+ \else
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@pageheight + \pal@bottombleed) rectangle ++(\pal@pagewidth * 2 + \pal@outerbleed * 2,\pal@topbleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, 0) rectangle ++(\pal@pagewidth * 2 + \pal@outerbleed * 2,\pal@bottombleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@bottombleed) rectangle ++(\pal@outerbleed,\pal@pageheight);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth * 2 + \pal@outerbleed, \pal@bottombleed) rectangle ++(\pal@outerbleed,\pal@pageheight);%
+ \else
+ \ifpal@leftpage
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@pageheight + \pal@bottombleed) rectangle ++(\pal@pagewidth + \pal@outerbleed,\pal@topbleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, 0) rectangle ++(\pal@pagewidth + \pal@outerbleed,\pal@bottombleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@bottombleed) rectangle ++(\pal@outerbleed,\pal@pageheight);%
+ \else
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth + \pal@outerbleed, \pal@pageheight + \pal@bottombleed) rectangle ++(\pal@pagewidth + \pal@outerbleed,\pal@topbleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth + \pal@outerbleed, 0) rectangle ++(\pal@pagewidth + \pal@outerbleed,\pal@bottombleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth * 2 + \pal@outerbleed, \pal@bottombleed) rectangle ++(\pal@outerbleed,\pal@pageheight);%
+ \fi
+ \fi
+ \else
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@pageheight + \pal@bottombleed) rectangle ++(\pal@pagewidth + \pal@leftbleed + \pal@rightbleed,\pal@topbleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, 0) rectangle ++(\pal@pagewidth + \pal@leftbleed + \pal@rightbleed,\pal@bottombleed);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (0, \pal@bottombleed) rectangle ++(\pal@leftbleed,\pal@pageheight);%
+ \fill[\pal@bleedcolor,opacity=\pal@bleedopacity] (\pal@pagewidth + \pal@leftbleed, \pal@bottombleed) rectangle ++(\pal@rightbleed,\pal@pageheight);%
+ \fi
+ \fi
+ \end{tikzpicture}%
+ }
+ \fi
+ \fi
+ \fi
+}
+\newdimen\pal@cuttingmarka
+\newdimen\pal@cuttingmarkb
+\pal@cuttingmarka=-3mm
+\pal@cuttingmarkb=-1mm
+\newcommand\pal@putcuttingmarks{
+ \ifpal@isemptypage
+ \ifpal@fanfold
+ \pal@cuttingmarksvisibletrue
+ \fi
+ \else
+ \pal@cuttingmarksvisibletrue
+ \fi
+ \ifpal@cuttingmarksvisible
+ \ifpal@cuttingmarks
+ \ifpal@safezone
+ \else
+ \pal@checkbleed
+ \ifpal@putbleed
+ \put(0,0){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \ifpal@frontcover
+ \ifpal@backcover
+ \draw[\pal@pageoptioncolor,line width=0.15mm](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor,line width=0.15mm](\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed + \pal@pageheight);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed, \pal@bottombleed + \pal@pageheight - \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed + \pal@pageheight - \pal@cuttingmarkb);%
+ \else
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed + \spinewidth - \pal@cuttingmarka, \pal@bottombleed) -- (2\pal@pagewidth + \pal@outerbleed + \spinewidth - \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed + \spinewidth, \pal@bottombleed + \pal@cuttingmarka) -- (2\pal@pagewidth + \pal@outerbleed + \spinewidth, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed + \spinewidth - \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (2\pal@pagewidth + \pal@outerbleed + \spinewidth - \pal@cuttingmarkb, \pal@bottombleed+\pal@pageheight);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed + \spinewidth, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarka) -- (2\pal@pagewidth + \pal@outerbleed + \spinewidth, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarkb);%
+ \fi
+ \else
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \draw[\pal@pageoptioncolor](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed+\pal@pageheight);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarkb);%
+
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarka, \pal@bottombleed) -- (2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed + \pal@cuttingmarka) -- (2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarkb, \pal@bottombleed+\pal@pageheight);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarka) -- (2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarkb);%
+ \else
+ \ifpal@leftpage
+ \draw[\pal@pageoptioncolor](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed+\pal@pageheight);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarkb);%
+ \else
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarka, \pal@bottombleed) -- (2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed + \pal@cuttingmarka) -- (2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (2\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarkb, \pal@bottombleed+\pal@pageheight);%
+ \draw[\pal@pageoptioncolor](2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarka) -- (2\pal@pagewidth + \pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarkb);%
+ \fi
+ \fi
+ \else
+ \draw[\pal@pageoptioncolor](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed + \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (\pal@outerbleed + \pal@cuttingmarkb, \pal@bottombleed+\pal@pageheight);%
+ \draw[\pal@pageoptioncolor](\pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarka) -- (\pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarka, \pal@bottombleed) -- (\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarkb, \pal@bottombleed);%
+ \draw[\pal@pageoptioncolor](\pal@pagewidth + \pal@outerbleed, \pal@bottombleed + \pal@cuttingmarka) -- (\pal@pagewidth + \pal@outerbleed, \pal@bottombleed + \pal@cuttingmarkb);%
+ \draw[\pal@pageoptioncolor](\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarka, \pal@bottombleed+\pal@pageheight) -- (\pal@pagewidth + \pal@outerbleed - \pal@cuttingmarkb, \pal@bottombleed+\pal@pageheight);%
+ \draw[\pal@pageoptioncolor](\pal@pagewidth + \pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarka) -- (\pal@pagewidth + \pal@outerbleed, \pal@bottombleed+\pal@pageheight - \pal@cuttingmarkb);%
+ \fi
+ \fi
+ \end{tikzpicture}%
+ }
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\def\pal@safetymargincolor{pink}
+\def\pal@safetymarginopacity{0.8}
+\newif\ifpal@putsafezone
+\newcommand\pal@checksafezone{
+ \ifdim\pal@topsafetymargin>\pal@null
+ \pal@putsafezonetrue
+ \else
+ \ifdim\pal@bottomsafetymargin>\pal@null
+ \pal@putsafezonetrue
+ \else
+ \ifdim\pal@innersafetymargin>\pal@null
+ \pal@putsafezonetrue
+ \else
+ \ifdim\pal@outersafetymargin>\pal@null
+ \pal@putsafezonetrue
+ \else
+ \pal@putsafezonefalse
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\newcommand\pal@putsafezone{
+ \ifpal@isemptypage
+ \else
+ \ifpal@safezone
+ \pal@checksafezone
+ \ifpal@putsafezone
+ \put(0,0){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \ifpal@frontcover
+ \ifpal@backcover
+ \else
+ \draw[line cap=rect,line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@pagewidth + \pal@outerbleed,0.05mm) -- (\pal@pagewidth + \pal@outerbleed,\paperheight-0.05mm);%
+ \draw[line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@outersafetymargin + \pal@outerbleed,\pal@bottomsafetymargin + \pal@bottombleed) rectangle (\pal@pagewidth + \pal@outerbleed - \pal@innersafetymargin,\paperheight - \pal@topsafetymargin - \pal@topbleed);%
+ \draw[line cap=rect,line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@pagewidth + \pal@outerbleed + \spinewidth,0.05mm) -- (\pal@pagewidth + \pal@outerbleed + \spinewidth,\paperheight-0.05mm);%
+ \draw[line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@pagewidth + \pal@outerbleed + \spinewidth + \pal@innersafetymargin,\pal@bottomsafetymargin + \pal@bottombleed) rectangle (\paperwidth - \pal@outerbleed - \pal@outersafetymargin,\paperheight - \pal@topsafetymargin - \pal@topbleed);%
+ \fi
+ \else
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \draw[line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@outersafetymargin + \pal@outerbleed,\pal@bottomsafetymargin + \pal@bottombleed) rectangle (\paperwidth / 2 - \pal@innersafetymargin,\paperheight - \pal@topsafetymargin - \pal@topbleed);%
+ \draw[line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\paperwidth / 2 + \pal@innersafetymargin,\pal@bottomsafetymargin + \pal@bottombleed) rectangle (\paperwidth - \pal@outerbleed - \pal@outersafetymargin,\paperheight - \pal@topsafetymargin - \pal@topbleed);%
+ \else
+ \ifpal@leftpage
+ \draw[line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@outersafetymargin + \pal@outerbleed,\pal@bottomsafetymargin + \pal@bottombleed) rectangle (\paperwidth / 2 - \pal@innersafetymargin,\paperheight - \pal@topsafetymargin - \pal@topbleed);%
+ \else
+ \draw[line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\paperwidth / 2 + \pal@innersafetymargin,\pal@bottomsafetymargin + \pal@bottombleed) rectangle (\paperwidth - \pal@outerbleed - \pal@outersafetymargin,\paperheight - \pal@topsafetymargin - \pal@topbleed);%
+ \fi
+ \fi
+ \draw[line cap=rect,line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\paperwidth / 2,0.05mm) -- (\paperwidth / 2,\paperheight-0.05mm);%
+ \else
+ \draw[line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@leftsafetymargin + \pal@leftbleed,\pal@bottomsafetymargin + \pal@bottombleed) rectangle (\paperwidth - \pal@rightsafetymargin - \pal@rightbleed,\paperheight - \pal@topsafetymargin - \pal@topbleed);%
+ \fi
+ \fi
+ \end{tikzpicture}%
+ }
+ \else
+ \ifpal@frontcover
+ \ifpal@backcover
+ \else
+ \put(0,0){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+ \draw[line cap=rect,line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@pagewidth + \pal@outerbleed,0.05mm) -- (\pal@pagewidth + \pal@outerbleed,\paperheight-0.05mm);%
+ \draw[line cap=rect,line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\pal@pagewidth + \pal@outerbleed + \spinewidth,0.05mm) -- (\pal@pagewidth + \pal@outerbleed + \spinewidth,\paperheight-0.05mm);%
+ \end{tikzpicture}%
+ }
+ \fi
+ \else
+ \ifpal@fanfold
+ \put(0,0){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+ \draw[line cap=rect,line width=0.1mm,draw=\pal@safetymargincolor,opacity=\pal@safetymarginopacity] (\paperwidth / 2,0.05mm) -- (\paperwidth / 2,\paperheight-0.05mm);%
+ \end{tikzpicture}%
+ }
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\def\pal@graphpapercolor{gray!70}
+\def\pal@graphpaperopacity{0.2}
+\newcommand\pal@calcgraphpaperx{
+ \ifdim\pal@graphpaperx>\pal@null
+ \pal@graphpaperx=\dimexpr\pal@graphpaperx-\pal@graphpapersnap\relax
+ \pal@calcgraphpaperx
+ \fi
+}
+\newcommand\pal@calcgraphpapery{
+ \ifdim\pal@graphpapery>\pal@null
+ \pal@graphpapery=\dimexpr\pal@graphpapery-\pal@graphpapersnap\relax
+ \pal@calcgraphpapery
+ \fi
+}
+\newcommand\pal@calcgraphpaperoffset{
+ \pal@graphpaperoffset=\pal@null
+
+ \pal@graphpaperoffsetsnap \numexpr\number\pal@pagewidth/\pal@graphpapersnap\relax
+ \pal@graphpaperoffset=\dimexpr\pal@pagewidth-\pal@graphpapersnap*\pal@graphpaperoffsetsnap\relax
+ \ifdim\pal@graphpaperoffset<\pal@null
+ \pal@graphpaperoffset=\dimexpr\pal@graphpaperoffset+\pal@graphpapersnap\relax
+ \fi
+ \pal@graphpaperx=\dimexpr\pal@graphpaperx-\pal@graphpaperoffset\relax
+}
+\newcount\pal@graphpaperoffsetsnap
+\newcommand\pal@putgraphpaper{
+ \ifpal@graphpaper
+ \pal@graphpapery=\pal@bottombleed
+ \pal@calcgraphpapery
+ \pal@graphpaperx=\pal@leftbleed
+ \pal@calcgraphpaperx
+
+ \ifpal@frontcover
+ \ifpal@backcover
+ \put(\pal@dimentonumber{\pal@graphpaperx},\pal@dimentonumber{\pal@graphpapery}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \draw[line cap=rect,line width=0.05mm,step=\pal@graphpaperconfigitem,\pal@graphpapercolor,opacity=\pal@graphpaperopacity] (0pt,0pt) grid ++(\pal@pagewidth-\pal@graphpaperx+\pal@outerbleed,\paperheight-\pal@graphpapery);%
+ }
+ \end{tikzpicture}%
+ }
+ \else
+ \pal@graphpaperx=\dimexpr\pal@pagewidth+\pal@outerbleed\relax
+ \put(\pal@dimentonumber{\pal@graphpaperx},\pal@dimentonumber{\pal@graphpapery}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \draw[line cap=rect,line width=0.05mm,step=\pal@graphpaperconfigitem,\pal@graphpapercolor,opacity=\pal@graphpaperopacity] (0pt,0pt) grid ++(\spinewidth,\paperheight-\pal@graphpapery);%
+ }
+ \end{tikzpicture}%
+ }
+ \pal@graphpaperx=\dimexpr\pal@pagewidth+\pal@outerbleed+\spinewidth\relax
+ \put(\pal@dimentonumber{\pal@graphpaperx},\pal@dimentonumber{\pal@graphpapery}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \draw[line cap=rect,line width=0.05mm,step=\pal@graphpaperconfigitem,\pal@graphpapercolor,opacity=\pal@graphpaperopacity] (0pt,0pt) grid ++(\pal@pagewidth+\pal@outerbleed,\paperheight-\pal@graphpapery);%
+ }
+ \end{tikzpicture}%
+ }
+ \fi
+ \else
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \put(\pal@dimentonumber{\pal@graphpaperx},\pal@dimentonumber{\pal@graphpapery}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \draw[line cap=rect,line width=0.05mm,step=\pal@graphpaperconfigitem,\pal@graphpapercolor,opacity=\pal@graphpaperopacity] (0pt,0pt) grid ++(\paperwidth-\pal@graphpaperx,\paperheight-\pal@graphpapery);%
+ }
+ \end{tikzpicture}%
+ }
+ \else
+ \ifpal@leftpage
+ \put(\pal@dimentonumber{\pal@graphpaperx},\pal@dimentonumber{\pal@graphpapery}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \draw[line cap=rect,line width=0.05mm,step=\pal@graphpaperconfigitem,\pal@graphpapercolor,opacity=\pal@graphpaperopacity] (0pt,0pt) grid ++(\pal@pagewidth-\pal@graphpaperx+\pal@outerbleed,\paperheight-\pal@graphpapery);%
+ }
+ \end{tikzpicture}%
+ }
+ \else
+ \pal@graphpaperx=\dimexpr\pal@pagewidth+\pal@outerbleed\relax
+ \put(\pal@dimentonumber{\pal@graphpaperx},\pal@dimentonumber{\pal@graphpapery}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \draw[line cap=rect,line width=0.05mm,step=\pal@graphpaperconfigitem,\pal@graphpapercolor,opacity=\pal@graphpaperopacity] (0pt,0pt) grid ++(\pal@pagewidth+\pal@outerbleed,\paperheight-\pal@graphpapery);%
+ }
+ \end{tikzpicture}%
+ }
+ \fi
+ \fi
+ \else
+ \ifpal@isdoublepage
+ \ifpal@rightpage
+ \pal@calcgraphpaperoffset
+ \fi
+ \fi
+
+ \put(\pal@dimentonumber{\pal@graphpaperx},\pal@dimentonumber{\pal@graphpapery}){%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+
+ \foreach \pal@graphpaperconfigitem in \pal@graphpaperconfig {
+ \draw[line cap=rect,line width=0.05mm,step=\pal@graphpaperconfigitem,\pal@graphpapercolor,opacity=\pal@graphpaperopacity] (0pt,0pt) grid ++(\paperwidth-\pal@graphpaperx,\paperheight-\pal@graphpapery);%
+ }
+ \end{tikzpicture}%
+ }
+ \fi
+ \fi
+ \fi
+}
+
+% pages
+\newif\ifpal@isbeforepage
+\def\pal@currentbeforepage{}
+\newcommand\setbeforepage[1]{
+ \ifpal@ispage
+ \def\pal@currentbeforepage{#1}
+ \else
+ \global\def\pal@currentbeforepage{#1}
+ \fi
+}
+\def\nobeforepage{\setbeforepage{}}
+\newcommand\newbeforepage[2]{
+ \expandafter\newcommand\csname pal@before@#1\endcsname{%
+ \begingroup%
+ #2
+ \endgroup%
+ }%
+}
+\newcommand\pal@putbeforepage{
+ \ifx\pal@pagegraphic\pal@emptystring
+ \else
+ \pal@putpagegraphic
+ \fi
+ \ifx\pal@currentbeforepage\pal@emptystring
+ \else
+ \ifcsname pal@before@\pal@currentbeforepage\endcsname%
+ \pal@isbeforepagetrue
+ \csname pal@before@\pal@currentbeforepage\endcsname
+ \pal@isbeforepagefalse
+ \else
+ \pal@errmsg@undefined{before page}{\pal@currentbeforepage}
+ \fi
+ \fi
+ \pal@resetautogrid
+}
+\newcommand\pal@beforepage{
+ \pal@closerows
+ \ifx\pal@pagecolor\pal@emptystring
+ \else
+ \begingroup
+ \margin=\pal@null
+ \topmargin=\pal@null
+ \bottommargin=\pal@null
+ \innermargin=\pal@null
+ \outermargin=\pal@null
+ \setgrid{{{1}}}
+ \ifx\pal@pagecolormodel\pal@emptystring
+ \else
+ \definecolor{tmpcolor}{\pal@pagecolormodel}{\pal@pagecolor}
+ \setpagecolor{tmpcolor}
+ \fi
+ \pal@putxput[1]{0}{0}{1}{1}{%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+ \fill[\pal@pagecolor] (0,0) rectangle ++(\width,\height);
+ \end{tikzpicture}%
+ }
+ \endgroup
+ \fi
+
+ \ifpal@isemptypage
+ \else
+ \pal@putgraphpaper
+ \fi
+}
+\newcommand\pal@setuppage{
+ \global\gutter=\gutter
+ \global\margin=\margin
+ \global\innermargin=\innermargin
+ \global\outermargin=\outermargin
+ \global\bottommargin=\bottommargin
+ \global\topmargin=\topmargin
+ \ifpal@grid\global\pal@gridtrue\else\global\pal@gridfalse\fi
+ \ifpal@graphpaper\global\pal@graphpapertrue\else\global\pal@graphpaperfalse\fi
+ \ifpal@safezone\global\pal@safezonetrue\else\global\pal@safezonefalse\fi
+ \ifpal@placeholder\global\pal@placeholdertrue\else\global\pal@placeholderfalse\fi
+ \global\let\pal@defaultborderwidth\pal@defaultborderwidth
+ \global\let\pal@defaultborderradius\pal@defaultborderradius
+ \global\let\pal@defaultborderopacity\pal@defaultborderopacity
+ \global\let\pal@defaultbordercolor\pal@defaultbordercolor
+ \global\let\pal@defaultshadowsize\pal@defaultshadowsize
+ \global\let\pal@defaultshadowopacity\pal@defaultshadowopacity
+ \global\let\pal@defaultshadowcolor\pal@defaultshadowcolor
+ \global\let\pal@defaultshadowxshift\pal@defaultshadowxshift
+ \global\let\pal@defaultshadowyshift\pal@defaultshadowyshift
+ \global\let\pal@pagegraphicoptionscale\pal@pagegraphicoptionscale
+ \global\let\pal@pagegraphicoptionvpos\pal@pagegraphicoptionvpos
+ \global\let\pal@pagegraphicoptionhpos\pal@pagegraphicoptionhpos
+ \global\let\pal@pagegraphicoptionunsharp\pal@pagegraphicoptionunsharp
+
+ \pal@pagewidth=\pagewidth
+ \pal@pageheight=\pageheight
+ \pal@outerbleed=\ifdim\outerbleed=\pal@undefdim\bleed\else\outerbleed\fi
+ \pal@innerbleed=\ifdim\innerbleed=\pal@undefdim\bleed\else\innerbleed\fi
+ \pal@topbleed=\ifdim\topbleed=\pal@undefdim\bleed\else\topbleed\fi
+ \pal@bottombleed=\ifdim\bottombleed=\pal@undefdim\bleed\else\bottombleed\fi
+ \pal@outersafetymargin=\ifdim\outersafetymargin=\pal@undefdim\safetymargin\else\outersafetymargin\fi
+ \pal@innersafetymargin=\ifdim\innersafetymargin=\pal@undefdim\safetymargin\else\innersafetymargin\fi
+ \pal@topsafetymargin=\ifdim\topsafetymargin=\pal@undefdim\safetymargin\else\topsafetymargin\fi
+ \pal@bottomsafetymargin=\ifdim\bottomsafetymargin=\pal@undefdim\safetymargin\else\bottomsafetymargin\fi
+
+ \ifpal@haspages
+ \ifpal@twoside
+ \ifpal@leftpage
+ \global\pal@rightpagetrue
+ \global\pal@leftpagefalse
+ \else
+ \global\pal@rightpagefalse
+ \global\pal@leftpagetrue
+ \fi
+ \fi
+ \else
+ \pal@isinitgridfalse
+ \ifpal@beginleft
+ \global\pal@leftpagetrue
+ \fi
+ \ifpal@beginright
+ \global\pal@beginleftfalse
+ \global\pal@beginrightfalse
+ \global\pal@leftpagefalse
+ \fi
+ \ifpal@leftpage
+ \pal@haspagestrue
+ \global\pal@leftpagetrue
+ \global\pal@rightpagefalse
+ \else
+ \ifpal@fanfold
+ \global\pal@rightpagefalse
+ \global\pal@leftpagetrue
+ \setcounter{page}{0}
+ \pal@emptypage
+ \global\pal@rightpagetrue
+ \global\pal@leftpagefalse
+ \global\pal@haslastemptypagetrue
+ \else
+ \ifpal@hascover
+ \ifpal@fillpages
+ \ifpal@twoside
+ \global\pal@rightpagefalse
+ \global\pal@leftpagetrue
+ \setcounter{page}{0}
+ \pal@emptypage
+ \global\pal@rightpagetrue
+ \global\pal@leftpagefalse
+ \global\pal@haslastemptypagetrue
+ \else
+ \pal@haspagestrue
+ \global\pal@rightpagetrue
+ \fi
+ \else
+ \pal@haspagestrue
+ \global\pal@rightpagetrue
+ \fi
+ \else
+ \pal@haspagestrue
+ \global\pal@rightpagetrue
+ \fi
+ \fi
+ \fi
+ \fi
+}
+\newcommand\pal@setupcover{
+ \pal@isinitgridfalse
+ \pal@pagewidth=\ifdim\coverwidth=\pal@undefdim\pagewidth\else\coverwidth\fi
+ \pal@pageheight=\ifdim\coverheight=\pal@undefdim\pageheight\else\coverheight\fi
+ \pal@outerbleed=\ifdim\coverouterbleed=\pal@undefdim\ifdim\coverbleed=\pal@undefdim\ifdim\outerbleed=\pal@undefdim\bleed\else\outerbleed\fi\else\coverbleed\fi\else\coverouterbleed\fi
+ \pal@innerbleed=\ifdim\coverinnerbleed=\pal@undefdim\ifdim\coverbleed=\pal@undefdim\ifdim\innerbleed=\pal@undefdim\bleed\else\innerbleed\fi\else\coverbleed\fi\else\coverinnerbleed\fi
+ \pal@topbleed=\ifdim\covertopbleed=\pal@undefdim\ifdim\coverbleed=\pal@undefdim\ifdim\topbleed=\pal@undefdim\bleed\else\topbleed\fi\else\coverbleed\fi\else\covertopbleed\fi
+ \pal@bottombleed=\ifdim\coverbottombleed=\pal@undefdim\ifdim\coverbleed=\pal@undefdim\ifdim\bottombleed=\pal@undefdim\bleed\else\bottombleed\fi\else\coverbleed\fi\else\coverbottombleed\fi
+ \pal@outersafetymargin=\ifdim\coveroutersafetymargin=\pal@undefdim\ifdim\coversafetymargin=\pal@undefdim\ifdim\outersafetymargin=\pal@undefdim\safetymargin\else\outersafetymargin\fi\else\coversafetymargin\fi\else\coveroutersafetymargin\fi
+ \pal@innersafetymargin=\ifdim\coverinnersafetymargin=\pal@undefdim\ifdim\coversafetymargin=\pal@undefdim\ifdim\innersafetymargin=\pal@undefdim\safetymargin\else\innersafetymargin\fi\else\coversafetymargin\fi\else\coverinnersafetymargin\fi
+ \pal@topsafetymargin=\ifdim\covertopsafetymargin=\pal@undefdim\ifdim\coversafetymargin=\pal@undefdim\ifdim\topsafetymargin=\pal@undefdim\safetymargin\else\topsafetymargin\fi\else\coversafetymargin\fi\else\covertopsafetymargin\fi
+ \pal@bottomsafetymargin=\ifdim\coverbottomsafetymargin=\pal@undefdim\ifdim\coversafetymargin=\pal@undefdim\ifdim\bottomsafetymargin=\pal@undefdim\safetymargin\else\bottomsafetymargin\fi\else\coversafetymargin\fi\else\coverbottomsafetymargin\fi
+}
+\newif\ifpal@pageoptiondouble
+\newif\ifpal@pageoptionfrontcover
+\newif\ifpal@pageoptionbackcover
+\newdimen\pal@backcovergutter
+\newdimen\pal@backcovermargin
+\newdimen\pal@backcovertopmargin
+\newdimen\pal@backcoverbottommargin
+\newdimen\pal@backcoverinnermargin
+\newdimen\pal@backcoveroutermargin
+\pgfkeys{
+ /pagetype/.is family,
+ /pagetype,
+ double/.is if=pal@pageoptiondouble,
+ front cover/.is if=pal@pageoptionfrontcover,
+ back cover/.is if=pal@pageoptionbackcover,
+ .unknown/.code=
+}
+\pgfkeys{
+ /page/.is family,
+ /page,
+ gutter/.store in=\pal@pageoptiongutter,
+ gutter=\gutter,
+ margin/.store in=\pal@pageoptionmargin,
+ margin=\margin,
+ top margin/.store in=\pal@pageoptiontopmargin,
+ top margin=\topmargin,
+ bottom margin/.store in=\pal@pageoptionbottommargin,
+ bottom margin=\bottommargin,
+ inner margin/.store in=\pal@pageoptioninnermargin,
+ inner margin=\innermargin,
+ outer margin/.store in=\pal@pageoptionoutermargin,
+ outer margin=\outermargin,
+ vpos/.code={\pal@gridvalign{#1}},
+ hpos/.code={\pal@gridhalign{#1}},
+ color/.store in=\pal@pageoptioncolor,
+ color=,
+ page color/.code={\setpagecolor{#1}},
+ page graphic/.code={\setpagegraphic{#1}},
+ before page/.code={\setbeforepage{#1}},
+ double/.code={},
+ front cover/.code={},
+ back cover/.code={},
+}
+\pgfkeys{
+ /backcover/.is family,
+ /backcover,
+ gutter/.store in=\pal@backcoveroptiongutter,
+ gutter=\gutter,
+ margin/.store in=\pal@backcoveroptionmargin,
+ margin=\margin,
+ top margin/.store in=\pal@backcoveroptiontopmargin,
+ top margin=\topmargin,
+ bottom margin/.store in=\pal@backcoveroptionbottommargin,
+ bottom margin=\bottommargin,
+ inner margin/.store in=\pal@backcoveroptioninnermargin,
+ inner margin=\innermargin,
+ outer margin/.store in=\pal@backcoveroptionoutermargin,
+ outer margin=\outermargin,
+ vpos/.store in=\pal@backcoveroptionvpos,
+ vpos=0.5,
+ hpos/.store in=\pal@backcoveroptionhpos,
+ hpos=0.5,
+ color/.store in=\pal@backcoveroptioncolor,
+ color=,
+ page color/.store in=\pal@backcoveroptionpagecolor,
+ page color=,
+ page graphic/.store in=\pal@backcoveroptionpagegraphic,
+ page graphic=,
+ before page/.code={},
+ double/.code={},
+ front cover/.code={},
+ back cover/.code={},
+}
+\newcommand\pal@applypageoptions[1]{
+ \pgfkeys{/page,#1}
+ \gutter=\pal@pageoptiongutter
+ \margin=\pal@pageoptionmargin
+ \topmargin=\pal@pageoptiontopmargin
+ \bottommargin=\pal@pageoptionbottommargin
+ \innermargin=\pal@pageoptioninnermargin
+ \outermargin=\pal@pageoptionoutermargin
+
+ \pal@beforepage
+}
+\newcommand\pal@applybackcoveroptions{
+ \pal@gridvalign{\pal@backcoveroptionvpos}
+ \pal@gridhalign{\pal@backcoveroptionhpos}
+
+ \ifx\pal@backcoveroptionpagecolor\pal@emptystring
+ \def\pal@pagecolor{}
+ \else
+ \setpagecolor{\pal@backcoveroptionpagecolor}
+ \fi
+ \ifx\pal@backcoveroptionpagegraphic\pal@emptystring
+ \def\pal@pagegraphic{}
+ \else
+ \def\pal@pagegraphic{\pal@backcoveroptionpagegraphicfile}
+ \def\pal@pagegraphicoptionscale{\pal@backcoveroptionpagegraphicscale}
+ \def\pal@pagegraphicoptionvpos{\pal@backcoveroptionpagegraphicvpos}
+ \def\pal@pagegraphicoptionhpos{\pal@backcoveroptionpagegraphichpos}
+ \def\pal@pagegraphicoptionunsharp{\pal@backcoveroptionpagegraphicunsharp}
+ \fi
+ \ifx\pal@backcoveroptioncolor\pal@emptystring
+ \def\pal@pageoptioncolor{\pal@backcovercolor}
+ \else
+ \def\pal@pageoptioncolor{\pal@backcoveroptioncolor}
+ \fi
+ \setborder[radius=\pal@backcoveroptionborderradius,width=\pal@backcoveroptionborderwidth,opacity=\pal@backcoveroptionborderopacity,color=\pal@backcoveroptionbordercolor]{}
+ \setshadow[size=\pal@backcoveroptionshadowsize,opacity=\pal@backcoveroptionshadowopacity,color=\pal@backcoveroptionshadowcolor,xshift=\pal@backcoveroptionshadowxshift,yshift=\pal@backcoveroptionshadowyshift]{}
+ \gutter=\pal@backcovergutter
+ \margin=\pal@backcovermargin
+ \topmargin=\pal@backcovertopmargin
+ \bottommargin=\pal@backcoverbottommargin
+ \innermargin=\pal@backcoverinnermargin
+ \outermargin=\pal@backcoveroutermargin
+
+ \ifdefined\pal@backcovergrid
+ \pal@backcovergrid
+ \fi
+
+ \pal@beforepage
+}
+\newcommand\page[2][]{
+ \pal@pageoptiondoublefalse
+ \pal@pageoptionfrontcoverfalse
+ \pal@pageoptionbackcoverfalse
+ \pgfkeys{/pagetype,#1}
+ \ifpal@pageoptiondouble
+ \pal@doublepage[#1]{#2}
+ \else
+ \ifpal@pageoptionfrontcover
+ \pal@frontcover[#1]{#2}
+ \else
+ \ifpal@pageoptionbackcover
+ \pal@backcover[#1]{#2}
+ \else
+ \pal@standardpage[#1]{#2}
+ \fi
+ \fi
+ \fi
+}
+\newcommand\pal@standardpage[2][]{
+ \global\pal@placeholdercounter=0\relax
+ \ifpal@backcover
+ \pal@setupcover
+ \else
+ \pal@setuppage
+ \fi
+ \pal@ispagetrue
+ \global\pal@topmargintmp=\topmargin\global\topmargin=\pal@undefdim
+ \pal@setdimensions
+ \ifpal@fanfold
+ \ifpal@leftpage
+ \global\pal@isfanfoldopentrue
+ \begin{picture}(\pal@dimentonumber\paperwidth,\pal@dimentonumber\paperheight)
+ \fi
+ \else
+ \begin{picture}(\pal@dimentonumber\paperwidth,\pal@dimentonumber\paperheight)
+ \fi
+ \topmargin=\pal@topmargintmp
+ \begingroup
+ \ifpal@fanfold
+ \ifpal@pagenumberinghaschanged
+ \global\pal@pagenumberinghaschangedfalse
+ \else
+ \ifpal@rightpage
+ \global\addtocounter{page}{1}
+ \fi
+ \fi
+ \fi
+ \ifpal@backcover
+ \pal@applybackcoveroptions
+ \else
+ \pal@applypageoptions{#1}
+ \fi
+ \pal@putbeforepage
+ #2
+ \pal@putbleed
+ \pal@putgrid
+ \pal@putcuttingmarks
+ \pal@putsafezone
+ \endgroup
+ \ifpal@fanfold
+ \ifpal@rightpage
+ \ifnum\pal@tocfixpageoffset=-1
+ \addtocounter{page}{-1}
+ \fi
+ \global\pal@isfanfoldopenfalse
+ \end{picture}
+ \ifnum\pal@tocfixpageoffset=-1
+ \addtocounter{page}{1}
+ \global\def\pal@tocfixpageoffset{0}
+ \fi
+ \fi
+ \else
+ \end{picture}
+ \fi
+ \global\topmargin=\pal@topmargintmp
+ \pal@ispagefalse
+}
+\newcommand\pal@doublepage[2][]{
+ \global\pal@placeholdercounter=0\relax
+ \ifpal@twoside
+ \ifpal@haspages
+ \ifpal@leftpage\page{}\fi
+ \else
+ \ifpal@beginleft
+ \ifpal@beginright
+ \page{}
+ \fi
+ \else
+ \page{}
+ \fi
+ \fi
+ \pal@ispagetrue
+ \global\pal@isdoublepagetrue
+ \pal@setuppage
+ \global\pal@topmargintmp=\topmargin\global\topmargin=\pal@undefdim
+ \pal@setdimensions
+ \begin{picture}(\pal@dimentonumber\paperwidth,\pal@dimentonumber\paperheight)
+ \topmargin=\pal@topmargintmp
+ \pal@applypageoptions{#1}
+ \pal@putbeforepage
+ #2
+ \pal@putbleed
+ \pal@putgrid
+ \pal@putcuttingmarks
+ \pal@putsafezone
+ \ifnum\pal@tocfixpageoffset=1
+ \addtocounter{page}{1}
+ \fi
+ \end{picture}
+
+ \pal@setuppage
+ \ifpal@fanfold
+ \ifnum\pal@tocfixpageoffset=1
+ \global\def\pal@tocfixpageoffset{0}
+ \else
+ \addtocounter{page}{1}
+ \fi
+ \else
+ \pal@setdimensions
+ \begin{picture}(\pal@dimentonumber\paperwidth,\pal@dimentonumber\paperheight)
+ \topmargin=\pal@topmargintmp
+ \pal@applypageoptions{#1}
+ \global\pal@placeholdercounter=0\relax
+ \pal@putbeforepage
+ #2
+ \pal@putbleed
+ \pal@putgrid
+ \pal@putcuttingmarks
+ \pal@putsafezone
+ \end{picture}
+ \fi
+ \global\pal@isdoublepagefalse
+ \global\topmargin=\pal@topmargintmp
+ \pal@ispagefalse
+ \else
+ \pal@standardpage[#1]{#2}
+ \fi
+}
+\newcommand\pal@backcover[2][]{
+ \ifpal@hascover
+ \pal@errmsg@backcoverdefinedafterfrontcover
+ \else
+ \ifdefined\pal@tmpgrid
+ \let\pal@backcovergrid\pal@tmpgrid
+ \fi
+ \edef\pal@backcovercolor{\paloptions@color}
+ \pgfkeys{/backcover,#1}
+ \pal@backcovergutter=\pal@backcoveroptiongutter
+ \pal@backcovermargin=\pal@backcoveroptionmargin
+ \pal@backcovertopmargin=\pal@backcoveroptiontopmargin
+ \pal@backcoverbottommargin=\pal@backcoveroptionbottommargin
+ \pal@backcoverinnermargin=\pal@backcoveroptioninnermargin
+ \pal@backcoveroutermargin=\pal@backcoveroptionoutermargin
+ \ifx\pal@backcoveroptionpagecolor\pal@emptystring
+ \let\pal@backcoveroptionpagecolor\pal@pagecolor
+ \fi
+ \ifx\pal@backcoveroptionpagegraphic\pal@emptystring
+ \let\pal@backcoveroptionpagegraphic\pal@pagegraphic
+ \let\pal@backcoveroptionpagegraphicfile\pal@pagegraphic
+ \ifdefined\pal@pagegraphicoptionscale
+ \let\pal@backcoveroptionpagegraphicscale\pal@pagegraphicoptionscale
+ \fi
+ \ifdefined\pal@pagegraphicoptionhpos
+ \let\pal@backcoveroptionpagegraphichpos\pal@pagegraphicoptionhpos
+ \fi
+ \ifdefined\pal@pagegraphicoptionvpos
+ \let\pal@backcoveroptionpagegraphicvpos\pal@pagegraphicoptionvpos
+ \fi
+ \ifdefined\pal@pagegraphicoptionunsharp
+ \let\pal@backcoveroptionpagegraphicunsharp\pal@pagegraphicoptionunsharp
+ \fi
+ \else
+ \ifcsname pal@graphic@\pal@backcoveroptionpagegraphic\endcsname
+ \csname pal@graphic@\pal@backcoveroptionpagegraphic\endcsname[1]{}
+ \else
+ \def\pal@backcoveroptionpagegraphicfile{\pal@backcoveroptionpagegraphic}
+ \def\pal@backcoveroptionpagegraphicscale{1}
+ \def\pal@backcoveroptionpagegraphichpos{0.5}
+ \def\pal@backcoveroptionpagegraphicvpos{0.5}
+ \def\pal@backcoveroptionpagegraphicunsharp{\pal@unsharp}
+ \fi
+ \fi
+ \let\pal@backcoveroptionborderradius\pal@defaultborderradius
+ \let\pal@backcoveroptionborderopacity\pal@defaultborderopacity
+ \let\pal@backcoveroptionborderwidth\pal@defaultborderwidth
+ \let\pal@backcoveroptionbordercolor\pal@defaultbordercolor
+ \let\pal@backcoveroptionshadowopacity\pal@defaultshadowopacity
+ \let\pal@backcoveroptionshadowsize\pal@defaultshadowsize
+ \let\pal@backcoveroptionshadowcolor\pal@defaultshadowcolor
+ \let\pal@backcoveroptionshadowxshift\pal@defaultshadowxshift
+ \let\pal@backcoveroptionshadowyshift\pal@defaultshadowyshift
+
+ \ifdefined\pal@currentcontents
+ \let\pal@backcovercontent\pal@currentcontents
+ \def\pal@backcovertemplate{#2}
+ \else
+ \def\pal@backcovercontent{#2}
+ \fi
+ \fi
+}
+\newcommand\pal@frontcover[2][]{
+ \pal@ispagetrue
+ \pal@hascovertrue
+ \pal@setupcover
+ \setcounter{page}{0}
+ \global\pal@topmargintmp=\topmargin\global\topmargin=\pal@undefdim
+ \ifpal@cover
+ \global\pal@frontcovertrue
+ \pal@setdimensions
+ \begin{picture}(\pal@dimentonumber\paperwidth,\pal@dimentonumber\paperheight)
+ \topmargin=\pal@topmargintmp
+ \global\pal@backcovertrue
+ \def\pal@currentbeforepage{}
+ \begingroup
+ \ifdefined\pal@backcovercontent
+ \pal@applybackcoveroptions
+ \pal@putbeforepage
+ \ifdefined\pal@backcovertemplate
+ \pal@placeholdercounter 0\relax%
+ \let\pal@currentcontents\pal@backcovercontent%
+ \pal@backcovertemplate%
+ \else
+ \pal@backcovercontent
+ \fi
+ \fi
+ \pal@putbleed
+ \pal@putgrid
+ \pal@putcuttingmarks
+ \pal@putsafezone
+ \endgroup
+ \global\pal@backcoverfalse
+ \pal@resetautogrid
+ \pal@gridoffsetx=\dimexpr(\pal@pagewidth + \pal@outerbleed - \pal@innerbleed + \spinewidth)\relax
+ \pal@applypageoptions{#1}
+ \global\pal@placeholdercounter=0\relax
+ \pal@putbeforepage
+ #2
+ \pal@putbleed
+ \pal@putgrid
+ \pal@putcuttingmarks
+ \pal@putsafezone
+ \end{picture}
+ \global\pal@frontcoverfalse
+ \let\pal@backcovercontent\undefined
+ \else
+ \pal@setdimensions
+ \begin{picture}(\pal@dimentonumber\paperwidth,\pal@dimentonumber\paperheight)
+ \topmargin=\pal@topmargintmp
+ \pal@applypageoptions{#1}
+ \def\pal@currentbeforepage{}
+ \pal@putbeforepage
+ #2
+ \pal@putbleed
+ \pal@putgrid
+ \pal@putcuttingmarks
+ \pal@putsafezone
+ \end{picture}
+ \fi
+ \global\topmargin=\pal@topmargintmp
+ \pal@ispagefalse
+}
+\newcommand\leftpage[1]{
+ \ifpal@leftpage
+ \pal@renderleftpage{#1}
+ \else
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \pal@renderleftpage{#1}
+ \fi
+ \else
+ \ifpal@isdoublepage
+ \pal@renderleftpage[1]{#1}
+ \fi
+ \fi
+ \fi
+}
+\newcommand\rightpage[1]{
+ \ifpal@rightpage
+ \pal@renderrightpage{#1}
+ \else
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \pal@renderrightpage{#1}
+ \fi
+ \else
+ \ifpal@isdoublepage
+ \pal@renderrightpage[1]{#1}
+ \fi
+ \fi
+ \fi
+}
+\newcommand\pal@renderleftpage[2][0]{
+ \begingroup
+ \pal@isdoublepagefalse
+ \pal@setdimensions
+ \pal@closerows
+ \ifnum#1=1
+ \pal@drymodetrue
+ \fi
+ #2
+ \ifnum#1=1
+ \pal@drymodefalse
+ \else
+ \ifpal@isbeforepage
+ \else
+ \pal@putgrid
+ \fi
+ \fi
+ \endgroup
+}
+\newif\ifpal@wasdoublepage
+\newif\ifpal@renderrightpage
+\newcommand\pal@renderrightpage[2][0]{
+ \pal@renderrightpagetrue
+ \begingroup
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \pal@wasdoublepagetrue
+ \addtocounter{page}{1}
+ \fi
+ \fi
+ \pal@isdoublepagefalse
+ \pal@rightpagetrue
+ \pal@leftpagefalse
+ \pal@setdimensions
+ \pal@closerows
+ \ifnum#1=1
+ \pal@drymodetrue
+ \fi
+ #2
+ \ifnum#1=1
+ \pal@drymodefalse
+ \else
+ \ifpal@isbeforepage
+ \else
+ \pal@putgrid
+ \fi
+ \fi
+ \ifpal@fanfold
+ \ifpal@wasdoublepage
+ \pal@wasdoublepagefalse
+ \addtocounter{page}{-1}
+ \fi
+ \fi
+ \endgroup
+ \pal@renderrightpagefalse
+}
+
+% templates
+\newif\ifpal@drymode
+\newif\ifpal@placeholderoptions
+\newif\ifpal@placeholdermode
+\newif\ifpal@isplace
+\pal@placeholderoptionstrue
+\newcount\pal@placeholdercounter
+\newcount\pal@contentcounter
+\newdimen\pal@placeholderfontsize
+\def\pal@frameyymax{0}
+\def\pal@framexxmax{0}
+\def\pal@setgridframe#1 #2 #3 #4 \\{
+ \def\pal@framey{#1}
+ \def\pal@framex{#2}
+ \def\pal@frameyy{#3}
+ \def\pal@framexx{#4}
+}
+\def\pal@setdefaultgridframe#1 #2 #3 #4 \\{
+ \def\pal@defaultframey{#1}
+ \def\pal@defaultframex{#2}
+ \def\pal@defaultframeyy{#3}
+ \def\pal@defaultframexx{#4}
+ \pal@setgridframe #1 #2 #3 #4 \\
+}
+\def\pal@resetgridframe{
+ \global\pal@isplacefalse
+ \pgfmathceil{\pal@frameyy}
+ \pgfmathint{\pgfmathresult}
+ \global\edef\pal@currentrow{\pgfmathresult}
+ \ifnum\pal@currentrow>\pal@frameyymax
+ \global\edef\pal@frameyymax{\pal@currentrow}
+ \global\def\pal@framexxmax{0}
+ \fi
+ \pgfmathceil{\pal@framexx}
+ \pgfmathint{\pgfmathresult}
+ \global\edef\pal@currentcell{\pgfmathresult}
+ \ifnum\pal@currentcell>\pal@framexxmax
+ \global\edef\pal@framexxmax{\pal@currentcell}
+ \fi
+
+ \pgfmathqparse{\pal@get{\pal@frameyymax C}pt>\pal@framexxmax pt}
+ \ifnum\pgfmathresult=1
+ \global\edef\pal@framey{\the\numexpr\pal@frameyymax-1\relax}
+ \global\edef\pal@framex{\pal@framexxmax}
+ \global\edef\pal@frameyy{\pal@frameyymax}
+ \global\edef\pal@framexx{\the\numexpr\pal@framexxmax+1\relax}
+ \else
+ \ifnum\pal@frameyymax=\pal@rowscount
+ \global\pal@gridfulltrue
+ \else
+ \global\edef\pal@framey{\pal@frameyymax}
+ \global\edef\pal@framex{0}
+ \global\edef\pal@frameyy{\the\numexpr\pal@frameyymax+1\relax}
+ \global\edef\pal@framexx{1}
+ \fi
+ \fi
+}
+\newcommand\placeholder[2][0]{
+ \begingroup
+ \ifx#2\pal@emptystring
+ \else
+ \global\pal@isplacetrue
+ \fi
+ \def\pal@currentplaceholder{}
+ \ifnum#1=0
+ \global\advance \pal@placeholdercounter by 1
+ \else
+ \global\pal@placeholdercounter=#1
+ \fi
+ \pal@contentcounter 0\relax
+ \def\pal@tmp{\pal@currentcontents}
+ \pal@placeholdermode{1}
+ \pal@tmp
+ \pal@placeholdermode{0}
+ \pal@putcontent{
+ \ifx\pal@emptystring\pal@currentplaceholder
+ \ifpal@placeholder
+ \ifx#2\pal@emptystring
+ \else
+ \pal@setgridframe #2 \\
+ \fi
+ \pal@textboxheight=\dimexpr(\posy{1}{\pal@framey} - \posy{-1}{\pal@frameyy})\relax
+ \pal@textboxwidth=\dimexpr(\posx{-1}{\pal@frameyy}{-1}{\pal@framexx} - \posx{1}{\pal@framey}{1}{\pal@framex})\relax
+ \ifdim\pal@textboxwidth>\pal@textboxheight
+ \pal@placeholderfontsize=0.5\pal@textboxheight
+ \else
+ \pal@placeholderfontsize=0.5\pal@textboxwidth
+ \fi
+ \ifdim\pal@placeholderfontsize>1000pt
+ \pal@placeholderfontsize=1000pt
+ \fi
+ \pal@putxput{\pal@framey}{\pal@framex}{\pal@frameyy}{\pal@framexx}{%
+ \begin{tikzpicture}%
+ \pgflowlevelsynccm%
+ \filldraw[line width=0.1mm,draw=cyan!60,fill=cyan!30,opacity=0.3] (0,0) rectangle ++(\width,\height);
+ \ifdim\pal@placeholderfontsize>5mm
+ \node[opacity=0.3] at (0.5\width,0.5\height){
+ \fontsize{\pal@placeholderfontsize}{0pt}\selectfont\textcolor{cyan!60}{\textbf{\the\pal@placeholdercounter}}
+ };
+ \fi
+ \end{tikzpicture}%
+ }
+ \pal@resetgridframe
+ \else
+ \ifx\pal@currentplaceholdertype\pal@placeholdertypeusetext
+ \ifx#2\pal@emptystring
+ \else
+ \pal@setgridframe #2 \\
+ \fi
+ \ifx\pal@currentplaceholderoptions\pal@emptystring
+ \pal@placeholderoptionsfalse
+ \csname \pal@currentplaceholdertype\endcsname
+ \pal@placeholderoptionstrue
+ \else
+ \csname \pal@currentplaceholdertype\endcsname[\pal@currentplaceholderoptions]
+ \fi
+ \fi
+ \fi
+ \else
+ \ifx#2\pal@emptystring
+ \else
+ \pal@setgridframe #2 \\
+ \fi
+ \ifx\pal@currentplaceholderoptions\pal@emptystring
+ \pal@placeholderoptionsfalse
+ \csname \pal@currentplaceholdertype\endcsname{\pal@currentplaceholder}
+ \pal@placeholderoptionstrue
+ \else
+ \csname \pal@currentplaceholdertype\endcsname[\pal@currentplaceholderoptions]{\pal@currentplaceholder}
+ \fi
+ \fi
+ }
+ \endgroup
+}
+\newcommand\pal@graphic[2][]{
+ \advance \pal@contentcounter by 1
+ \ifnum\pal@contentcounter=\pal@placeholdercounter
+ \def\pal@currentplaceholdertype{graphic}
+ \def\pal@currentplaceholderoptions{}
+ \pgfkeys{graphic,file={#2},scale=1,vpos=0.5,hpos=0.5,unsharp=\pal@unsharp,#1}
+ \ifcsname pal@graphic@#2\endcsname%
+ \csname pal@graphic@#2\endcsname[2]{#1}%
+ \fi
+
+ \edef\pal@currentplaceholder{\pal@graphicoptionfile}
+ \fi
+}
+\newcommand\pal@xput[1]{
+ \advance \pal@contentcounter by 1
+ \ifnum\pal@contentcounter=\pal@placeholdercounter
+ \def\pal@currentplaceholdertype{xput}
+ \def\pal@currentplaceholderoptions{}
+ \def\pal@currentplaceholder{#1}
+ \fi
+}
+\newcommand\pal@tikz[1]{
+ \advance \pal@contentcounter by 1
+ \ifnum\pal@contentcounter=\pal@placeholdercounter
+ \def\pal@currentplaceholdertype{tikzgraphic}
+ \def\pal@currentplaceholderoptions{}
+ \def\pal@currentplaceholder{#1}
+ \fi
+}
+\newcommand\pal@text[2][]{
+ \advance \pal@contentcounter by 1
+ \ifnum\pal@contentcounter=\pal@placeholdercounter
+ \def\pal@currentplaceholdertype{text}
+ \def\pal@currentplaceholderoptions{}
+ \edef\pal@currentborderradius{\pal@defaultborderradius}
+ \edef\pal@currentborderwidth{\pal@defaultborderwidth}
+ \edef\pal@currentbordercolor{\pal@defaultbordercolor}
+ \edef\pal@currentborderopacity{\pal@defaultborderopacity}
+ \pgfkeys{text,name=default,color=\ifx\pal@pageoptioncolor\pal@emptystring\paloptions@color\else\pal@pageoptioncolor\fi,border radius=\pal@currentborderradius,border width=\pal@currentborderwidth,border color=\pal@currentbordercolor,border opacity=\pal@currentborderopacity,#1}
+ \def\pal@currentplaceholder{#2}
+ \fi
+}
+\def\pal@placeholdertypeusetext{usetext}
+\newcommand\pal@usetext[1][default]{
+ \advance \pal@contentcounter by 1
+ \ifnum\pal@contentcounter=\pal@placeholdercounter
+ \edef\pal@currentplaceholdertype{\pal@placeholdertypeusetext}
+ \def\pal@currentplaceholderoptions{#1}
+ \def\pal@currentplaceholder{}
+ \fi
+}
+\newcommand\pal@rendertemplate[3]{
+ \pal@placeholdercounter 0\relax%
+ \global\def\pal@currentcontents{#2}%
+ \page[#1]{%
+ #3
+ }%
+}
+\newcommand{\newtemplate}[3][]{
+ \expandafter\newcommand\csname pal@template@#2\endcsname[2][]{%
+ \pal@rendertemplate{#1,##1}{##2}{#3}
+ }%
+}
+\newcommand\template[3][]{
+ \ifcsname pal@template@#2\endcsname%
+ \else%
+ \newtemplate[]{#2}{
+ \pal@gridsc{#2}
+ }
+ \fi
+ \csname pal@template@#2\endcsname[#1]{
+ #3
+ }
+}
+\newcommand\graphic{}
+\newcommand\xput{}
+\newcommand\tikzgraphic{}
+\newcommand\usetext{}
+\newcommand\text{}
+\newcommand\pal@putcontent[1]{
+ \ifpal@drymode
+ \else
+ \begingroup
+ \ifpal@gridfull
+ \ifpal@isplace#1\fi
+ \else
+ #1
+ \fi
+ \endgroup
+ \fi
+}
+\newcommand\pal@placeholdermode[1]{
+ \pal@placeholdermodefalse
+ \ifnum#1=0%
+ \renewcommand\graphic[2][]{%
+ \pal@putcontent{%
+ \def\pal@graphicoptionfile{##2}
+ \ifpal@placeholderoptions
+ \ifcsname pal@graphic@##2\endcsname%
+ \csname pal@graphic@##2\endcsname[2]{##1}
+ \else
+ \pgfkeys{graphic,file={##2},scale=1,vpos=0.5,hpos=0.5,unsharp=\pal@unsharp,##1}
+ \fi
+ \fi
+ \pal@putgraphic{\pal@framey}{\pal@framex}{\pal@frameyy}{\pal@framexx}{\pal@graphicoptionfile}%
+ \pal@resetgridframe
+ }
+ }%
+ \renewcommand\xput[1]{%
+ \pal@putcontent{%
+ \pal@putxput{\pal@framey}{\pal@framex}{\pal@frameyy}{\pal@framexx}{##1}%
+ \pal@resetgridframe
+ }
+ }%
+ \renewcommand\tikzgraphic[1]{%
+ \pal@putcontent{%
+ \pal@puttikz{\pal@framey}{\pal@framex}{\pal@frameyy}{\pal@framexx}{##1}%
+ \pal@resetgridframe
+ }
+ }%
+ \renewcommand\usetext[1][default]{%
+ \pal@putcontent{%
+ \pal@putusetext[##1]{\pal@framey}{\pal@framex}{\pal@frameyy}{\pal@framexx}%
+ \pal@resetgridframe
+ }
+ }%
+ \renewcommand\text[2][]{%
+ \pal@putcontent{%
+ \edef\pal@currentborderradius{\pal@defaultborderradius}
+ \edef\pal@currentborderwidth{\pal@defaultborderwidth}
+ \edef\pal@currentbordercolor{\pal@defaultbordercolor}
+ \edef\pal@currentborderopacity{\pal@defaultborderopacity}
+ \pgfkeys{text,name=default,color=\ifx\pal@pageoptioncolor\pal@emptystring\paloptions@color\else\pal@pageoptioncolor\fi,border radius=\pal@currentborderradius,border width=\pal@currentborderwidth,border color=\pal@currentbordercolor,border opacity=\pal@currentborderopacity,##1}
+ \pal@puttext{\pal@framey}{\pal@framex}{\pal@frameyy}{\pal@framexx}{##2}%
+ \pal@resetgridframe
+ }
+ }%
+ \else%
+ \pal@placeholdermodetrue
+ \renewcommand\graphic[2][]{%
+ \pal@graphic[##1]{##2}%
+ }%
+ \renewcommand\xput[1]{%
+ \pal@xput{##1}%
+ }%
+ \renewcommand\tikzgraphic[1]{%
+ \pal@tikz{##1}%
+ }%
+ \renewcommand\usetext[1][default]{%
+ \pal@usetext[##1]%
+ }
+ \renewcommand\text[2][]{%
+ \pal@text[##1]{##2}%
+ }
+ \fi%
+}
+\pal@placeholdermode{0}
+\newcommand\place[1]{
+ \pal@isplacetrue
+ \pal@setgridframe #1 \\
+}
+\pal@setdefaultgridframe 0 0 1 1 \\
+
+\newcommand\pal@emptypage{
+ \global\pal@isemptypagetrue
+ \page[before page=,page graphic=,page color=]{}
+ \global\pal@isemptypagefalse
+}
+
+\def\pal@tocfixpageoffset{0}
+\def\sectioncalled{
+ \ifpal@fanfold
+ \ifpal@isdoublepage
+ \ifpal@rightpage
+ \global\def\pal@tocfixpageoffset{1}
+ \fi
+ \else
+ \ifpal@renderrightpage
+ \global\def\pal@tocfixpageoffset{1}
+ \else
+ \ifpal@leftpage
+ \global\def\pal@tocfixpageoffset{-1}
+ \fi
+ \fi
+ \fi
+ \fi
+}
+
+\def\pal@turbojobname{pagelayoutturbobatchoptimizexyz}
+\edef\pal@turbojobname{\meaning\pal@turbojobname}
+\edef\pal@jobname{\jobname}
+\edef\pal@jobname{\meaning\pal@jobname}
+\AtBeginDocument{
+ % fanfold toc partial fix
+ \let\pal@originalsection\section
+ \def\pal@nextsection#1{
+ \sectioncalled
+ \@ifnextchar\bgroup{\pal@originalsection*}{\pal@originalsection{#1}}}
+ \let\section\pal@nextsection
+ \let\pal@originalsubsection\subsection
+ \def\pal@nextsubsection#1{
+ \sectioncalled
+ \@ifnextchar\bgroup{\pal@originalsubsection*}{\pal@originalsubsection{#1}}}
+ \let\subsection\pal@nextsubsection
+
+ \ifpal@optimize
+ \else
+ \pal@isturbomodefalse
+ \fi
+
+ \ifpal@isturbomode
+ \ifx\pal@jobname\pal@turbojobname
+ \pal@placeholderfalse
+ \pal@gridfalse
+ \pal@safezonefalse
+ \pal@cuttingmarksfalse
+ \pal@fillpagesfalse
+ \pal@graphpaperfalse
+ \pal@preflightfalse
+
+ \pal@isbatchmodetrue
+ \else
+ \pal@start
+ \fi
+ \else
+ \ifpal@import
+ \pal@start
+ \fi
+ \fi
+
+ \ifx\pal@pagegraphic\pal@emptystring
+ \ifx\paloptions@pagegraphic\pal@emptystring
+ \else
+ \setpagegraphic{\paloptions@pagegraphic}
+ \fi
+ \fi
+
+ \ifpal@fanfold
+ \pal@covertrue
+ \fi
+}
+\AtEndDocument{
+ \ifpal@beginleft
+ \ifpal@leftpage
+ \pal@hasoddnumberofpagestrue
+ \fi
+ \else
+ \ifpal@rightpage
+ \pal@hasoddnumberofpagestrue
+ \fi
+ \fi
+ \ifdefined\pal@backcovercontent
+ \pal@haspagestrue
+ \ifpal@haslastemptypage
+ \ifpal@hasoddnumberofpages
+ \pal@standardpage[before page=]{}
+ \pal@emptypage
+ \else
+ \pal@emptypage
+ \fi
+ \else
+ \ifpal@twoside
+ \ifpal@hasoddnumberofpages\page[before page=]{}\fi
+ \fi
+ \fi
+ \pal@leftpagetrue
+ \pal@rightpagefalse
+ \pal@backcovertrue
+ \ifdefined\pal@backcovertemplate
+ \pal@placeholdercounter 0\relax%
+ \let\pal@currentcontents\pal@backcovercontent%
+ \def\pal@currentbeforepage{}
+ \pal@standardpage{%
+ \pal@backcovertemplate%
+ }%
+ \else
+ \def\pal@currentbeforepage{}
+ \pal@standardpage{
+ \pal@backcovercontent
+ }
+ \fi
+ \else
+ \ifpal@haspages
+ \ifpal@fanfold
+ \ifpal@isfanfoldopen
+ \ifpal@beginleft
+ \pal@standardpage[before page=]{}
+ \else
+ \pal@emptypage
+ \fi
+ \else
+ \ifpal@beginleft
+ \else
+ \pal@standardpage[before page=]{}
+ \pal@emptypage
+ \fi
+ \fi
+ \else
+ \ifpal@haslastemptypage
+ \ifpal@hasoddnumberofpages
+ \pal@standardpage[before page=]{}
+ \pal@emptypage
+ \else
+ \pal@emptypage
+ \fi
+ \else
+ \ifpal@twoside
+ \ifpal@hasoddnumberofpages\pal@standardpage[before page=]{}\fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifpal@isbatchmode
+ \pal@batchoptimize
+ \fi
+}
+
+% scripts
+\newread\pal@scriptresult
+\def\pal@batchlist{}
+\def\pal@ok{ok}
+\def\pal@err@shellaccessforbidden{errorshellaccessforbidden}
+\def\pal@err@importdirnotfound{errorimportdirnotfound}
+\def\pal@err@noimportdir{errornoimportdir}
+\def\pal@err@magicknotinstalled{errormagicknotinstalled}
+\def\pal@err@inkscapenotinstalled{errorinkscapenotinstalled}
+\newcommand\pal@getppi[1]{
+ \immediate\openin\pal@scriptresult={|pagelayoutapi getwidth\% "#1"}
+ \ifeof\pal@scriptresult
+ \pal@errmsg@shellaccessforbidden{Ppi not calculated}
+ \else
+ \endlinechar=-1
+ \read\pal@scriptresult to \pal@graphicwidth
+ \endlinechar=13
+ \ifx\pal@graphicwidth\pal@emptystring
+ \pal@errmsg@shellaccessfailed{Ppi not calculated}
+ \else
+ \ifx\pal@graphicwidth\pal@err@magicknotinstalled
+ \pal@errmsg@magicknotinstalled{Ppi not calculated}
+ \else
+ \pgfmathqparse{(\pal@originalgraphicwidth - \pal@cropleft - \pal@cropright) / \pal@originalgraphicwidth * \pal@graphicwidth pt / \the\width * 72.27pt}
+
+ \pgfmathint{\pgfmathresult}
+ \edef\pal@graphicdensity{\pgfmathresult}
+ \fi
+ \fi
+ \fi
+ \immediate\closein\pal@scriptresult
+}
+\newcommand\pal@optimizegraphic[2]{
+ \immediate\openin\pal@scriptresult={|pagelayoutapi optimize\% "#1#2" \% "\pal@filename" \%\pal@optimizedext\%\the\numexpr\pal@originalgraphicwidth\%\the\numexpr\pal@originalgraphicheight\%\the\numexpr\pal@cropleft\%\the\numexpr\pal@cropright\%\the\numexpr\pal@croptop\%\the\numexpr\pal@cropbottom\%\the\numexpr\pal@density\%\the\numexpr\width\%\the\numexpr\height\%\pal@downsamplethreshold\%\pal@graphicoptionunsharp\%\pal@quality}
+ \ifeof\pal@scriptresult
+ \pal@errmsg@shellaccessforbidden{File not optimized}
+ \else
+ \endlinechar=-1
+ \read\pal@scriptresult to \pal@processresult
+ \endlinechar=13
+ \ifx\pal@processresult\pal@emptystring
+ \pal@errmsg@shellaccessfailed{File not optimized}
+ \else
+ \ifx\pal@processresult\pal@err@magicknotinstalled
+ \pal@errmsg@magicknotinstalled{File not optimized}
+ \fi
+ \fi
+ \fi
+ \immediate\closein\pal@scriptresult
+}
+\newcommand\pal@makeshadow[1]{
+ \immediate\openin\pal@scriptresult={|pagelayoutapi makeshadow\%#1\%\pal@defaultshadowsize\%\pal@defaultshadowopacity\%\pal@defaultshadowcolor\%\the\pal@frameshadowwidth\%\the\pal@frameshadowheight\%\the\pal@frameshadowframewidth\%\the\pal@frameshadowframeheight\%\the\pal@frameshadowborder\%\the\pal@frameshadowradius}
+ \ifeof\pal@scriptresult
+ \edef\pal@processresult{\pal@err@shellaccessforbidden}
+ \pal@errmsg@shellaccessforbidden{Shadow not created}
+ \else
+ \endlinechar=-1
+ \read\pal@scriptresult to \pal@processresult
+ \endlinechar=13
+ \ifx\pal@processresult\pal@emptystring
+ \pal@errmsg@shellaccessfailed{Shadow not created}
+ \else
+ \ifx\pal@processresult\pal@err@inkscapenotinstalled
+ \pal@errmsg@inkscapenotinstalled{Shadow not created}
+ \else
+ \fi
+ \fi
+ \fi
+ \immediate\closein\pal@scriptresult
+}
+\def\pal@start{
+ \immediate\openin\pal@scriptresult={|pagelayoutapi start\ifpal@import\%import\% "\ifdefined\Ginput@path\Ginput@path\fi" \fi\ifpal@isturbomode\%turbo\% "\jobname" \fi}
+ \ifeof\pal@scriptresult
+ \ifpal@import
+ \pal@errmsg@shellaccessforbidden{Import not working}
+ \fi
+ \else
+ \endlinechar=-1
+ \read\pal@scriptresult to \pal@processresult
+ \endlinechar=13
+ \ifx\pal@processresult\pal@emptystring
+ \ifpal@import
+ \pal@errmsg@shellaccessfailed{Import not working}
+ \fi
+ \else
+ \ifx\pal@processresult\pal@ok
+ \else
+ \ifx\pal@processresult\pal@err@noimportdir
+ \pal@errmsg@noimportdir
+ \else
+ \pal@errmsg@importdirnotfound{\pal@processresult}
+ \fi
+ \fi
+ \fi
+ \fi
+ \immediate\closein\pal@scriptresult
+}
+\newcommand\pal@addtobatchlist[2]{
+ \global\edef\pal@batchlist{\pal@batchlist\% "#1#2" \% "\pal@filename" \%\pal@optimizedext\%\the\numexpr\pal@originalgraphicwidth\%\the\numexpr\pal@originalgraphicheight\%\the\numexpr\pal@cropleft\%\the\numexpr\pal@cropright\%\the\numexpr\pal@croptop\%\the\numexpr\pal@cropbottom\%\the\numexpr\pal@density\%\the\numexpr\width\%\the\numexpr\height\%\pal@downsamplethreshold\%\pal@graphicoptionunsharp\%\pal@quality}
+}
+\newcommand\pal@batchoptimize{
+ \immediate\openin\pal@scriptresult={|pagelayoutapi batchoptimize\pal@batchlist}
+ \ifeof\pal@scriptresult
+ \else
+ \endlinechar=-1
+ \read\pal@scriptresult to \pal@processresult
+ \endlinechar=13
+ \fi
+ \immediate\closein\pal@scriptresult
+}
+
+% errors
+\def\pal@errmsg@undefined#1#2{
+ \ifx#2\pal@emptystring
+ \else
+ \ClassError{pagelayout}{Undefined #1 `#2'}{Check the name `#2'.\MessageBreak\MessageBreak\@ehc}
+ \fi
+}
+\def\pal@errmsg@backcoverdefinedafterfrontcover{
+ \ClassError{pagelayout}{Back cover needs to be defined before front cover}{Define the back cover before the front cover.\MessageBreak\MessageBreak\@ehc}
+}
+\def\pal@errmsg@shellaccessforbidden#1{
+ \ClassError{pagelayout}{Shell access forbidden. #1}{Make sure `pagelayoutapi' is added to the list of shell escape commands\MessageBreak(shell_escape_commands = pagelayoutapi) in your `texmf.cnf'.\MessageBreak\MessageBreak\@ehc}
+}
+\def\pal@errmsg@shellaccessfailed#1{
+ \ifdefined\XeTeXversion
+ \ClassError{pagelayout}{Shell access failed. #1}{Make sure the `scripts' folder is added to your path.\MessageBreak\MessageBreak\@ehc}
+ \else
+ \ClassError{pagelayout}{Shell access failed. #1}{Make sure the `scripts' folder is added to your path.\MessageBreak Shell access does not work in unrestricted mode (--shell-escape).\MessageBreak Make sure `pagelayoutapi' is added to the list of shell escape commands\MessageBreak(shell_escape_commands = pagelayoutapi) in your `texmf.cnf'.\MessageBreak\MessageBreak\@ehc}
+ \fi
+}
+\def\pal@errmsg@inkscapenotinstalled#1{
+ \ClassError{pagelayout}{Inkscape not installed. #1}{Make sure Inkscape is installed.\MessageBreak\MessageBreak\@ehc}
+}
+\def\pal@errmsg@magicknotinstalled#1{
+ \ClassError{pagelayout}{ImageMagick not installed. #1}{Make sure ImageMagick is installed.\MessageBreak\MessageBreak\@ehc}
+}
+\def\pal@errmsg@importdirnotfound#1{
+ \ClassError{pagelayout}{Import directory `#1' not found}{Create the directory `#1'.\MessageBreak\MessageBreak\@ehc}
+}
+\def\pal@errmsg@noimportdir{
+ \ClassError{pagelayout}{Import directory not found}{Create the directory `import' in your working directory\MessageBreak or define the shell variable `PAGELAYOUT_IMPORT_DIRECTORY'.\MessageBreak\MessageBreak\@ehc}
+}
+\def\pal@errmsg@lowdensity#1#2#3{
+ \ifnum#1=0
+ \ClassWarning{pagelayout}{The file `#2' has a low pixel density of #3 ppi}
+ \else
+ \ClassError{pagelayout}{The file `#2' has a very low a pixel density of #3 ppi}{Replace the image with one of higher resolution or reduce the display size.\MessageBreak\MessageBreak\@ehc}
+ \fi
+}