summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/geometry
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/geometry
Initial commit
Diffstat (limited to 'macros/latex/contrib/geometry')
-rw-r--r--macros/latex/contrib/geometry/README.md69
-rw-r--r--macros/latex/contrib/geometry/changes.txt353
-rw-r--r--macros/latex/contrib/geometry/geometry-samples.tex73
-rw-r--r--macros/latex/contrib/geometry/geometry.dtx3860
-rw-r--r--macros/latex/contrib/geometry/geometry.pdfbin0 -> 442423 bytes
5 files changed, 4355 insertions, 0 deletions
diff --git a/macros/latex/contrib/geometry/README.md b/macros/latex/contrib/geometry/README.md
new file mode 100644
index 0000000000..ebdb25bf4d
--- /dev/null
+++ b/macros/latex/contrib/geometry/README.md
@@ -0,0 +1,69 @@
+LaTeX Package: Geometry 2010/09/12 v5.6
+----------------------------------------
+Flexible and complete interface to document dimensions.
+
+Copyright (C) 1996-2010
+by Hideo Umeki <latexgeometry@gmail.com>
+Copyright (C) 2018
+Hideo Umeki and David Carlisle https://github.com/davidcarlisle/geometry
+
+Abstract:
+ This package provides a flexible and easy interface to page dimensions.
+ You can set the page layout with intuitive parameters. For instance,
+ if you want to set a margin to 2cm from each edge of the paper,
+ you can go \usepackage[margin=2cm]{geometry}. With \newgeometry command
+ you can change the layout anywhere in the document.
+
+CTAN: macros/latex/contrib/geometry
+
+Recent changes:
+
+[Release 5.8]
+Add xdvipdfmx and dvipdfmx alias for dvipdfm option.
+
+[Release 5.7]
+Add support for luatex (with new comand names introduced in luatex 0.85)
+
+(changes.txt for more history)
+
+Files:
+ * README.md - this file
+ * changes.txt - history of changes
+ * geometry.dtx - including sources and documentation
+ * geometry.pdf - print-ready documentation
+
+Installation:
+[manual installation]
+ * To get geometry.sty out of geometry.dtx
+ $ tex geometry.dtx
+ or $ (la)tex geometry.ins (after first extraction)
+ * To build documentation
+ $ latex geometry.dtx
+ or $ latex geometry.drv (after first extraction)
+ * Put the derived files in the proper directories:
+ - tex/latex/geometry/geometry.sty
+ - doc/latex/geometry/geometry.pdf
+ - source/latex/geometry/geometry.dtx
+
+[TeXLive]
+ * Use 'tlmgr' command
+ $ tlmgr show geometry -- to check the package info
+ $ sudo tlmgr update geometry -- to update the package
+ * You can use 'TeX Live Utility' instead of 'tlmgr', if on MacOSX.
+
+[MikTeX]
+ * Use the MikTeX Update Wizard to update geometry package.
+
+License:
+ This work 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 2005/12/01 or later.
+
+--
+Happy TeXing!
+Hideo Umeki
+
+EOF \ No newline at end of file
diff --git a/macros/latex/contrib/geometry/changes.txt b/macros/latex/contrib/geometry/changes.txt
new file mode 100644
index 0000000000..c463344438
--- /dev/null
+++ b/macros/latex/contrib/geometry/changes.txt
@@ -0,0 +1,353 @@
+2018-04-16 Release 5.8
+ * Documentation fixes.
+ * (x)dvipdfmx alias for dvipdfm otion.
+
+2018-03-24 Release 5.7
+ * add support for luatex 0.85+
+
+2010-09-12 Release 5.6
+ * Package 'ifxetex' is loaded for robuster detection of XeTeX.
+ * Fixed a bug where 'pass' option was not reset in \newgeometry.
+
+2010-07-13 Release 5.5
+ * Fixed a bug where paper width and height were swapped unnecessarily
+ inside \newgeometry{} if 'landscape' is given as a class option.
+ * Changed crop marks with elbow-shaped lines 17mm long and offset by 3mm.
+ * Added 'showframe' and 'showcrop' as options shown in verbose mode.
+ * Fixed typos and wrong figures, and revised expressions in the document.
+ * Added missed things that had been fixed for v5.4 into changes.txt.
+
+2010-07-08 Release 5.4
+ * New paper size presets for ISO C-series: 'c0paper' to 'c6paper'.
+ * Fixed a bug where overloading shipout in 'showframe' and/or 'showcrop'
+ mode caused warnings when 'pdfpages' package is used.
+ * Changed the shipout overloading process to use 'atbegshi' package.
+ Options 'showframe' and 'showcrop' require the package.
+ * Fixed a bug where restoring layoutwidth and layoutheight failed
+ when \restoregeometry is called.
+ * Fixed a bug that forced papersize to set the same length
+ as the specified layoutsize.
+ * Fixed a bug where page frame shown in 'showframe' mode was placed
+ slightly wrong.
+ * Fixed wrong 'h-part' calculation in verbose when bindingoffset
+ or mag is specified.
+ * Changed format and fixed values shown in verbose mode.
+
+2010-03-13 Release 5.3
+ * Fixed missed initialization of \Gm@lines.
+
+2010-03-01 Release 5.2
+ * Fixed a bug that the papersize setting explicitly specified
+ with \geometry or \usepackage in the preample didn't come to
+ \newgeometry.
+ * Added \mag offset adjustment for \newgeometry.
+ * Added 'onecolumn' option as a shorthand for 'twocolumn=false'.
+ * Changed the format of the verbose mode.
+
+2010-02-15 Release 5.1
+ * Fixed a bug that caused an error in 'pass' option.
+
+2010-02-12 Release 5.0
+ * Changing page layout mid-document.
+ The new commands \newgeometry{...} and \restoregeometry allow
+ users to change page dimensions in the middle of the document.
+ * A new set of options to specify the layout area.
+ The options specified for the area, in which the page dimensions
+ are calculated, are added: 'layout', 'layoutsize',
+ 'layoutwidth', 'layoutheight' and so forth.
+ These options would help to print the specified
+ layout to a different sized paper. For example, with 'a4paper'
+ and 'layout=a5paper', the geometry package uses 'A5' layout to
+ calculate margins with the paper size still 'A4'.
+ * A new driver option 'xetex'.
+ The new driver option 'xetex' is added. The driver auto-detection
+ routine has been revised so as to avoid an error with undefined
+ control sequences. Note that 'geometry.cfg' in TeXLive, which
+ disables the auto-detection routine and sets 'pdftex', is no
+ longer necessary and has no problem even though it still exists.
+ To set 'xetex' is strongly recommended with XeLaTeX.
+ * New paper size presets for JIS B-series.
+ The papersize presets 'b0j' to 'b6j' for JIS (Japanese Industrial
+ Standards) B-series are added.
+ * Changing default for underspecified margin.
+ In the previous version, if only one margin was specified,
+ 'bottom=1cm' for example, then geometry set the other margin with
+ the margin ratio (1:1 by default for the vertical dimensions)
+ and got 'top'=1cm in this case.
+ The version 5 sets the text-body size with the default 'scale'
+ (=0.7) and determine the unspecified margin.
+ * The option 'showframe' works on every page.
+ With 'showframe' option, the page frames are shown on every page.
+ In addition, the new option 'showcrop' would print cropmarks showing
+ the corners of the layout (the same as paper by default) on every page.
+ * Loading geometry.cfg precedes processing class options.
+ The previous version loaded 'geometry.cfg' after processing
+ the document class options. Now that the config file is
+ loaded before processing the class options, you can change the
+ behavior specified in 'geometry.cfg' by adding options into
+ \documentclass as well as \usepackage and \geometry.
+ * Deleted options: 'compat2' and 'twosideshift'.
+ The version 5 has no longer compatibility with the previous ones.
+ 'compat2' and 'twosideshift' are gone for simplicity.
+
+2008-12-21 Release 4.2
+ * Fixed check for the definition of \AtBeginShipoutFirst.
+ * Fixed \topskip adjustment so that it works when "lines" option is used.
+ * Added "driver=none" option, which does nothing for driver.
+ * Revised the note on 'ifvtex' package.
+
+2008-11-13 Release 4.1
+ * Fixed missing \ProvidesPackage.
+
+2008-11-06 Release 4.0
+ * More robust driver detection.
+ The driver detection method has been totally rewritten so that
+ it can automatically detect the driver appropriate for the
+ typesetting program in use. Therefore explicit driver setting is no
+ longer needed in most cases, except for the driver 'dvipdfm'.
+ This improvement makes geometry work more robustly for
+ the typesetting programs under e-TeX, XeTeX and VTeX
+ as well as normal TeX environment. The packages 'ifpdf' and
+ 'ifvtex' are used, which are available in CTAN.
+ Note that 'ifvtex' package v1.3 (2007/09/09), however, has a
+ bug (a typo) that affects the detection of VTeX.
+ So you need to use 'ifvtex' v1.4 or later.
+ * New option: resetpaper.
+ This option disables explicit paper setting in 'geometry'
+ and uses the paper size specified before 'geometry'.
+ This option may be useful to print nonstandard sized documents
+ with normal printers and papers.
+ * Added adjustment to \topskip.
+ When large font sizes are specified, \topskip has to be adjusted
+ so that the formula:
+ \textheight = (lines - 1) x \baselineskip} + \topskip
+ to be correct. To do this, \topskip is set to \ht\strutbox,
+ if \topskip is smaller than \ht\strutbox.
+ * Added ANSI paper sizes.
+ New paper size definitions for ANSI A to E are added.
+ * Fixed wrong ISO paper sizes.
+ The paper sizes for A1,A2,A5 and A6 were wrong (by 1mm).
+ * Fixed PDFTeX magnification problem.
+ PDF paper offset is adjusted properly when magnification is
+ set by mag option with pdfTeX.
+ * Changed package source organization.
+ Files geometry.ins and geometry-samples.tex are integrated into
+ geometry.dtx so that they can be generated from geometry.dtx by
+ the 'tex' command. Documentation can be also generated directly
+ from geometry.dtx by '(pdf)latex' command.
+ * Other improvements to the code and documentation.
+
+2002-07-08 Release 3.2
+ * Added known problem: for crop package with its 'center' option and
+ 'mag' larger than 1000, the result is not the one expected.
+ * Fixed double-valued marginratio setting like {1:1,1:5}.
+ {h|v}marginratio should have been set by \edef
+ instead of \def (line:439-440 in geometry.sty).
+ The bug was introduced in v3.1. (found by Rolf Niepraschk)
+ * Added two test files: gtest15.tex gtest16.tex
+
+2002-07-04 Release 3.1
+ * Fixed an error in setting geometry dimensions with \widthof of
+ calc package. \Gm@defbylen and \Gm@defbycnt are introduced to set
+ geometry dimensions.
+
+2002-06-30 Release 3.0
+ (Special thanks to Frank Mittelbach for checking codes patiently
+ and providing extremely helpful insight and suggestions)
+ * Revised geometry.dtx document.
+
+2002-06-28
+ * Bug fix: multiple landscape/portrait switches malfunctioned.
+ * Bug fix: default hmarginratio wasn't reset when twoside is reset.
+ The initialization of default margionratios added in \Gm@clean.
+
+2002-06-12
+ * Improved 'reset': can reset 'paper' given as a geometry option.
+ * Bug fix: class default papersize with class option 'landscape'
+ didn't work with \geometry command.
+
+2002-06-05
+ * Added a landscape correction for dvips with 'special' command.
+ * Added 'dvipdfm' (same as 'dvips' internally).
+ * Changed driver settings ('dvips', 'pdftex', and all that) to exclusive.
+ * Bug fix: 'footnotesep' (\skip\footins) couldn't be reset.
+ * Bug fix: 'bindingoffset' didn't work with calc package
+ * Bug fix: 'showframe' vbox had improper height settings.
+ * Bug fix: complex margin settings with calc, e.g. (1in-50pt)*2/3,
+ didn't work well.
+
+2002-05-27
+ * Added many '\@onlypreamble' commands.
+ * The default vscale is changed to 0.7.
+ * Added 'compat2' to achieve option compatibility with the old version.
+
+2002-05-24
+ * 'pdfoutput=1' is removed because it is unnecessary and rather harmful
+ with package 'hyperref'.
+ * The default hscale is changed to 0.7.
+ * The default hmaginratio '\Geom@Dhratiotwo' (=2:3) is used
+ if \@twosidetrue.
+ * 'asymmetric' sets \@mparswitchfalse and \@twosidetrue, so that
+ one can use 'asymmetric' as an alternative to the 'twoside' option.
+
+2002-05-21
+ * Added 'nomarginpar' with \marginparwidth and \marginparsep set to 0pt.
+ * Added '\geom@checkmp' checking if marginal notes fall off the page.
+ * '\geom@process' revised with new internal macros.
+ * Bug fixed: odd/evensidemargin calculations totally modified.
+
+2002-05-20
+ * Changed the default settings (old defaults --> new defaults)
+ - scale={0.8,0.9} --> scale=0.8
+ - includeheadfoot, ignoremp --> ignoreall
+ - marginratio={2:3,1:2} for oneside, marginratio=2:3 for twoside
+ --> marginratio={1:1,2:3} for oneside, marginratio=2:3 for twoside
+
+2002-05-19
+ * 'asymmetric' just sets \@mparswitchfalse. 'asymmetric=false' does
+ nothing.
+ * '\geom@process' revised.
+
+2002-05-14
+ * 'nohead', 'nofoot' and 'noheadfoot' are just shortcut for
+ setting the corresponding LaTeX dimensions to zero, so they
+ are overwritable by subsequent options.
+ * Added 'asymmetric' option with the same layout on every pages.
+ 'twoside' automatically set 'asymmetric=false', but users can
+ set manually 'asymmetric(=true)'.
+ * Changed showparam style.
+ * Added 'hcentering' and 'vcentering', which set 'hmarginratio=1:1'
+ and 'vmarginratio=1:1' respectively.
+ * Bug fixed: incorrect margins when 'twocolumn' and 'includemp'
+ * Bug fixed: '(h|v)centering' option was set even when the value is
+ false.
+ * Bug fixed: \mag and options with true dimension values caused
+ overspecification warning about \mag. Now \mag cannot be specified
+ more than once as geometry option.
+ * Known Problem: 'reset' still leaves the last papername given as
+ a geometry option, not the class original papername.
+ Set the proper paper name again after 'reset'.
+
+2002-05-13
+ * Added 'twocolumn' option
+ * "verbose" displays the parameter results on the terminal,
+ "verbose=false" (default) still puts them into the log.
+ * 'heightrounded' calculation no longer needs ifthen package.
+ * Bug fixed: 'heightrounded' always adjusted downwards.
+ * Bug fixed: it didn't work with calc package.
+ \Geom@setafter command needs \expandafter's
+ * Bug fixed: 'pass' and multiple 'reset' didn't work well.
+
+2002-05-10
+ * Added 'showframe' option, which shows textarea and page frames,
+ and lines for head and foot to check layout in detail.
+ Geometry.sty now contains features of showframe.sty. So showframe.sty
+ is deleted from the distribution.
+ * Bug fixed: {h,v}offset was set wrong values when 'mag', 'truedimen'
+ and \geometry{..} macro were used.
+ * Bug fixed: execution timing of changing papersize was wrong.
+ This bug was introduced in v3.0 beta.
+
+2002-05-09
+ * Added 'heightrounded' option. If \textheight is not specified,
+ this option rounds it to n-times (n: an integer) of \baselineskip plus
+ \topskip, \textheight = n * \baselineskip + \topskip,
+ to avoid "underfull vbox" in some cases. Default is false.
+ ifthen package included in LaTeX base bundle is required.
+ * Added 'lines' option, which enables users to specify \textheight
+ by the number of lines included in \textheight auto-calculating
+ \textheight = (lines - 1) * \baselineskip + \topskip.
+ This option is prior to all the other options determining 'textheight'
+ directly (ie. 'textheight', 'height', 'vscale').
+ * Bug fixed: \Geom@dset wasn't set by \edef.
+
+2002-04-26
+ * \geom@setafter and \Geom@dset (both internal) makes LaTeX dimension
+ setting as a option (headsep, footskip, hoffset, and etc)
+ effective at the beginning of \geom@process for 'pass' option.
+ * Revised internal codes specifying papersize.
+ * Changed the way of displaying options and parameters in 'verbose' mode.
+
+2002-04-25 Release 3.0 beta
+ * Added 'screen' option as a new papersize (papersize={225mm,180mm}).
+ To make presentation with PC and video projector, geometry option
+ "screen,centering" with 'slide' documentclass must be the best choise.
+ * Added 'pass' option, which disables geometry's auto-layout.
+ * Added 'ratio' option equivalent to 'marginratio'.
+ * Added 'centering', a shortcut for 'marginratio=1:1'.
+ * Added 'innermargin' and 'outermargin', aliases for leftmargin
+ and rightmargin respectively.
+
+2002-04-22
+ * Version 3.0 Candidate alpha, alpha-2 (formly known as 2.4 alpha-1,2)
+ * Added 'ignorehead', 'ignorefoot', 'ignoreheadfoot', and
+ 'ignoreheadfootmp'(ignoreall) options to disregard
+ head/foot/marginpars spaces.
+ * Added '{h|v}marginratio' options.
+ These options specify visible marginal spaces in each direction,
+ left(inner):right(outer) for the horizontal ratio, top:bottom
+ for the vertical. They should be set in 'a:b' style and each
+ value should be a positive integer less than 100 to avoid
+ arithmetic overflow. In default, hmarginratio=2:3 (1:2 for
+ twoside) and vmarginratio=1:2.
+ * The 'automatic' centering is no longer default layout,
+ so marginratio={2:3,1:2} is used as default.
+ * Removed twosideshift option, use bindingoffset instead.
+ bindingoffset is set 0pt as default and supports twoside.
+
+2000-06-28 Release 2.3
+ * Added 'truedimen', 'columnsep' and 'footnotesep' options.
+ * VTeX supported.
+ * Modified internal settings for twosideshift and mag.
+
+1999-10-07 Release 2.2
+ * Bug fixed: explicit twoside was needed for book.cls.
+
+1999-09-27 Release 2.1
+ * Bug fixed: twosideshift with reversemarginpar made wrong margins.
+ * Added mag option.
+ * Paper sizes A6 and B6 supported.
+ * Changed license declaration to LPPL.
+
+1998-04-06 Release 2.0
+ * Flexible setting scheme for package option with keyval.
+ * Removed exclamations and extra control sequences for paperwidth
+ and paperheight.
+ * Totally revised the code and document.
+
+1997-09-08 Release 1.08
+ * Included geometry.cfg into geometry.dtx.
+ * Changed the catcode of exclamation mark.
+
+1997-07-05 Release 1.07
+ * Modified process of 'dvips' option.
+ * pdftex supported.
+ * Added 'a0paper' and 'b0paper'.
+
+1997-04-16 Release 1.06
+ * reversemarginpar supported.
+
+1997-02-17 Release 1.05
+ * Changed the definition for dvips option.
+
+1996-08-05 Release 1.04
+ * Bug fixed: papersize= had no effect when papertype was given
+ in geometry.cfg or as a package option.
+
+1996-07-17 Release 1.03
+ * calc support
+
+1996-06-07 Release 1.02
+ * Changed definition for 'reset' option.
+ * Revised instructions for 'reset' and 'dvips' options.
+
+1996-06-03 Release 1.01
+ * Fixed bugs in setting paper and option processing.
+ * geometry.cfg
+ * Added 'dvips' option.
+
+1996-05-31 Release 1.00
+ * Started geometry package distribution.
+ * Use keyval interface.
+
+EOF
diff --git a/macros/latex/contrib/geometry/geometry-samples.tex b/macros/latex/contrib/geometry/geometry-samples.tex
new file mode 100644
index 0000000000..7425041e29
--- /dev/null
+++ b/macros/latex/contrib/geometry/geometry-samples.tex
@@ -0,0 +1,73 @@
+%%
+%% This is file `geometry-samples.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% geometry.dtx (with options: `samples')
+%%
+%% Copyright (C) 1996-2010
+%% by Hideo Umeki <latexgeometry@gmail.com>
+%% Copyright (C) 2018
+%% by Hideo Umeki and David Carlisle https://github.com/davidcarlisle/geometry
+%%
+%% This work 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 2005/12/01 or later.
+%%
+%% This work is "maintained" (as per the LPPL maintenance status)
+%% by David Carlisle.
+%%
+%% This work consists of the files geometry.dtx and
+%% the derived files: geometry.{sty,ins,drv}, geometry-samples.tex.
+%%
+\documentclass[12pt]{article}% uses letterpaper by default
+% \documentclass[12pt,a4paper]{article}% for A4 paper
+%---------------------------------------------------------------
+% Edit and uncomment one of the settings below
+%---------------------------------------------------------------
+% \usepackage{geometry}
+% \usepackage[centering]{geometry}
+% \usepackage[width=10cm,vscale=.7]{geometry}
+% \usepackage[margin=1cm, papersize={12cm,19cm}, resetpaper]{geometry}
+% \usepackage[margin=1cm,includeheadfoot]{geometry}
+\usepackage[margin=1cm,includeheadfoot,includemp]{geometry}
+% \usepackage[margin=1cm,bindingoffset=1cm,twoside]{geometry}
+% \usepackage[hmarginratio=2:1, vmargin=2cm]{geometry}
+% \usepackage[hscale=0.5,twoside]{geometry}
+% \usepackage[hscale=0.5,asymmetric]{geometry}
+% \usepackage[hscale=0.5,heightrounded]{geometry}
+% \usepackage[left=1cm,right=4cm,top=2cm,includefoot]{geometry}
+% \usepackage[lines=20,left=2cm,right=6cm,top=2cm,twoside]{geometry}
+% \usepackage[width=15cm, marginparwidth=3cm, includemp]{geometry}
+% \usepackage[hdivide={1cm,,2cm}, vdivide={3cm,8in,}, nohead]{geometry}
+% \usepackage[headsep=20pt, head=40pt,foot=20pt,includeheadfoot]{geometry}
+% \usepackage[text={6in,8in}, top=2cm, left=2cm]{geometry}
+% \usepackage[centering,includemp,twoside,landscape]{geometry}
+% \usepackage[mag=1414,margin=2cm]{geometry}
+% \usepackage[mag=1414,margin=2truecm,truedimen]{geometry}
+% \usepackage[a5paper, landscape, twocolumn, twoside,
+% left=2cm, hmarginratio=2:1, includemp, marginparwidth=43pt,
+% bottom=1cm, foot=.7cm, includefoot, textheight=11cm, heightrounded,
+% columnsep=1cm,verbose]{geometry}
+%---------------------------------------------------------------
+% No need to change below
+%---------------------------------------------------------------
+\geometry{verbose,showframe}% the options appended.
+\usepackage{lipsum}% for dummy text of 150 paragraphs
+\newcommand\mynote{\marginpar[\raggedright
+A sample margin note in the left side.]%
+{\raggedright A sample margin note.}}%
+\newcommand\myfootnote{\footnote{This is a sample footnote text.}}
+\begin{document}
+\lipsum[1-2]\mynote\lipsum[3-4]\mynote
+\lipsum[5-11]\mynote\lipsum[12]\myfootnote
+\lipsum[13-22]\mynote\lipsum[23-32]
+\end{document}
+\endinput
+%%
+%% End of file `geometry-samples.tex'.
diff --git a/macros/latex/contrib/geometry/geometry.dtx b/macros/latex/contrib/geometry/geometry.dtx
new file mode 100644
index 0000000000..964b901888
--- /dev/null
+++ b/macros/latex/contrib/geometry/geometry.dtx
@@ -0,0 +1,3860 @@
+% \iffalse meta-comment
+%
+% Copyright 1996-2010 by Hideo Umeki <latexgeometry@gmail.com>
+% Copyright 2018 Hideo Umeki and David Carlisle
+%
+% LaTeX Package: Geometry
+% -----------------------
+%
+% This work 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 2005/12/01 or later.
+%
+% This work is "maintained" (as per the LPPL maintenance status)
+% by David Carlisle
+%
+% This work consists of the files geometry.dtx and
+% the derived files: geometry.{sty,ins,drv}, geometry-samples.tex.
+%
+% * Distribution
+% CTAN: macros/latex/contrib/geometry/README.md
+% CTAN: macros/latex/contrib/geometry/changes.txt
+% CTAN: macros/latex/contrib/geometry/geometry.ins
+% CTAN: macros/latex/contrib/geometry/geometry.dtx
+% CTAN: macros/latex/contrib/geometry/geometry.pdf
+%
+% * See README for installation.
+%
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}
+\expandafter\endgroup
+\ifcase 0\ifx\install y1\fi\expandafter
+ \ifx\csname processbatchFile\endcsname\relax\else1\fi
+ \ifx\fmtname\x\else 1\fi\relax
+\else\csname fi\endcsname
+%</ignore>
+%<package|driver>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{geometry}
+%<package> [2018/04/16 v5.8 Page Geometry]
+%<*install>
+\input docstrip.tex
+\Msg{************************************************************************}
+\Msg{* Installation}
+\Msg{* Package: geometry 2018/04/16 v5.8 Page Geometry}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+\preamble
+
+Copyright (C) 1996-2010
+by Hideo Umeki <latexgeometry@gmail.com>
+Copyright (C) 2018
+by Hideo Umeki and David Carlisle https://github.com/davidcarlisle/geometry
+
+This work 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 2005/12/01 or later.
+
+This work is "maintained" (as per the LPPL maintenance status)
+by David Carlisle.
+
+This work consists of the files geometry.dtx and
+the derived files: geometry.{sty,ins,drv}, geometry-samples.tex.
+
+\endpreamble
+
+\generate{%
+ \file{geometry.ins}{\from{geometry.dtx}{install}}%
+ \file{geometry.drv}{\from{geometry.dtx}{driver}}%
+ \usedir{tex/latex/geometry}%
+ \file{geometry.sty}{\from{geometry.dtx}{package}}%
+ \file{geometry.cfg}{\from{geometry.dtx}{config}}%
+ \file{geometry-samples.tex}{\from{geometry.dtx}{samples}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by LaTeX:}
+\Msg{*}
+\Msg{* \space\space geometry.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `geometry.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\ProvidesFile{geometry.drv}
+\documentclass{ltxdoc}
+\usepackage[colorlinks, linkcolor=blue]{hyperref}
+\usepackage{graphicx}
+\usepackage[a4paper, hmargin=2.5cm, vmargin=1cm,
+ includeheadfoot]{geometry}
+\DeclareRobustCommand\XeTeX{%
+ X\lower.5ex\hbox{\kern-.07em\reflectbox{E}}%
+ \kern-.15em\TeX}
+\DeclareRobustCommand\XeLaTeX{%
+ X\lower.5ex\hbox{\kern-.07em\reflectbox{E}}%
+ \kern-.15em\LaTeX}
+\begin{document}
+ \DocInput{geometry.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \GetFileInfo{geometry.sty}
+%
+% \title{The \textsf{geometry} package}
+% \date{\filedate\ \fileversion}
+% \author{Hideo Umeki\\\texttt{latexgeometry@gmail.com}}
+%
+% \MakeShortVerb{|}
+%
+% \def\OpenB{{\ttfamily\char`\{}}
+% \def\Comma{{\ttfamily\char`,}}
+% \def\CloseB{{\ttfamily\char`\}}}
+% \def\Gm{\textsf{geometry}}
+% \newcommand\argii[2]{\OpenB\meta{#1}\Comma\meta{#2}\CloseB}
+% \newcommand\argiii[3]{\OpenB\meta{#1}\Comma\meta{#2}\Comma\meta{#3}\CloseB}
+% \newcommand\vargii[2]{\OpenB#1\Comma#2\CloseB}
+% \newcommand\vargiii[3]{\OpenB#1\Comma#2\Comma#3\CloseB}
+% \newcommand\OR{\ \strut\vrule width .4pt\ }
+% \newcommand\gpart[1]{\textsf{\textsl{\color[rgb]{.0,.45,.7}#1}}}%
+% \newcommand\glen[1]{\textsf{#1}}
+% \newenvironment{key}[2]{\expandafter\macro\expandafter{`#2'}}{\endmacro}
+% \newenvironment{Options}%
+% {\begin{list}{}{%
+% \renewcommand{\makelabel}[1]{\texttt{##1}\hfil}%
+% \setlength{\itemsep}{-.5\parsep}
+% \settowidth{\labelwidth}{\texttt{xxxxxxxxxxx\space}}%
+% \setlength{\leftmargin}{\labelwidth}%
+% \addtolength{\leftmargin}{\labelsep}}%
+% \raggedright}
+% {\end{list}}
+% \newenvironment{Spec}%
+% {\begin{list}{}{%
+% \renewcommand{\makelabel}[1]{\fbox{##1}\hfil}%
+% \setlength{\itemsep}{-.5\parsep}
+% \settowidth{\labelwidth}{\texttt{S(x,x)}}%
+% \setlength{\leftmargin}{\labelwidth}%
+% \addtolength{\leftmargin}{\labelsep}%
+% \addtolength{\leftmargin}{2em}%
+% \setlength{\rightmargin}{2em}}%
+% \raggedright}
+% {\end{list}}
+% \def\Ss(#1,#2){\textsf{S(#1,#2)}}%
+% \def\Sp(#1,#2,#3){\mbox{|(#1,#2,#3)|}}%
+% \def\onlypre{\llap{$^{\dagger\:}$}}%
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package provides a flexible and easy interface to page dimensions.
+% You can change the page layout with intuitive parameters. For instance,
+% if you want to set a margin to 2cm from each edge of the paper,
+% you can type just |\usepackage[margin=2cm]{geometry}|.
+% The page layout can be changed in the middle of the document
+% with |\newgeometry| command.
+% \end{abstract}
+%
+% \section{Preface to version 5}
+%
+% \begin{itemize}
+% \item \textbf{Changing page layout mid-document.}\par
+% The new commands \cs{newgeometry\{$\cdots$\}} and
+% \cs{restoregeometry} allow users to change page dimensions in the
+% middle of the document. \cs{newgeometry} is almost similar to
+% \cs{geometry} except that \cs{newgeometry} disables all the options
+% specified in the preamble and skips the papersize-related options:
+% |landscape|, |portrait| and paper size options (such as
+% |papersize|, |paper=a4paper| and so forth).
+% \item \textbf{A new set of options to specify the layout area.}\par
+% The options specified for the area, in which the page dimensions
+% are calculated, are added: \textsf{layout}, \textsf{layoutsize},
+% \textsf{layoutwidth}, \textsf{layoutheight} and so forth.
+% These options would help to print the specified
+% layout to a different sized paper. For example, with |a4paper|
+% and |layout=a5paper|, the \Gm\ package uses `A5' layout to
+% calculate margins with the paper size still `A4'.
+% \item \textbf{A new driver option |xetex|.}\par
+% The new driver option |xetex| is added. The driver auto-detection
+% routine has been revised so as to avoid an error with undefined
+% control sequences. Note that `geometry.cfg' in \TeX{} Live, which
+% disables the auto-detection routine and sets |pdftex|, is no
+% longer necessary and has no problem even though it still exists.
+% To set |xetex| is strongly recommended with \XeLaTeX{}.
+% \item \textbf{New paper size presets for JIS B-series and ISO C-series.}\par
+% The papersize presets |b0j| to |b6j| for JIS (Japanese Industrial
+% Standards) B-series and |c0paper| to |c6paper| for ISO C-series
+% (v5.4$\sim$) are added.
+% \item \textbf{Changing default for underspecified margin.}\par
+% In the previous version, if only one margin was specified,
+% |bottom=1cm| for example, then \Gm\ set the other margin with
+% the margin ratio (1:1 by default for the vertical dimensions)
+% and got |top=1cm| in this case.
+% The version 5 sets the text-body size with the default |scale|
+% ($=0.7$) and determine the unspecified margin. (See Section~\ref{sec:rules})
+% \item \textbf{The option |showframe| and |showcrop| works on every page.}\par
+% With |showframe| option, the page frames are shown on every page.
+% In addition, a new option |showcrop| prints crop marks at each
+% corner of layout area on every page. Note that the marks would be
+% invisible without specifying the layout size smaller than paper size.
+% Version 5.4 introduced a new |\shipout| overloading process using
+% \textsf{atbegshi} package, so the \textsf{atbegshi} package
+% is required when showframe or showcrop option is specified.
+% \item \textbf{Loading geometry.cfg precedes processing class options.}\par
+% The previous version loaded \textsf{geometry.cfg} after
+% processing the document class options. Now that the config file is
+% loaded before processing the class options, you can change the
+% behavior specified in \textsf{geometry.cfg} by adding options
+% into |\documentclass| as well as |\usepackage| and |\geometry|.
+% \item \textbf{Deleted options: |compat2| and |twosideshift|.}
+% The version 5 has no longer compatibility with the previous ones.
+% |compat2| and |twosideshift| are gone for simplicity.
+% \end{itemize}
+%
+% \section{Introduction}
+%
+% To set dimensions for page layout in \LaTeX\ is not straightforward.
+% You need to adjust several \LaTeX{} native dimensions to place a text area
+% where you want.
+% If you want to center the text area in the paper you use, for example,
+% you have to specify native dimensions as follows:
+% \begin{quote}
+% |\usepackage{calc}|\\
+% |\setlength\textwidth{7in}|\\
+% |\setlength\textheight{10in}|\\
+% |\setlength\oddsidemargin{(\paperwidth-\textwidth)/2 - 1in}|\\
+% |\setlength\topmargin{(\paperheight-\textheight|\\
+% | -\headheight-\headsep-\footskip)/2 - 1in}|.
+% \end{quote}
+% Without package \textsl{calc}, the above example would need
+% more tedious settings. Package \Gm\ provides an easy
+% way to set page layout parameters. In this case, what you have to do
+% is just
+% \begin{quote}
+% |\usepackage[text={7in,10in},centering]{geometry}|.
+% \end{quote}
+% Besides centering problem, setting margins from each edge of the paper is
+% also troublesome. But \Gm\ also make it easy.
+% If you want to set each margin to 1.5in, you can type
+% \begin{quote}
+% |\usepackage[margin=1.5in]{geometry}|
+% \end{quote}
+% Thus, the geometry package has an auto-completion mechanism, in which
+% unspecified dimensions are automatically determined.
+% The \Gm\ package will be also useful when you have to set page layout
+% obeying the following strict instructions: for example,
+% \begin{quote}\slshape
+% The total allowable width of the text area is $6.5$ inches wide by $8.75$
+% inches high. The top margin on each page should be $1.2$ inches from
+% the top edge of the page. The left margin should be $0.9$ inch from
+% the left edge. The footer with page number should be at the bottom
+% of the text area.
+% \end{quote}
+% In this case, using \Gm\ you can type
+% \begin{quote}
+% |\usepackage[total={6.5in,8.75in},|\\
+% | top=1.2in, left=0.9in, includefoot]{geometry}|.
+% \end{quote}
+%
+% Setting a text area on the paper in document preparation system has some
+% analogy to placing a window on the background in the window system.
+% The name `geometry' comes from the |-geometry| option used for specifying
+% a size and location of a window in X Window System.
+%
+% \section{Page geometry}
+%
+% Figure~\ref{fig:layout} shows the page layout dimensions defined
+% in the \Gm\ package.
+% The page layout contains a \gpart{total body} (printable area) and \gpart{margins}.
+% The \gpart{total body} consists of a \gpart{body} (text area) with an
+% optional \gpart{header}, \gpart{footer} and marginal notes (marginpar).
+% There are four margins: \gpart{left}, \gpart{right}, \gpart{top} and
+% \gpart{bottom}. For twosided documents, horizontal
+% margins should be called \gpart{inner} and \gpart{outer}.
+% \begin{quote}
+% \begin{tabular}{rcl}
+% \gpart{paper}&:&\gpart{total body} and
+% \gpart{margins}\\
+% \gpart{total body}&:&\gpart{body} (text area)\quad
+% (optional \gpart{head}, \gpart{foot} and \gpart{marginpar})\\
+% \gpart{margins}&:&\gpart{left} (\gpart{inner}),
+% \gpart{right} (\gpart{outer}), \gpart{top} and \gpart{bottom}
+% \end{tabular}
+% \end{quote}
+% Each margin is measured from the corresponding edge of a paper.
+% For example, left margin (inner margin) means a horizontal distance
+% between the left (inner) edge of the paper and that of the total body.
+% Therefore the left and top margins defined in \Gm\ are different
+% from the native dimensions \cs{leftmargin} and \cs{topmargin}.
+% The size of a body (text area) can be modified by \cs{textwidth} and
+% \cs{textheight}.
+% The dimensions for paper, total body and margins have the following
+% relations.
+% \begin{eqnarray}
+% \label{eq:paperwidth}
+% |paperwidth| &=& |left|+|width|+|right| \\
+% |paperheight| &=& |top|+|height|+|bottom|
+% \label{eq:paperheight}
+% \end{eqnarray}
+%
+% \begin{figure}
+% \centering\small
+% {\unitlength=.65pt
+% \begin{picture}(450,250)(0,-10)
+% \put(20,0){\framebox(170,230){}}
+% \put(20,235){\makebox(170,230)[br]{\gpart{paper}}}
+% \begingroup\thicklines
+% \put(40,30){\framebox(120,170){}}\endgroup
+% \put(40,30){\makebox(120,165)[tr]{\gpart{total body}~}}
+% \put(45,30){\makebox(0,170)[l]{|height|}}
+% \put(40,35){\makebox(120,0)[bc]{|width|}}
+% \put(50,-20){\makebox(120,0)[bc]{|paperwidth|}}
+% \put(10,45){\makebox(0,170)[r]{|paperheight|}}
+% \put(90,200){\makebox(0,30)[lc]{|top|}}
+% \put(90,0){\makebox(0,30)[lc]{|bottom|}}
+% \put(10,70){\makebox(0,0)[r]{|left|}}
+% \put(10,55){\makebox(0,0)[r]{(|inner|)}}
+% \put(200,70){\makebox(0,0)[l]{|right|}}
+% \put(200,55){\makebox(0,0)[l]{(|outer|)}}
+% \put(80,230){\vector(0,-1){30}}\put(80,30){\vector(0,-1){30}}
+% \put(80,200){\vector(0,1){30}}\put(80,0){\vector(0,1){30}}
+% \put(20,70){\vector(1,0){20}}\put(40,70){\vector(-1,0){20}}
+% \put(160,70){\vector(1,0){30}}\put(190,70){\vector(-1,0){30}}
+% \multiput(160,30)(5,0){24}{\line(1,0){2}}
+% \multiput(160,200)(5,0){24}{\line(1,0){2}}
+% \begingroup\thicklines
+% \put(280,30){\framebox(120,170){}}\endgroup
+% \put(283,133){\makebox(0,12)[l]{|textheight|}}
+% \put(295,130){\vector(0,-1){100}}\put(295,150){\vector(0,1){50}}
+% \multiput(280,220)(5,0){24}{\line(1,0){3}}
+% \put(280,208){\makebox(120,20)[bc]{\gpart{head}}}
+% \multiput(280,207)(5,0){24}{\line(1,0){3}}
+% \put(420,225){\makebox(0,0)[l]{|headheight|}}
+% \put(418,225){\line(-2,-1){20}}
+% \put(420,213){\makebox(0,0)[l]{|headsep|}}
+% \put(418,213){\line(-2,-1){20}}
+% \put(420,12){\makebox(0,0)[l]{|footskip|}}
+% \put(418,12){\line(-2,1){20}}
+% \put(280,40){\makebox(120,140)[c]{\gpart{body}}}
+% \put(305,45){\vector(-1,0){25}}\put(375,45){\vector(1,0){25}}
+% \put(80,230){\vector(0,-1){30}}\put(80,30){\vector(0,-1){30}}
+% \put(280,48){\makebox(120,0)[c]{|textwidth|}}
+% \put(280,15){\makebox(120,10)[c]{\gpart{foot}}}
+% \multiput(280,14)(5,0){24}{\line(1,0){2}}
+% \put(410,30){\dashbox{3}(30,170){}}
+% \put(415,30){\makebox(30,170)[l]{\gpart{marginal note}}}
+% \put(425,45){\vector(-1,0){15}}\put(425,45){\vector(1,0){15}}
+% \put(450,70){\makebox(0,0)[l]{|marginparsep|}}
+% \put(448,70){\line(-3,-1){43}}
+% \put(450,45){\makebox(0,0)[l]{|marginparwidth|}}
+% \end{picture}}
+% \caption[Dimension names for \Gm]{%
+% \begin{minipage}[t]{.8\textwidth}\raggedright\small
+% Dimension names used in the \Gm\ package.
+% |width| $=$ |textwidth| and |height| $=$ |textheight| by default.
+% |left|, |right|, |top| and |bottom| are margins.
+% If margins on verso pages are swapped by |twoside| option,
+% margins specified by |left| and |right| options
+% are used for the inside and outside margins respectively.
+% |inner| and |outer| are aliases of |left| and |right|
+% respectively.
+% \end{minipage}}
+% \label{fig:layout}
+% \end{figure}
+%
+% The total body |width| and |height| would be defined:
+% \begin{eqnarray}
+% \label{eq:width}
+% |width| &:=& |textwidth| \quad( +\> |marginparsep| + |marginparwidth| )\\
+% |height| &:=& |textheight| \quad(+\> |headheight| + |headsep| + |footskip| )
+% \label{eq:height}
+% \end{eqnarray}
+% In Equation (\ref{eq:width}) |width:=textwidth| by default,
+% while |marginparsep| and |marginparwidth| are included in |width|
+% if |includemp| option is set |true|.
+% In Equation (\ref{eq:height}), |height:=textheight| by default.
+% If |includehead| is set to |true|, |headheight| and |headsep| are
+% considered as a part of |height|.
+% In the same way, |includefoot| takes |footskip| into |height|.
+% Figure~\ref{fig:includes} shows how these options
+% work in the vertical direction.
+% \begin{figure}
+% \centering\small
+% {\unitlength=.65pt
+% \begin{picture}(490,280)(0,-10)
+% \put(60,250){\makebox(120,0)[bl]{\textbf{(a)}~\textit{default}}}%
+% \put(20,0){\framebox(170,230){}}
+% \put(20,230){\makebox(170,15)[r]{\gpart{paper}}}
+% \begingroup\thicklines
+% \put(40,30){\framebox(120,165){}}\endgroup
+% \put(70,165){\vector(0,1){30}}
+% \put(55,145){\makebox(0,20)[lc]{|textheight|}}
+% \put(70,145){\vector(0,-1){115}}
+% \multiput(40,203)(5,0){24}{\line(1,0){3}}
+% \multiput(40,213)(5,0){24}{\line(1,0){3}}
+% \multiput(40,10)(5,0){24}{\line(1,0){3}}
+% \put(40,203){\makebox(120,20)[bc]{\gpart{head}}}
+% \put(40,40){\makebox(120,140)[c]{\gpart{body}}}
+% \put(40,11){\makebox(120,10)[c]{\gpart{foot}}}
+% \put(150,230){\vector(0,-1){35}}\put(150,30){\vector(0,-1){30}}
+% \put(150,195){\vector(0,1){35}}\put(150,0){\vector(0,1){30}}
+% \put(160,197){\makebox(0,30)[lc]{|top|}}
+% \put(160,0){\makebox(0,30)[lc]{|bottom|}}
+% \multiput(160,30)(5,0){24}{\line(1,0){2}}
+% \multiput(160,195)(5,0){24}{\line(1,0){2}}
+% \put(255,250){\makebox(120,0)[bl]
+% {\textbf{(b)}~|includehead| and |includefoot|}}%
+% \put(260,0){\framebox(170,230){}}
+% \put(260,230){\makebox(170,15)[r]{\gpart{paper}}}
+% \begingroup\thicklines
+% \put(280,30){\framebox(120,165){}}\endgroup
+% \put(310,152){\vector(0,1){25}}
+% \put(295,130){\makebox(0,20)[lc]{|textheight|}}
+% \put(310,130){\vector(0,-1){80}}
+% \multiput(280,184)(5,0){24}{\line(1,0){3}}
+% \multiput(280,177)(5,0){24}{\line(1,0){3}}
+% \multiput(280,50)(5,0){24}{\line(1,0){3}}
+% \put(280,184){\makebox(120,10)[c]{\gpart{head}}}
+% \put(280,40){\makebox(120,140)[c]{\gpart{body}}}
+% \put(400,140){\line(1,1){45}}
+% \put(437,187){\makebox(50,10)[l]{\gpart{total body}}}
+% \put(280,31){\makebox(120,10)[c]{\gpart{foot}}}
+% \put(370,230){\vector(0,-1){35}}\put(370,30){\vector(0,-1){30}}
+% \put(370,195){\vector(0,1){35}}\put(370,0){\vector(0,1){30}}
+% \put(380,197){\makebox(0,30)[lc]{|top|}}
+% \put(380,0){\makebox(0,30)[lc]{|bottom|}}
+% \end{picture}}
+% \caption[An effect of \texttt{includehead} and \texttt{includefoot}.]{%
+% \begin{minipage}[t]{.8\textwidth}\raggedright\small
+% |includehead| and |includefoot| include the head and foot respectively
+% into \gpart{total body}. \textbf{(a)} |height| $=$ |textheight| (default).
+% \textbf{(b)} |height| $=$ |textheight| $+$ |headheight| $+$ |headsep| $+$
+% |footskip| if |includehead| and |includefoot|. If the top and bottom
+% margins are specified, |includehead| and |includefoot| result in
+% shorter |textheight|.
+% \end{minipage}}
+% \label{fig:includes}
+% \end{figure}
+%
+% Thus, the page layout consists of three parts (lengths) in each
+% direction: one body and two margins. If the two of them are explicitly
+% specified, the other length is obvious and no need to be specified.
+% Figure~\ref{fig:Labc} shows a simple model of page dimensions.
+% When a length |L| is given and is partitioned into the body |b|, the
+% margins |a| and |c|, it's obvious that
+% \begin{equation}
+% |L|=|a|+|b|+|c| \label{eq:Labc}
+% \end{equation}
+% The specification with two of the three (|a|,|b| and |c|) fixed
+% explicitly is solvable. If two or more are left unspecified
+% or `underspecified', Equation~(\ref{eq:Labc}) cannot be solved
+% without any other relation between them. If all of them are
+% specified, then it needs to check whether or not they
+% satisfy Equation~(\ref{eq:Labc}), that is too much specification or
+% `overspecified'.
+% \begin{figure}
+% \centering
+% {\unitlength=0.8pt
+% \begin{picture}(300,60)(0,-5)
+% \begingroup\linethickness{5pt}
+% \put(0,5){\textcolor{green}{\line(1,0){60}}}
+% \put(60,5){\textcolor{black}{\line(1,0){160}}}
+% \put(220,5){\textcolor{green}{\line(1,0){80}}}
+% \endgroup
+% \put(0,15){\makebox(60,10)[b]{|a|}}
+% \put(60,0){\line(0,1){20}}
+% \put(60,15){\makebox(160,10)[b]{|b|}}
+% \put(220,0){\line(0,1){20}}
+% \put(220,15){\makebox(80,10)[b]{|c|}}
+% \put(0,0){\line(0,1){50}}
+% \put(150,35){\vector(-1,0){150}}
+% \put(0,40){\makebox(300,10){|L|}}
+% \put(150,35){\vector(1,0){150}}
+% \put(300,0){\line(0,1){50}}
+% \end{picture}}
+% \caption{A simple model of page dimensions.}
+% \label{fig:Labc}
+% \end{figure}
+%
+% The \Gm\ package has auto-completion mechanism that saves the
+% trouble of specifying the page layout dimensions. For example,
+% you can set
+% \begin{quote}
+% |\usepackage[width=14cm, left=3cm]{geometry}|
+% \end{quote}
+% on A4 paper. In this case you don't have to set the right margin
+% The details of auto-completion will be described in
+% Section~\ref{sec:rules}.
+%
+% \section{User interface}
+%
+% \subsection{Commands}
+%
+% The \Gm\ package provides the following commands:
+% \begin{itemize}\setlength{\itemsep}{-.5\parsep}
+% \item |\geometry{|\meta{options}|}|
+% \item |\newgeometry{|\meta{options}|}| and |\restoregeometry|
+% \item |\savegeometry{|\meta{name}|}| and |\loadgeometry{|\meta{name}|}|
+% \end{itemize}
+%
+% |\geometry{|\meta{options}|}|
+% changes the page layout according to the options specified in the
+% argument. This command, if any, should be placed only in the
+% preamble (before |\begin{document}|).
+%
+% The \Gm\ package may be used as part of a class or another package
+% you use in your document. The command \cs{geometry} can overwrite
+% some of the settings in the preamble. Multiple use of \cs{geometry}
+% is allowed and then processed with the options concatenated.
+% If \Gm\ is not yet loaded, you can use only
+% |\usepackage[|\meta{options}|]{geometry}| instead of \cs{geometry}.
+%
+% \medskip
+% |\newgeometry{|\meta{options}|}|
+% changes the page layout mid-document. \cs{newgeometry} is almost
+% similar to \cs{geometry} except that \cs{newgeometry} disables all
+% the options specified by \cs{usepackage} and \cs{geometry} in
+% the preamble and skips papersize-related options.
+% \cs{restoregeometry}
+% restores the page layout specified in the preamble. This command
+% has no arguments. See Section~\ref{sec:midchange} for details.
+%
+% \medskip
+% |\savegeometry{|\meta{name}|}|
+% saves the page dimensions as \meta{name} where you put
+% this command.
+% |\loadgeometry{|\meta{name}|}|
+% loads the page dimensions saved as \meta{name}. See
+% Section~\ref{sec:midchange} for details.
+%
+% \subsection{Optional argument}
+%
+% The \Gm\ package adopts \textsf{keyval} interface
+% `\meta{key}=\meta{value}' for the optional argument to
+% \cs{usepackage}, \cs{geometry} and \cs{newgeometry}.
+%
+% The argument includes a list of comma-separated \textsf{keyval}
+% options and has basic rules as follows:
+% \begin{itemize}\setlength{\itemsep}{-.5\parsep}
+% \item Multiple lines are allowed, while blank lines are not.
+% \item Any spaces between words are ignored.
+% \item Options are basically order-independent.
+% (There are some exceptions. See Section~\ref{sec:optionorder} for details.)
+% \end{itemize}
+% For example,
+% \begin{quote}
+% |\usepackage[ a5paper , hmargin = { 3cm,|\\
+% | .8in } , height|\\
+% | = 10in ]{geometry}|
+% \end{quote}
+% is equivalent to
+% \begin{quote}
+% |\usepackage[height=10in,a5paper,hmargin={3cm,0.8in}]{geometry}|
+% \end{quote}
+% Some options are allowed to have sub-list, e.g. |{3cm,0.8in}|.
+% Note that the order of values in the sub-list is significant.
+% The above setting is also equivalent to the followings:
+% \begin{quote}
+% |\usepackage{geometry}|\\
+% |\geometry{height=10in,a5paper,hmargin={3cm,0.8in}}|
+% \end{quote}
+% or
+% \begin{quote}
+% |\usepackage[a5paper]{geometry}|\\
+% |\geometry{hmargin={3cm,0.8in},height=8in}|\\
+% |\geometry{height=10in}|.
+% \end{quote}
+% Thus, multiple use of \cs{geometry} just appends options.
+%
+% \Gm\ supports package
+% \textsl{calc}\footnote{CTAN:~\texttt{macros/latex/required/tools}}.
+% For example,
+% \begin{quote}
+% |\usepackage{calc}|\\
+% |\usepackage[textheight=20\baselineskip+10pt]{geometry}|
+% \end{quote}
+%
+% \subsection{Option types}
+% \Gm\ options are categorized into four types:
+%
+% \begin{enumerate}\itemsep=0pt
+% \item \textbf{Boolean type}
+%
+% takes a boolean value (|true| or |false|). If no value,
+% |true| is set by default.
+% \begin{quote}
+% \meta{key}|=true|\OR|false|.\\
+% \meta{key} with no value is equivalent to
+% \meta{key}|=true|.
+% \end{quote}
+% \textit{Examples:}~ |verbose=true|, |includehead|,
+% |twoside=false|.\\
+% Paper name is the exception. The preferred paper name should be set
+% with no values. Whatever value is given, it is ignored. For
+% instance, |a4paper=XXX| is equivalent to |a4paper|.
+%
+% \item \textbf{Single-valued type}
+%
+% takes a mandatory value.
+% \begin{quote}
+% \meta{key}|=|\meta{value}.
+% \end{quote}
+% \textit{Examples:}~ |width=7in|, |left=1.25in|,
+% |footskip=1cm|, |height=.86\paperheight|.
+%
+% \item \textbf{Double-valued type}
+%
+% takes a pair of comma-separated values in braces. The two values can
+% be shortened to one value if they are identical.
+% \begin{quote}
+% \meta{key}|=|\argii{value1}{value2}.\\
+% \meta{key}|=|\meta{value} is equivalent to
+% \meta{key}|=|\argii{value}{value}.
+% \end{quote}
+% \textit{Examples:}~ |hmargin={1.5in,1in}|, |scale=0.8|,
+% |body={7in,10in}|.
+%
+% \item \textbf{Triple-valued type}
+%
+% takes three mandatory, comma-separated values in braces.
+% \begin{quote}
+% \meta{key}|=|\argiii{value1}{value2}{value3}
+% \end{quote}
+% Each value must be a dimension or null. When you give an empty value
+% or `|*|', it means null and leaves the appropriate value
+% to the auto-completion mechanism. You need to specify at least one
+% dimension, typically two dimensions. You can set nulls for all the
+% values, but it makes no sense.
+% \textit{Examples:}\\
+% \hspace*{2em} |hdivide={2cm,*,1cm}|, |vdivide={3cm,19cm, }|,
+% |divide={1in,*,1in}|.
+% \end{enumerate}
+%
+% \section{Option details}
+%
+% This section describes all options available in \Gm.
+% Options with a dagger $^\dagger$ are not available
+% as arguments of \cs{newgeometry} (See Section~\ref{sec:midchange}).
+%
+% \subsection{Paper size}\label{sec:paper}
+%
+% The options below set paper/media size and orientation.
+% \begin{Options}
+% \item[\onlypre paper\OR papername] ~\\
+% specifies the paper size by name. |paper=|\meta{paper-name}.
+% For convenience, you can specify the paper name without |paper=|.
+% For example, |a4paper| is equivalent to |paper=a4paper|.
+% \item[\onlypre \vtop{
+% \hbox{a0paper, a1paper, a2paper, a3paper, a4paper, a5paper, a6paper,}
+% \hbox{b0paper, b1paper, b2paper, b3paper, b4paper, b5paper, b6paper,}
+% \hbox{c0paper, c1paper, c2paper, c3paper, c4paper, c5paper, c6paper,}
+% \hbox{b0j, b1j, b2j, b3j, b4j, b5j, b6j,}
+% \hbox{ansiapaper, ansibpaper, ansicpaper, ansidpaper, ansiepaper,}
+% \hbox{letterpaper, executivepaper, legalpaper}}]~\\[1ex]
+% specifies paper name. The value part is ignored even if any.
+% For example, the followings have the same effect:
+% |a5paper|, |a5paper=true|, |a5paper=false| and so forth.
+% |a[0-6]paper|, |b[0-6]paper| and |c[0-6]paper| are ISO A, B and C
+% series of paper sizes respectively.
+% The JIS (Japanese Industrial Standards) A-series is identical to the
+% ISO A-series, but the JIS B-series is different from the ISO B-series.
+% |b[0-6]j| should be used for the JIS B-series.
+% \item[\onlypre screen] a special paper size with (W,H) = (225mm,180mm).
+% For presentation with PC and video projector, ``|screen,centering|''
+% with `slide' documentclass would be useful.
+% \item[\onlypre paperwidth] width of the paper. |paperwidth=|\meta{length}.
+% \item[\onlypre paperheight] height of the paper. |paperheight=|\meta{length}.
+% \item[\onlypre papersize] width and height of the paper.
+% |papersize=|\argii{width}{height} or |papersize=|\meta{length}.
+% \item[\onlypre landscape] switches the paper orientation to landscape mode.
+% \item[\onlypre portrait] switches the paper orientation to portrait mode.
+% This is equivalent to |landscape=false|.
+% \end{Options}
+%
+% The options for paper names (e.g., |a4paper|) and orientation
+% (|portrait| and |landscape|) can be set as document class options.
+% For example, you can set |\documentclass[a4paper,landscape]{article}|,
+% then |a4paper| and |landscape| are processed in \Gm\ as well.
+% This is also the case for |twoside| and |twocolumn|
+% (see also Section~\ref{sec:dimension}).
+%
+% \subsection{Layout size}
+%
+% You can specify the layout area with options described in this
+% section regardless of the paper size.
+% The options would help to print the specified layout to a different
+% sized paper. For example, with |a4paper| and |layout=a5paper|, the
+% package uses `A5' layout to calculate margins on 'A4' paper.
+% The layout size defaults to the same as the paper.
+% The options for the layout size are available in \cs{newgeometry},
+% so that you can change the layout size in the middle of the document.
+% The paper size itself can't be changed though.
+% Figure~\ref{fig:layoutandpaper} shows what the difference between
+% |layout| and |paper| is.
+% \begin{Options}
+% \item[layout] specifies the layout size by paper
+% name. |layout=|\meta{paper-name}. All the paper names defined in \Gm\
+% are available. See Section~\ref{sec:paper} for details.
+% \item[layoutwidth] width of the layout. |layoutwidth=|\meta{length}.
+% \item[layoutheight] height of the layout. |layoutheight=|\meta{length}.
+% \item[layoutsize] width and height of the layout.
+% |layoutsize=|\argii{width}{height} or |layoutsize=|\meta{length}.
+% \item[layouthoffset] specifies the horizontal offset from the left edge of
+% the paper. |layouthoffset=|\meta{length}.
+% \item[layoutvoffset] specifies the vertical offset from the top edge of
+% the paper. |layoutvoffset=|\meta{length}.
+% \item[layoutoffset] specifies both horizontal and vertical offsets.
+% |layoutoffset=|\argii{hoffset}{voffset} or |layoutsize=|\meta{length}.
+% \end{Options}
+% \begin{figure}
+% \centering\small
+% {\unitlength=.6pt
+% \begin{picture}(450,250)(0,-10)
+% \put(20,0){\makebox(168,12)[r]{\gpart{paper}}}
+% \put(20,0){\framebox(170,230){}}
+% \put(21,40){\dashbox{3}(140,189){}}
+% \put(21,28){\makebox(140,12)[r]{\gpart{layout}}}
+% \put(40,50){\makebox(100,10){\gpart{foot}}}
+% \put(40,50){\line(1,0){100}}
+% \put(40,65){\framebox(100,125){\gpart{body}}}
+% \put(40,200){\framebox(100,10){\gpart{head}}}
+% \put(20,230){\makebox(140,20){|layoutwidth|}}
+% \put(40,240){\vector(-1,0){20}}
+% \put(140,240){\vector(1,0){20}}
+% \put(10,145){\vector(0,1){85}}
+% \put(15,125){\makebox(0,20)[r]{|layoutheight|}}
+% \put(10,125){\vector(0,-1){85}}
+% \put(280,0){\makebox(168,12)[r]{\gpart{paper}}}
+% \put(280,0){\framebox(170,230){}}
+% \put(293,35){\dashbox{3}(140,189){}}
+% \put(293,23){\makebox(140,12)[r]{\gpart{layout}}}
+% \put(312,45){\makebox(100,10){\gpart{foot}}}
+% \put(312,45){\line(1,0){100}}
+% \put(312,60){\framebox(100,125){\gpart{body}}}
+% \put(312,195){\framebox(100,10){\gpart{head}}}
+% \put(235,230){\makebox(80,20)[l]{|layouthoffset|}}
+% \put(260,210){\vector(1,0){20}}
+% \put(308,210){\vector(-1,0){15}}
+% \put(260,210){\line(-1,2){10}}
+% \put(355,230){\makebox(100,20){|layoutvoffset|}}
+% \put(350,250){\vector(0,-1){20}}
+% \put(350,209){\vector(0,1){15}}
+% \end{picture}}
+% \caption[layout and paper]{%
+% \begin{minipage}[t]{.7\textwidth}\raggedright\small
+% The dimensions related to the layout size. Note that the layout size
+% defaults to the same size as the paper, so you don't have to specify
+% layout-related options explicitly in most cases.
+% \end{minipage}}
+% \label{fig:layoutandpaper}
+% \end{figure}
+%
+% \subsection{Body size}\label{sec:body}
+%
+% The options specifying the size of \gpart{total body} are described in this
+% section.
+%
+% \begin{Options}
+% \item[hscale]
+% ratio of width of \gpart{total body} to \cs{paperwidth}.
+% |hscale=|\meta{h-scale}, e.g., |hscale=0.8| is equivalent to
+% |width=0.8|\cs{paperwidth}. (|0.7| by default)
+% \item[vscale]
+% ratio of height of \gpart{total body} to \cs{paperheight}, e.g.,
+% |vscale=|\meta{v-scale}. (|0.7| by default) |vscale=0.9| is equivalent
+% to |height=0.9|\cs{paperheight}.
+% \item[scale] ratio of \gpart{total body} to the paper.
+% |scale=|\argii{h-scale}{v-scale} or |scale=|\meta{scale}.
+% (|0.7| by default)
+% \item[width\OR totalwidth] ~\\
+% width of \gpart{total body}. |width=|\meta{length} or
+% |totalwidth=|\meta{length}. This dimension defaults to |textwidth|,
+% but if |includemp| is set to |true|, |width| $\ge$ |textwidth|
+% because |width| includes the width of the marginal notes.
+% If |textwidth| and |width| are specified at the same time,
+% |textwidth| takes priority over |width|.
+% \item[height\OR totalheight] ~\\
+% height of \gpart{total body}, excluding header and footer by default.
+% If |includehead| or |includefoot| is set, |height| includes
+% the head or foot of the page as well as |textheight|.
+% |height=|\meta{length} or |totalheight=|\meta{length}. If both
+% |textheight| and |height| are specified, |height| will be ignored.
+% \item[total] width and height of \gpart{total body}.\\
+% |total=|\argii{width}{height} or |total=|\meta{length}.
+% \item[textwidth] specifies \cs{textwidth}, the width of \gpart{body}
+% (the text area). |textwidth=|\meta{length}.
+% \item[textheight] specifies \cs{textheight}, the height of
+% \gpart{body} (the text area). |textheight=|\meta{length}.
+% \item[text\OR body] specifies both \cs{textwidth} and \cs{textheight}
+% of the body of page. |body=|\argii{width}{height} or
+% |text=|\meta{length}.
+% \item[lines] enables users to specify \cs{textheight} by the number
+% of lines. |lines|=\meta{integer}.
+% \item[includehead] includes the head of the page, \cs{headheight}
+% and \cs{headsep}, into \gpart{total body}. It is set to |false| by
+% default. It is opposite to |ignorehead|. See
+% Figure~\ref{fig:includes} and Figure~\ref{fig:modes}.
+% \item[includefoot] includes the foot of the page, \cs{footskip},
+% into \gpart{total body}. It is opposite to |ignorefoot|.
+% It is |false| by default. See Figure~\ref{fig:includes} and
+% Figure~\ref{fig:modes}.
+% \item[includeheadfoot]~\\
+% sets both |includehead| and |includefoot| to |true|, which is opposite
+% to |ignoreheadfoot|. See Figure~\ref{fig:includes} and
+% Figure~\ref{fig:modes}.
+% \item[includemp] includes the margin notes, \cs{marginparwidth}
+% and \cs{marginparsep}, into \gpart{body} when calculating horizontal
+% calculation.
+% \item[includeall] sets both |includeheadfoot| and |includemp| to
+% |true|. See Figure~\ref{fig:modes}.
+% \item[ignorehead] disregards the head of the page,
+% |headheight| and |headsep|, in determining vertical layout, but does not
+% change those lengths. It is equivalent to |includehead=false|. It is set
+% to |true| by default. See also |includehead|.
+% \item[ignorefoot] disregards the foot of page, |footskip|,
+% in determining vertical layout, but does not change that length.
+% This option defaults to |true|. See also |includefoot|.
+% \item[ignoreheadfoot]~\\ sets both |ignorehead| and |ignorefoot|
+% to |true|. See also |includeheadfoot|.
+% \item[ignoremp] disregards the marginal notes in determining the
+% horizontal margins (defaults to |true|). If marginal notes overrun
+% the page, the warning message will be displayed when |verbose=true|.
+% See also |includemp| and Figure~\ref{fig:modes}.
+% \item[ignoreall] sets both |ignoreheadfoot| and |ignoremp| to |true|.
+% See also |includeall|.
+% \item[heightrounded]~\\
+% This option rounds \cs{textheight} to \textit{n}-times (\textit{n}:
+% an integer) of \cs{baselineskip} plus \cs{topskip} to avoid
+% ``underfull vbox'' in some cases. For example, if \cs{textheight} is
+% 486pt with \cs{baselineskip} 12pt and \cs{topskip} 10pt, then
+% \begin{quote}
+% $(39\times12\textrm{pt}+10\textrm{pt}=)\: 478\textrm{pt}
+% < 486\textrm{pt} <
+% 490\textrm{pt} \:(=40\times12\textrm{pt}+10\textrm{pt})$,
+% \end{quote}
+% as a result \cs{textheight} is rounded to 490pt. |heightrounded=false|
+% by default.
+% \end{Options}
+%
+% Figure~\ref{fig:modes} illustrates various layouts with different layout
+% modes. The dimensions for a header and a footer can be controlled by
+% |nohead| or |nofoot| mode, which sets each length to 0pt directly.
+% On the other hand, options with the prefix |ignore| do \textit{not}
+% change the corresponding native dimensions.
+% \begin{figure}
+% \centering\small
+% {\unitlength=.65pt
+% \begin{picture}(460,525)(0,0)
+% \put( 20,310){\framebox(120,170){}}
+% \put( 20,507){\makebox(120,0)[bl]%
+% {\textbf{(a)}~|includeheadfoot|}}
+% \put( 20,460){\line(1,0){120}}\put( 20,450){\line(1,0){120}}
+% \put( 20,330){\line(1,0){120}}
+% \put( 20,485){\makebox(120,0)[br]{\gpart{total body}}}
+% \put( 20,335){\makebox(120,0)[bc]{|textwidth|}}
+% \put(150,470){\makebox(0,0)[l]{|headheight|}}
+% \put(150,450){\makebox(0,0)[l]{|headsep|}}
+% \put(150,390){\makebox(0,0)[l]{|textheight|}}
+% \put(150,320){\makebox(0,0)[l]{|footskip|}}
+% \put( 10,460){\makebox(120,20)[bc]{\gpart{head}}}
+% \put( 10,320){\makebox(120,140)[c]{\gpart{body}}}
+% \put( 10,310){\makebox(120,10)[c]{\gpart{foot}}}
+% \put(250,310){\framebox(120,170){}}
+% \put(250,507){\makebox(120,0)[bl]%
+% {\textbf{(b)}~|includeall|}}
+% \put(250,460){\line(1,0){95}}\put(250,450){\line(1,0){95}}
+% \put(250,330){\line(1,0){95}}\put(345,330){\line(0,1){120}}
+% \put(350,330){\line(0,1){120}}\put(350,450){\line(1,0){20}}
+% \put(350,330){\line(1,0){20}}
+% \put(250,485){\makebox(120,0)[br]{\gpart{total body}}}
+% \put(250,460){\makebox(95,20)[bc]{\gpart{head}}}
+% \put(250,320){\makebox(95,140)[c]{\gpart{body}}}
+% \put(385,390){\makebox(95,0)[cl]%
+% {\gpart{\shortstack[l]{marginal\\note}}}}
+% \put(250,310){\makebox(95,10)[c]{\gpart{foot}}}
+% \put(250,335){\makebox(95,0)[bc]{|textwidth|}}
+% \multiput(360, 390)(4,0){6}{\line(1,0){2}}
+% \multiput(348,333)(0,-4){12}{\line(0,1){2}}
+% \multiput(360,333)(0,-4){8}{\line(0,1){2}}
+% \put(355,292){\makebox(0,0)[bl]{|marginparwidth|}}
+% \put(345,275){\makebox(0,0)[bl]{|marginparsep|}}
+% \put( 20, 40){\framebox(120,170){}}
+% \put( 20,237){\makebox(120,0)[bl]%
+% {\textbf{(c)}~|includefoot|}}
+% \put( 20, 60){\line(1,0){120}}
+% \put( 20,215){\makebox(120,0)[br]{\gpart{total body}}}
+% \put(150,130){\makebox(0,0)[l]{|textheight|}}
+% \put(150, 50){\makebox(0,0)[l]{|footskip|}}
+% \put( 20, 50){\makebox(120,160)[c]{\gpart{body}}}
+% \put( 20, 40){\makebox(120,10)[c]{\gpart{foot}}}
+% \put( 20, 65){\makebox(120,10)[c]{|textwidth|}}
+% \put(250, 40){\framebox(120,170){}}
+% \put(250,237){\makebox(120,0)[bl]%
+% {\textbf{(d)}~|includefoot,includemp|}}
+% \put(250, 60){\line(1,0){95}}\put(350, 60){\line(1,0){20}}
+% \put(250,215){\makebox(120,0)[br]{\gpart{total body}}}
+% \put(250, 50){\makebox(95,160)[c]{\gpart{body}}}
+% \put(385,130){\makebox(95,0)[cl]%
+% {\gpart{\shortstack[l]{marginal\\note}}}}
+% \put(250, 40){\makebox(95,10)[c]{\gpart{foot}}}
+% \put(250, 65){\makebox(95,0)[bc]{|textwidth|}}
+% \put(345, 60){\line(0,1){150}}\put(350, 60){\line(0,1){150}}
+% \multiput(360, 130)(4,0){6}{\line(1,0){2}}
+% \multiput(348, 63)(0,-4){12}{\line(0,1){2}}
+% \multiput(360, 63)(0,-4){8}{\line(0,1){2}}
+% \put(355,22){\makebox(0,0)[bl]{|marginparwidth|}}
+% \put(345, 5){\makebox(0,0)[bl]{|marginparsep|}}
+% \end{picture}}
+% \caption[Sample layouts for \gpart{total body} with different
+% layout modes]{%
+% \begin{minipage}[t]{.8\textwidth}\small
+% Sample layouts for \gpart{total body} with different switches.
+% (a) |includeheadfoot|, (b) |includeall|, (c) |includefoot|
+% and (d) |includefoot,includemp|.
+% If |reversemp| is set to |true|, the location of the
+% marginal notes are swapped on every page.
+% Option |twoside| swaps both margins and marginal notes on verso pages.
+% Note that the marginal note, if any, is printed despite
+% |ignoremp| or |includemp=false| and overrun the page in some cases.
+% \end{minipage}}
+% \label{fig:modes}
+% \end{figure}
+%
+% The following options can specify body and margins simultaneously with
+% three comma-separated values in braces.
+%
+% \begin{Options}
+% \item[hdivide] horizontal partitions (left,width,right).
+% |hdivide=|\argiii{left margin}{width}{right margin}.
+% Note that you should not specify all of the three parameters.
+% The best way of using this option is to specify two of three and
+% leave the rest with null(nothing) or `|*|'. For example, when you set
+% |hdivide={2cm,15cm, }|, the margin from the right-side edge of page
+% will be determined calculating |paperwidth-2cm-15cm|.
+% \item[vdivide] vertical partitions (top,height,bottom).
+% |vdivide=|\argiii{top margin}{height}{bottom margin}.
+% \item[divide] |divide=|\vargiii{$A$}{$B$}{$C$} is interpreted as
+% |hdivide=|\vargiii{$A$}{$B$}{$C$} and |vdivide=|\vargiii{$A$}{$B$}{$C$}.
+% \end{Options}
+%
+% \subsection{Margin size}\label{sec:margin}
+%
+% The options specifying the size of the margins are listed below.
+%
+% \begin{Options}
+% \item[left\OR lmargin\OR inner]~\\
+% left margin (for oneside) or inner margin (for twoside) of
+% \gpart{total body}. In other words, the distance between the left (inner)
+% edge of the paper and that of \gpart{total body}. |left=|\meta{length}.
+% |inner| has no special meaning, just an alias of |left| and |lmargin|.
+% \item[right\OR rmargin\OR outer]~\\
+% right or outer margin of \gpart{total body}. |right=|\meta{length}.
+% \item[top\OR tmargin] top margin of the page. |top=|\meta{length}.
+% Note this option has nothing to do with the native dimension
+% \cs{topmargin}.
+% \item[bottom\OR bmargin]~\\
+% bottom margin of the page. |bottom=|\meta{length}.
+% \item[hmargin] left and right margin.
+% |hmargin=|\argii{left margin}{right margin} or |hmargin=|\meta{length}.
+% \item[vmargin] top and bottom margin.
+% |vmargin=|\argii{top margin}{bottom margin} or |vmargin=|\meta{length}.
+% \item[margin] |margin=|\vargii{$A$}{$B$} is equivalent to
+% |hmargin=|\vargii{$A$}{$B$} and |vmargin=|\vargii{$A$}{$B$}.
+% |margin=|$A$ is automatically expanded to |hmargin=|$A$ and |vmargin=|$A$.
+% \item[hmarginratio]
+% horizontal margin ratio of |left| (inner) to |right| (outer).
+% The value of \meta{ratio} should be specified with colon-separated
+% two values. Each value should be a positive integer less than 100
+% to prevent arithmetic overflow, e.g., |2:3| instead of |1:1.5|.
+% The default ratio is |1:1| for oneside, |2:3| for twoside.
+% \item[vmarginratio]
+% vertical margin ratio of |top| to |bottom|. The default ratio is |2:3|.
+% \item[marginratio\OR ratio]~\\
+% horizontal and vertical margin ratios.
+% |marginratio=|\argii{horizontal ratio}{vertical ratio} or
+% |marginratio=|\meta{ratio}.
+% \item[hcentering] sets auto-centering horizontally and is
+% equivalent to |hmarginratio=1:1|. It is set to |true| by default for
+% oneside. See also |hmarginratio|.
+% \item[vcentering] sets auto-centering vertically and is
+% equivalent to |vmarginratio=1:1|. The default is |false|.
+% See also |vmarginratio|.
+% \item[centering] sets auto-centering and is equivalent to
+% |marginratio=1:1|. See also |marginratio|. The default is |false|.
+% See also |marginratio|.
+% \item[twoside] switches on twoside mode with left and right margins swapped
+% on verso pages. The option sets \cs{@twoside} and \cs{@mparswitch}
+% switches. See also |asymmetric|.
+% \item[asymmetric] implements a twosided layout in which margins are
+% not swapped on alternate pages (by setting \cs{oddsidemargin} to
+% \cs{evensidemargin} |+| |bindingoffset|) and in which the marginal notes
+% stay always on the same side. This option can be used as an alternative
+% to the twoside option. See also |twoside|.
+% \item[bindingoffset]~\\ removes a specified space
+% from the lefthand-side of the page for oneside or the inner-side for
+% twoside. |bindingoffset=|\meta{length}. This is useful if pages
+% are bound by a press binding (glued, stitched, stapled \ldots).
+% See Figure~\ref{fig:bindingoffset}.
+% \item[hdivide] See description in Section~\ref{sec:body}.
+% \item[vdivide] See description in Section~\ref{sec:body}.
+% \item[divide] See description in Section~\ref{sec:body}.
+% \end{Options}
+% \begin{figure}
+% \centering\small
+% {\unitlength=.65pt
+% \begin{picture}(500,270)(0,0)
+% \put(20,0){\framebox(170,230){}}
+% \put(20,255){\makebox(80,20)[l]{\textbf{a)}~every page for oneside or}}
+% \put(20,240){\makebox(80,20)[l]{\hspace{3ex}odd pages for twoside}}
+% \put(110,225){\makebox(80,20)[r]{\gpart{paper}}}
+% \put(55,37){\framebox(110,170)[tc]{\gpart{total body}}}
+% \multiput(38,0)(0,7){33}{\line(0,1){4}}
+% \put(38,100){\vector(1,0){17}}\put(55,100){\vector(-1,0){17}}
+% \put(60,95){\makebox(80,10)[l]{|left|}}
+% \put(60,80){\makebox(80,10)[l]{(|inner|)}}
+% \put(165,100){\vector(1,0){25}}\put(190,100){\vector(-1,0){25}}
+% \put(195,95){\makebox(80,10)[l]{|right|}}
+% \put(195,80){\makebox(80,10)[l]{(|outer|)}}
+% \put(20,16){\vector(1,0){18}}
+% \put(45,10){\makebox(80,10)[bl]{|bindingoffset|}}
+% \put(280,255){\makebox(80,20)[l]{\textbf{b)}~even (back) pages for twoside}}
+% \put(280,0){\framebox(170,230){}}
+% \put(370,225){\makebox(80,20)[r]{\gpart{paper}}}
+% \put(305,37){\framebox(110,170)[tc]{\gpart{total body}}}
+% \multiput(432,0)(0,7){33}{\line(0,1){4}}
+% \put(280,100){\vector(1,0){25}}\put(305,100){\vector(-1,0){25}}
+% \put(310,95){\makebox(80,10)[l]{|outer|}}
+% \put(310,80){\makebox(80,10)[l]{(|right|)}}
+% \put(415,100){\vector(1,0){17}}\put(432,100){\vector(-1,0){17}}
+% \put(373,95){\makebox(80,10)[l]{|inner|}}
+% \put(373,80){\makebox(80,10)[l]{(|left|)}}
+% \put(450,16){\vector(-1,0){18}}
+% \put(330,10){\makebox(80,10)[bl]{|bindingoffset|}}
+% \end{picture}}
+% \caption[\texttt{bindingoffset} option]{%
+% \begin{minipage}[t]{.8\textwidth}\raggedright\small
+% The option |bindingoffset| adds the specified length to the inner margin.
+% Note that |twoside| option swaps the horizontal margins and the
+% marginal notes together with |bindingoffset| on even pages (see
+% \textbf{b)}), but |asymmetric| option suppresses the swap of the
+% margins and marginal notes (but |bindingoffset| is still swapped).
+% \end{minipage}}
+% \label{fig:bindingoffset}
+% \end{figure}
+%
+% \subsection{Native dimensions}\label{sec:dimension}
+%
+% The options below overwrite \LaTeX\ native dimensions and switches for page
+% layout (See the right-hand side in Figure~\ref{fig:layout}).
+%
+% \begin{Options}
+% \item[headheight\OR head]~\\
+% modifies \cs{headheight}, height of header.
+% |headheight=|\meta{length} or |head=|\meta{length}.
+% \item[headsep] modifies \cs{headsep}, separation between header and text
+% (body). |headsep=|\meta{length}.
+% \item[footskip\OR foot]~\\ modifies \cs{footskip}, distance separation
+% between baseline of last line of text and baseline of footer.
+% |footskip=|\meta{length} or |foot=|\meta{length}.
+% \item[nohead] eliminates spaces for the head of the page, which is
+% equivalent to both \cs{headheight}|=0pt| and \cs{headsep}|=0pt|.
+% \item[nofoot] eliminates spaces for the foot of the page, which is
+% equivalent to \cs{footskip}|=0pt|.
+% \item[noheadfoot] equivalent to |nohead| and |nofoot|, which means that
+% \cs{headheight}, \cs{headsep} and \cs{footskip} are all set to |0pt|.
+% \item[footnotesep] changes the dimension \cs{skip}\cs{footins}, separation
+% between the bottom of text body and the top of footnote text.
+% \item[marginparwidth\OR marginpar]~\\
+% modifies \cs{marginparwidth}, width of the marginal notes.
+% |marginparwidth=|\meta{length}.
+% \item[marginparsep] modifies \cs{marginparsep}, separation between
+% body and marginal notes. |marginparsep=|\meta{length}.
+% \item[nomarginpar] shrinks spaces for marginal notes to 0pt, which
+% is equivalent to \cs{marginparwidth}|=0pt| and \cs{marginparsep}|=0pt|.
+% \item[columnsep] modifies \cs{columnsep}, the separation between two
+% columns in |twocolumn| mode.
+% \item[hoffset] modifies \cs{hoffset}. |hoffset=|\meta{length}.
+% \item[voffset] modifies \cs{voffset}. |voffset=|\meta{length}.
+% \item[offset] horizontal and vertical offset.\\
+% |offset=|\argii{hoffset}{voffset} or |offset=|\meta{length}.
+% \item[twocolumn] sets |twocolumn| mode with \cs{@twocolumntrue}.
+% |twocolumn=false| denotes onecolumn mode with\cs{@twocolumnfalse}.
+% Instead of |twocolumn=false|, you can specify |onecolumn| (which
+% defaults to |true|)
+% \item[onecolumn] works as |twocolumn=false|. On the other hand,
+% |onecolumn=false| is equivalent to |twocolumn|.
+% \item[twoside] sets both \cs{@twosidetrue} and \cs{@mparswitchtrue}.
+% See Section~\ref{sec:margin}.
+% \item[textwidth] sets \cs{textwidth} directly. See Section~\ref{sec:body}.
+% \item[textheight] sets \cs{textheight} directly. See Section~\ref{sec:body}.
+% \item[reversemp\OR reversemarginpar]~\\
+% makes the marginal notes appear in the left (inner) margin with
+% \cs{@reversemargintrue}. The option doesn't change |includemp| mode.
+% It's set |false| by default.
+% \end{Options}
+%
+% \subsection{Drivers}\label{sec:drivers}
+%
+% The package supports drivers |dvips|, |dvipdfm|, |pdftex|, |luatex|,
+% |xetex| and |vtex|. You can also set |dvipdfm| for \textsf{dvipdfmx} and
+% \textsf{xdvipdfmx}. |pdftex| for \textsf{pdflatex}, and |vtex| for
+% V\TeX{} environment.
+% The driver options are exclusive. The driver can be set by either
+% |driver=|\meta{driver name} or any of the drivers directly like |pdftex|.
+% By default, \Gm\ guesses the driver appropriate to the system
+% in use. Therefore, you don't have to set a driver in most cases.
+% However, if you want to use |dvipdfm|, you should specify it explicitly.
+%
+% \begin{Options}
+% \item[\onlypre driver] specifies the driver with |driver=|\meta{driver name}.
+% |dvips|, |dvipdfm|, |pdftex|, |luatex|, |vtex|, |xetex|, |auto| and |none| are
+% available as a driver name. The names except for |auto| and |none| can
+% be specified directly with the name without |driver=|.
+% |driver=auto| makes the auto-detection work whatever the previous setting is.
+% |driver=none| disables the auto-detection and sets no driver, which
+% may be useful when you want to let other package work out the driver
+% setting. For example, if you want to use \textsf{crop} package with \Gm,
+% you should call |\usepackage[driver=none]{geometry}| before
+% the \textsf{crop} package.
+% \item[\onlypre dvips] writes the paper size in dvi output with the \cs{special}
+% macro. If you use \textsl{dvips} as a DVI-to-PS driver,
+% for example, to print a document with |\geometry{a3paper,landscape}|
+% on A3 paper in landscape orientation, you don't need options
+% ``|-t a3 -t landscape|'' to \textsl{dvips}.
+% \item[\onlypre dvipdfm] works like |dvips| except for landscape correction.
+% You can set this option when using \textsf{dvipdfmx} and
+% \textsf{xdvipdfmx} to process the dvi output.
+% \item[\onlypre pdftex] sets \cs{pdfpagewidth} and \cs{pdfpageheight}
+% internally.
+% \item[\onlypre luatex] sets \cs{pagewidth} and \cs{pageheight} internally.
+% \item[\onlypre xetex] is the same as |pdftex| except for ignoring
+% |\pdf{h,v}origin| undefined in \XeLaTeX{}. This option is introduced in
+% the version 5. Note that `geometry.cfg' in \TeX{} Live, which disables the
+% auto-detection routine and sets |pdftex|, is no longer necessary,
+% but has no problem even though it's left undeleted.
+% Instead of |xetex|, you can specify |dvipdfm| with \XeLaTeX{}
+% if you want to use specials of dvipdfm \XeTeX{} supports.
+% \item[\onlypre vtex] sets dimensions \cs{mediawidth} and \cs{mediaheight}
+% for V\TeX. When this driver is selected (explicitly or
+% automatically), \Gm\ will auto-detect which output mode
+% (DVI, PDF or PS) is selected in V\TeX, and do proper
+% settings for it.
+% \end{Options}
+% If explicit driver setting is mismatched with the typesetting program
+% in use, the default driver |dvips| would be selected.
+%
+% \subsection{Other options}
+%
+% The other useful options are described here.
+%
+% \begin{Options}
+% \item[\onlypre verbose] displays the parameter results on the terminal.
+% |verbose=false| (default) still puts them into the log file.
+% \item[\onlypre reset] sets back the layout dimensions and switches to the
+% settings before \Gm\ is loaded. Options given in
+% |geometry.cfg| are also cleared.
+% Note that this cannot reset |pass| and |mag| with |truedimen|.
+% |reset=false| has no effect and cannot cancel the previous
+% |reset|(|=true|) if any. For example, when you go
+% \begin{quote}
+% |\documentclass[landscape]{article}|\\
+% |\usepackage[twoside,reset,left=2cm]{geometry}|
+% \end{quote}
+% with |\ExecuteOptions{scale=0.9}| in |geometry.cfg|,
+% then as a result, |landscape| and |left=2cm| remain effective,
+% and |scale=0.9| and |twoside| are ineffective.
+% \item[\onlypre mag] sets magnification value (\cs{mag}) and automatically modifies
+% \cs{hoffset} and \cs{voffset} according to the magnification.
+% |mag=|\meta{value}. Note that \meta{value} should be an integer value
+% with 1000 as a normal size. For example, |mag=1414| with |a4paper|
+% provides an enlarged print fitting in |a3paper|, which is $1.414$
+% (=$\sqrt{2}$) times larger than |a4paper|. Font enlargement needs extra
+% disk space. \textbf{Note that setting |mag| should precede any other
+% settings with `true' dimensions, such as |1.5truein|, |2truecm|
+% and so on.} See also |truedimen| option.
+% \item[\onlypre truedimen] changes all internal explicit dimension values into
+% \textit{true} dimensions, e.g., |1in| is changed to |1truein|.
+% Typically this option will be used together with |mag| option. Note that
+% this is ineffective against externally specified dimensions. For example,
+% when you set ``\texttt{mag=1440, margin=10pt, truedimen}'', margins are
+% not `true' but magnified. If you want to set exact margins, you should
+% set like ``\texttt{mag=1440, margin=10truept, truedimen}'' instead.
+% \item[\onlypre pass] disables all of the geometry options and calculations
+% except |verbose| and |showframe|. It is order-independent and can be
+% used for checking out the page layout of the documentclass, other
+% packages and manual settings without \Gm.
+% \item[\onlypre showframe] shows visible frames for the text area and page,
+% and the lines for the head and foot on the first page.
+% \item[\onlypre showcrop] prints crop marks at each corner of user-specified
+% layout area.
+% \end{Options}
+%
+% \section{Processing options}\label{sec:process}
+%
+% \subsection{Order of loading}\label{sec:loadorder}
+%
+% If there's |geometry.cfg| somewhere \TeX{} can find it, \Gm\ loads
+% it first. For example, in |geometry.cfg| you may write
+% |\ExecuteOptions{a4paper}|, which specifies A4 paper as the default
+% paper. Basically you can use all the options defined in \Gm\ with
+% |\ExecuteOptions{}|.
+%
+% The order of loading in the preamble of your document is as follows:
+% \begin{enumerate}
+% \item |geometry.cfg| if it exists.
+% \item Options specified with |\documentclass[|\meta{options}|]{...}|.
+% \item Options specified with |\usepackage[|\meta{options}|]{geometry}|
+% \item Options specified with |\geometry{|\meta{options}|}|, which
+% can be called multiple times. (|reset| option will cancel the
+% specified options ever given in |\usepackage{geometry}| or
+% |\geometry|.)
+% \end{enumerate}
+%
+% \subsection{Order of options}\label{sec:optionorder}
+%
+% The specification of \Gm\ options is order-independent,
+% and overwrites the previous one for the same setting.
+% For example,
+% \begin{center}
+% |[left=2cm, right=3cm]| is equivalent to
+% |[right=3cm, left=2cm]|.
+% \end{center}
+% The options called multiple times overwrite the previous
+% settings. For example,
+% \begin{center}
+% |[verbose=true, verbose=false]| results in |verbose=false|.
+% \end{center}
+% |[hmargin={3cm,2cm}, left=1cm]| is the same as |hmargin={1cm,2cm}|,
+% where the left (or inner) margin is overwritten by |left=1cm|.
+%
+% |reset| and |mag| are exceptions.
+% The |reset| option removes all the geometry options (except |pass|)
+% before it. If you set
+% \begin{quote}
+% |\documentclass[landscape]{article}|\\
+% |\usepackage[margin=1cm,twoside]{geometry}|\\
+% |\geometry{a5paper, reset, left=2cm}|
+% \end{quote}
+% then |margin=1cm|, |twoside| and |a5paper| are removed, and
+% is eventually equivalent to
+% \begin{quote}
+% |\documentclass[landscape]{article}|\\
+% |\usepackage[left=2cm]{geometry}|
+% \end{quote}
+%
+% The |mag| option should be set in advance of any other settings with
+% `true' length, such as |left=1.5truecm|, |width=5truein| and so on.
+% The |\mag| primitive can be set before this package is called.
+%
+% \subsection{Priority}\label{sec:priority}
+%
+% There are several ways to set dimensions of the \gpart{body}:
+% |scale|, |total|, |text| and |lines|. The \Gm\ package gives higher
+% priority to the more concrete specification. Here is the priority
+% rule for \gpart{body}.
+% \[\begin{array}{c}
+% \textrm{priority:}\qquad\textrm{low}\quad
+% \longrightarrow\quad\textrm{high}\\[1em]
+% \left\{\begin{array}{l}|hscale|\\|vscale|\\|scale|
+% \end{array}\right\} <
+% \left\{\begin{array}{l}|width|\\|height|\\|total|
+% \end{array}\right\} <
+% \left\{\begin{array}{l}|textwidth|\\|textheight|
+% \\|text|\end{array}\right\} < |lines|.
+% \end{array}\]
+% For example,
+% \begin{quote}
+% |\usepackage[hscale=0.8, textwidth=7in, width=18cm]{geometry}|
+% \end{quote}
+% is the same as |\usepackage[textwidth=7in]{geometry}|. Another example:
+% \begin{quote}
+% |\usepackage[lines=30, scale=0.8, text=7in]{geometry}|
+% \end{quote}
+% results in \texttt{[lines=30, textwidth=7in]}.
+%
+% \subsection{Defaults}\label{sec:defaults}
+%
+% This section sums up the default settings for the auto-completion
+% described later.
+%
+% The default vertical margin ratio is $2/3$, namely,
+% \begin{equation}
+% |top| : |bottom| = 2 : 3 \qquad\textit{default}.
+% \end{equation}
+% As for the horizontal margin ratio, the default value depends on
+% whether the document is onesided or twosided,
+% \begin{equation}
+% |left|\;(|inner|) : |right|\;(|outer|)
+% = \left\{ \begin{array}{ll}
+% 1 : 1 \qquad\textit{default for oneside},\\
+% 2 : 3 \qquad\textit{default for twoside}.
+% \end{array}\right.
+% \end{equation}
+% Obviously the default horizontal margin ratio for oneside is `centering'.
+%
+% The \Gm\ package has the following default setting for
+% \textit{onesided} documents:
+% \begin{itemize}\setlength{\itemsep}{-.5\parsep}
+% \item |scale=0.7| (\gpart{body} is $0.7 \times \gpart{paper}$)
+% \item |marginratio={1:1, 2:3}| (1:1 for horizontal and 2:3 for vertical margins)
+% \item |ignoreall| (the header, footer, marginal notes are excluded
+% when calculating the size of \gpart{body}.)
+% \end{itemize}
+% For \textit{twosided} document with |twoside| option, the default
+% setting is the same as \textit{onesided} except that the horizontal
+% margin ratio is set to |2:3| as well.
+%
+% Additional options overwrite the previous specified dimensions.
+%
+% \subsection{Auto-completion} \label{sec:rules}
+%
+% Figure~\ref{fig:specrule} shows schematically how many specification
+% patterns exist and how to solve the ambiguity of the
+% specifications. Each axis shows the numbers of lengths
+% explicitly specified for body and margins. \Ss($m$,$b$) presents the
+% specification with a set of numbers $(\gpart{margin},\gpart{body})=(m,b)$.
+%
+% For example, the specification |width=14cm, left=3cm| is categorized
+% into \Ss(1,1), which is an adequate specification. If you add
+% |right=4cm|, it would be in \Ss(2,1) and overspecified.
+% If only |width=14cm| is given, it's in \Ss(0,1), underspecified.
+%
+% The \Gm\ package has the auto-completion mechanism, in which
+% if the layout parameters are underspecified or overspecified,
+% \Gm\ works out the ambiguity using the defaults and other
+% relations. Here are the specifications and the completion rules.
+%
+% \begin{figure}
+% \centering
+% {\unitlength=1pt
+% \begin{picture}(400,150)(40,0)
+% \put(1,49){\makebox(90,49)[r]{\large 0}}
+% \put(1,1){\makebox(70,99)[r]{\large \gpart{body}}}
+% \put(1,1){\makebox(90,49)[r]{\large 1}}
+% \put(100,100){\makebox(99,20){\large 0}}
+% \put(100,50){\framebox(99,49){}}
+% \put(100,80){\makebox(99,15){\Ss(0,0)}}
+% \put(100,50){\makebox(99,49){use |scale|}}
+% {\linethickness{1pt}%
+% \put(150,35){\line(0,1){30}}
+% \put(150,35){\line(-1,3){4}}
+% \put(150,35){\line(1,3){4}}}
+% \put(100,0){\framebox(99,49){}}
+% \put(100,2){\makebox(99,15){\Ss(0,1)}}
+% \put(100,0){\makebox(99,49){use |marginratio|}}
+% \put(200,120){\makebox(99,12){\large \gpart{margin}}}
+% \put(200,100){\makebox(99,20){\large 1}}
+% \put(200,50){\framebox(99,49){use |scale|}}
+% \put(200,55){\makebox(89,10)[r]{\scriptsize\shortstack[l]{if |ratio|\\specified}}}
+% \put(200,2){\makebox(99,15){\Ss(1,1)}}
+% {\linethickness{1pt}%
+% \put(250,35){\line(0,1){30}}
+% \put(250,35){\line(-1,3){4}}
+% \put(250,35){\line(1,3){4}}}
+% {\linethickness{1pt}%
+% \put(225,25){\line(-1,0){35}}
+% \put(225,25){\line(-3,-1){12}}
+% \put(225,25){\line(-3,1){12}}}
+% \put(200,80){\makebox(99,15){\Ss(1,0)}}
+% \put(200,0){\framebox(99,49){\textcolor{red}{\textit{solvable}}}}
+% \put(300,100){\makebox(99,20){\large 2}}
+% \put(300,80){\makebox(99,15){\Ss(2,0)}}
+% \put(300,50){\framebox(99,49){\textcolor{red}{\textit{solvable}}}}
+% \put(300,0){\framebox(99,49){forget |body|}}
+% \put(300,2){\makebox(99,15){\Ss(2,1)}}
+% {\linethickness{1pt}%
+% \multiput(290,65)(5,0){6}{\line(1,0){3}}
+% \put(320,65){\line(-3,-1){12}}
+% \put(320,65){\line(-3,1){12}}}
+% {\linethickness{1pt}%
+% \put(350,65){\line(0,-1){30}}
+% \put(350,65){\line(-1,-3){4}}
+% \put(350,65){\line(1,-3){4}}}
+% \end{picture}}
+% \caption[Specifications and completion rules]{%
+% \begin{minipage}[t]{.7\textwidth}\raggedright\small
+% Specifications \Ss(0,0) to \Ss(2,1) and the completion rules
+% (arrows). Column and row numbers denote the number of explicitly
+% specified lengths for margin and body respectively. \Ss($m$,$b$) denote a
+% specification with a set of the numbers $(\gpart{margin},\gpart{body})=(m,b)$.
+% \end{minipage}}
+% \label{fig:specrule}
+% \end{figure}
+%
+% \begin{Spec}
+% \item[\Ss(0,0)]
+% Nothing is specified. The \Gm\ package sets \gpart{body} with the
+% default |scale| ($=0.7$). \\ For example, |width| is set to be
+% $|0.7|\times|layoutwidth|$. Note that by default |layoutwidth|
+% and |layoutheight| will be equal to |\paperwidth| and |\paperheight|
+% respectively.
+% Thus \Ss(0,0) goes to \Ss(0,1). See \Ss(0,1).
+% \bigskip
+%
+% \item[\Ss(0,1)]
+% Only \gpart{body} is specified, such as |width=7in|, |lines=20|,
+% |body={20cm,24cm}|, |scale=0.9| and so forth.
+% Then \Gm\ sets margins with the margin ratio.
+% If the margin ratio is not specified, the default is used.
+% The default vertical margin ratio is defined as
+% \begin{equation}
+% |top| : |bottom| = 2 : 3 \qquad\textit{default}.
+% \end{equation}
+% As for the horizontal margin ratio, the default value depends on
+% whether the document is onesided or twosided,
+% \begin{equation}
+% |left|\;(|inner|) : |right|\;(|outer|)
+% = \left\{ \begin{array}{ll}
+% 1 : 1 \qquad\textit{default for oneside},\\
+% 2 : 3 \qquad\textit{default for twoside}.
+% \end{array}\right.
+% \end{equation}
+% For example, if |height=22cm| is specified on A4 paper,
+% \Gm\ calculates |top| margin as follows:
+% \begin{equation}
+% \begin{array}{ll}
+% |top| &= ( |layoutheight| - |height| ) \times 2/5 \\
+% &= (29.7-22)\times2/5 = 3.08\textrm{(cm)}
+% \end{array}
+% \end{equation}
+% Thus |top| margin and body |height| have been determined, the
+% specification for the vertical goes to \Ss(1,1) and
+% all the parameters can be solved.
+% \bigskip
+%
+% \item[\Ss(1,0)]
+% Only one margin is specified, such as |bottom=2cm|, |left=1in|,
+% |top=3cm|, and so forth.
+%
+% \begin{itemize}
+% \item \textbf{If the margin ratio is \textit{not} specified}, \Gm\ sets
+% \gpart{body} with the default |scale| ($=0.7$).
+% For example, if |top=2.4cm| is specified, \Gm\ sets
+% \begin{center}
+% $|height|= |0.7|\times|layoutheight|$
+% ~~($=|0.7\paperheight|$ by default),
+% \end{center}
+% then \Ss(1,0) goes to \Ss(1,1), in which |bottom| is calculated
+% with $|layoutheight|-(|height|+|top|)$ and results in 6.51cm on A4
+% paper if the layout size is equal to the paper size.
+% \medskip
+% \item \textbf{If the margin ratio is specified}, such as
+% |hmarginratio={1:2}|, |vratio={3:4}| and so forth,
+% \Gm\ sets the other% margin with the specified margin ratio.
+% For example, if a set of options ``|top=2.4cm,vratio={3:4}|'' is
+% specified, \Gm\ sets |bottom| to be |3.2cm| calculating
+% \begin{center}
+% $|bottom|= |top|/3\times4 = 3.2\textrm{cm}$
+% \end{center}
+% Thus \Ss(1,0) goes to \Ss(2,0).
+% \end{itemize}
+%
+% Note that the version 4 or earlier used to set the other margin
+% with the margin ratio. In the version 5, therefore, with the
+% same specification, the result will be different from the one in the
+% version 4. For example, if only |top=2.4cm| is specified,
+% you got |bottom=2.4cm| in the version 4 or earlier, but you will get
+% |bottom=6.51cm| in the version 5.
+% \bigskip
+%
+% \item[\Ss(2,1)]
+% The \gpart{body} and two \gpart{margins} are all specified, such as
+% |vdivide={1in,8in,1.5in}|, ``|left=3cm,width=13cm,right=4cm|'' and
+% so forth. Since \Gm\ basically gives priority to \gpart{margins}
+% if dimensions are overspecified, \Gm\ forgets and resets
+% \gpart{body}. For example, if you specify
+% \begin{center}
+% |\usepackage[a4paper,left=3cm,width=13cm,right=4cm]{geometry}|,
+% \end{center}
+% |width| is reset to be 14cm because the width of a A4 paper is 21cm
+% long.
+% \end{Spec}
+%
+% \section{Changing layout mid-document}\label{sec:midchange}
+%
+% The version 5 provides the new commands \cs{newgeometry\{$\cdots$\}}
+% and \cs{restoregeometry}, which allow you to change page dimensions
+% in the middle of the document. Unlike \cs{geometry} in the preamble,
+% \cs{newgeometry} is available only after |\begin{document}|,
+% resets all the options ever specified except for the
+% papersize-related options: |landscape|, |portrait|, and paper size
+% options (such as |papersize|, |paper=a4paper| and so forth), which
+% can't be changed with \cs{newgeometry}.
+%
+% The command \cs{restoregeometry} restores the page layout specified
+% in the preamble (before |\begin{document}|) with the options to
+% |\usepackage{geometry}| and \cs{geometry}.
+%
+% Note that both \cs{newgeometry} and \cs{restoregeometry} insert
+% |\clearpage| where they are called.
+%
+% Below is an example of changing layout mid-document. The layout L1
+% specified with |hmargin=3cm| (|left| and |right| margins are |3cm|
+% long) is changed to L2 with |left=3cm|, |right=1cm| and
+% |bottom=0.1cm|. The layout L1 is restored with
+% \cs{restoregeometry}.
+% \begin{center}
+% \begin{minipage}{.8\textwidth}
+% |\usepackage[hmargin=3cm]{geometry}|\\
+% |\begin{document}|\\
+% \medskip
+% \hspace{1cm}\fbox{Layout L1}\\
+% \medskip
+% |\newgeometry{left=3cm,right=1cm,bottom=0.1cm}|\\
+% \medskip
+% \hspace{1cm}\fbox{Layout L2 (new)}\\
+% \medskip
+% |\restoregeometry|\\
+% \medskip
+% \hspace{1cm}\fbox{Layout L1 (restored)}\\
+% \medskip
+% |\newgeometry{margin=1cm,includefoot}|\\
+% \medskip
+% \hspace{1cm}\fbox{Layout L3 (new)}\\
+% \medskip
+% |\end{document}|
+% \end{minipage}%
+% \end{center}
+% \begin{center}
+% \centering\small
+% {\unitlength=.8pt
+% \begin{picture}(450,180)(0,0)
+% \put(0,165){\makebox(95,12){(saved)}}
+% \put(15,135){\framebox(65,10){\gpart{head}}}
+% \put(15,60){\framebox(65,70){\gpart{body}}}
+% \put(15,45){\makebox(65,12){\gpart{foot}}}
+% \put(15,45){\line(1,0){65}}
+% \put(0,20){\framebox(95,140){}}
+% \put(0,0){\makebox(95,20){L1}}
+% \put(104,90){\circle*{4}}
+% \put(110,90){\circle*{4}}
+% \put(116,90){\circle*{4}}
+% \put(125,165){\makebox(95,12){\cs{newgeometry}}}
+% \put(140,135){\framebox(71,10){\gpart{head}}}
+% \put(140,33){\framebox(71,97){\gpart{body}}}
+% \put(140,21){\makebox(71,12){\gpart{foot}}}
+% \put(125,20){\framebox(95,140){}}
+% \put(125,0){\makebox(95,20){L2 (new)}}
+% \put(229,90){\circle*{4}}
+% \put(235,90){\circle*{4}}
+% \put(241,90){\circle*{4}}
+% \put(250,165){\makebox(95,12){\cs{restoregeometry}}}
+% \put(265,135){\framebox(65,10){\gpart{head}}}
+% \put(265,60){\framebox(65,70){\gpart{body}}}
+% \put(265,45){\makebox(65,12){\gpart{foot}}}
+% \put(265,45){\line(1,0){65}}
+% \put(250,20){\framebox(95,140){}}
+% \put(250,0){\makebox(95,20){L1 (restored)}}
+% \put(354,90){\circle*{4}}
+% \put(360,90){\circle*{4}}
+% \put(366,90){\circle*{4}}
+% \put(375,165){\makebox(95,12){\cs{newgeometry}}}
+% \put(383,41){\framebox(80,111){\gpart{body}}}
+% \put(383,29){\makebox(80,12){\gpart{foot}}}
+% \put(383,29){\line(1,0){80}}
+% \put(375,20){\framebox(95,140){}}
+% \put(375,0){\makebox(95,20){L3 (new)}}
+% \end{picture}}
+% \end{center}
+%
+% A set of commands |\savegeometry{|\meta{name}|}| and
+% |\loadgeometry{|\meta{name}|}| is handy if you want to
+% reuse more different layouts in your document.
+% For example,
+% \begin{center}
+% \begin{verbatim}
+% \usepackage[hmargin=3cm]{geometry}
+% \begin{document}
+% L1
+% \newgeometry{left=3cm,right=1cm,bottom=0.1cm}
+% \savegeometry{L2}
+% L2 (new, saved)
+% \restoregeometry
+% L1 (restored)
+% \newgeometry{margin=1cm,includefoot}
+% L3 (new)
+% \loadgeometry{L2}
+% L2 (loaded)
+% \end{document}
+% \end{verbatim}
+% \end{center}
+%
+% \section{Examples}
+%
+% \begin{enumerate}
+% \item A onesided page layout with the text area centered in the paper.
+% The examples below have the same result because the horizontal margin ratio
+% is set |1:1| for oneside by default.
+% \begin{itemize}
+% \item |centering|
+% \item |marginratio=1:1|
+% \item |vcentering|
+% \end{itemize}
+%
+% \item A twosided page layout with the inside offset for binding set to |1cm|.
+% \begin{itemize}
+% \item |twoside, bindingoffset=1cm|
+% \end{itemize}
+% In this case, |textwidth| is shorter than that of the default twosided
+% document by $0.7\times|1cm|$ ($=|0.7cm|$) because the default width of
+% \gpart{body} is set with |scale=0.7|, which means
+% $|width|=|0.7|\times|layoutwidth|$ ($=|0.7\paperwidth|$ by default).
+%
+% \item A layout with the left, right, and top margin |3cm|, |2cm| and
+% |2.5in| respectively, with textheight of 40 lines, and with the head and
+% foot of the page included in \gpart{total body}.
+% The two examples below have the same result.
+% \begin{itemize}
+% \item |left=3cm, right=2cm, lines=40, top=2.5in, includeheadfoot|
+% \item |hmargin={3cm,2cm}, tmargin=2.5in, lines=40, includeheadfoot|
+% \end{itemize}
+%
+% \item A layout with the height of \gpart{total body} |10in|, the bottom
+% margin |2cm|, and the default width. The top margin will be calculated
+% automatically. Each solution below results in the same page layout.
+% \begin{itemize}
+% \item |vdivide={*, 10in, 2cm}|
+% \item |bmargin=2cm, height=10in|
+% \item |bottom=2cm, textheight=10in|
+% \end{itemize}
+% Note that dimensions for \gpart{head} and \gpart{foot} are excluded from
+% |height| of \gpart{total body}. An additional |includefoot| makes
+% \cs{footskip} included in |totalheight|. Therefore, in the two cases below,
+% |textheight| in the former layout is shorter than the latter
+% (with 10in exactly) by \cs{footskip}. In other words,
+% |height| = |textheight| + |footskip| when |includefoot=true| in this case.
+% \begin{itemize}
+% \item |bmargin=2cm, height=10in, includefoot|
+% \item |bottom=2cm, textheight=10in, includefoot|
+% \end{itemize}
+%
+% \item A layout with \glen{textwidth} and \glen{textheight} 90\% of the
+% paper and with \gpart{body} centered.
+% Each solution below results in the same page layout as long as
+% |layoutwidth| and |layoutheight| are not modified from the default.
+% \begin{itemize}
+% \item |scale=0.9, centering|
+% \item |text={.9\paperwidth,.9\paperheight}, ratio=1:1|
+% \item |width=.9\paperwidth, vmargin=.05\paperheight, marginratio=1:1|
+% \item |hdivide={*,0.9\paperwidth,*}, vdivide={*,0.9\paperheight,*}|
+% (as for onesided documents)
+% \item |margin={0.05\paperwidth,0.05\paperheight}|
+% \end{itemize}
+% You can add |heightrounded| to avoid an ``underfull vbox warning'' like
+% \begin{quote}\small
+% |Underfull \vbox (badness 10000) has occurred while \output is active|.
+% \end{quote}
+% See Section~\ref{sec:body} for the detailed description about |heightrounded|.
+%
+% \item A layout with the width of marginal notes set to |3cm| and included
+% in the width of \gpart{total body}. The following examples are the same.
+% \begin{itemize}
+% \item |marginparwidth=3cm, includemp|
+% \item |marginpar=3cm, ignoremp=false|
+% \end{itemize}
+%
+% \item A layout where \gpart{body} occupies the whole paper with A5 paper in
+% landscape. The following examples are the same.
+% \begin{itemize}
+% \item |a5paper, landscape, scale=1.0|
+% \item |landscape=TRUE, paper=a5paper, margin=0pt|
+% \end{itemize}
+%
+% \item A screen size layout appropriate for presentation with PC and video
+% projector.
+% \begin{verbatim}
+% \documentclass{slide}
+% \usepackage[screen,margin=0.8in]{geometry}
+% ...
+% \begin{slide}
+% ...
+% \end{slide}\end{verbatim}
+% \item A layout with fonts and spaces both enlarged from A4 to A3.
+% In the case below, the resulting paper size is A3.
+% \begin{itemize}
+% \item |a4paper, mag=1414|.
+% \end{itemize}
+% If you want to have a layout with two times bigger fonts, but without
+% changing paper size, you can type
+% \begin{itemize}
+% \item |letterpaper, mag=2000, truedimen|.
+% \end{itemize}
+% You can add |dvips| option, that is useful to preview it with proper
+% paper size by |dviout| or |xdvi|.
+%
+% \item Changing the layout of the first page and leaving the others
+% as default before loading \Gm. Use |pass| option, |\newgeometry|
+% and |\restoregeometry|.
+% \begin{verbatim}
+% \documentclass{book}
+% \usepackage[pass]{geometry}
+% % 'pass' disregards the package layout,
+% % so the original 'book' layout is memorized here.
+% \begin{document}
+% \newgeometry{margin=1cm}% changes the first page dimensions.
+% Page 1
+% \restoregeometry % restores the original 'book' layout.
+% Page 2 and more
+% \end{document}\end{verbatim}
+%
+% \item A complex page layout.
+% \begin{verbatim}
+% \usepackage[a5paper, landscape, twocolumn, twoside,
+% left=2cm, hmarginratio=2:1, includemp, marginparwidth=43pt,
+% bottom=1cm, foot=.7cm, includefoot, textheight=11cm, heightrounded,
+% columnsep=1cm, dvips, verbose]{geometry}\end{verbatim}
+% Try typesetting it and checking out the result yourself. |:-)|
+% \end{enumerate}
+%
+% \section{Known problems}
+% \begin{itemize}
+% \item With |mag| $\neq 1000$ and |truedimen|,
+% |paperwidth| and |paperheight| shown in verbose mode are different
+% from the real size of the resulted PDF. The PDF itself is correct anyway.
+%
+% \item With |mag| $\neq 1000$, \textit{no} |truedimen|
+% and \textsf{hyperref}, \textsf{hyperref} should be loaded before \Gm.
+% Otherwise the resulted PDF size will become wrong.
+%
+% \item With \textsf{crop} package and |mag| $\neq 1000$,
+% |center| option of \textsf{crop} doesn't work well.
+%
+% \end{itemize}
+%
+% \section{Acknowledgments}
+% The author appreciates helpful suggestions and comments from many
+% people including (in alphabetical order of family name):
+% Jean-Bernard Addor,
+% Frank Bennett,
+% Alexis Dimitriadis,
+% Friedrich Flender,
+% Adrian Heathcote,
+% Stephan Hennig,
+% Morten H\o{}gholm,
+% Jonathan Kew,
+% James Kilfiger,
+% Yusuke Kuroki,
+% Jean-Marc Lasgouttes,
+% Wlodzimierz Macewicz,
+% Frank Mittelbach,
+% Eckhard Neber,
+% Rolf Niepraschk,
+% Hans Fr.~Nordhaug,
+% Heiko Oberdiek,
+% Keith Reckdahl,
+% Peter Riocreux,
+% Will Robertson,
+% Pablo Rodriguez,
+% Nico Schl\"{o}emer,
+% Perry C.~Stearns,
+% Frank Stengel,
+% Plamen Tanovski,
+% Petr Uher,
+% Piet van Oostrum,
+% Vladimir Volovich,
+% Michael Vulis.
+%
+% \StopEventually{%
+% }
+%
+% \newgeometry{hmargin={4.2cm,1.5cm},vmargin={1cm,1cm},
+% includeheadfoot, marginpar=3.8cm}
+% \section{Implementation}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% This package requires the following packages:
+% \textsf{keyval}, \textsf{ifpdf}, \textsf{ifvtex} and \textsf{ifxetex}.
+% \begin{macrocode}
+\RequirePackage{keyval}%
+\RequirePackage{ifpdf}%
+\RequirePackage{ifvtex}%
+\RequirePackage{ifxetex}%
+% \end{macrocode}
+%
+% Internal switches are declared here.
+% \begin{macrocode}
+\newif\ifGm@verbose
+\newif\ifGm@landscape
+\newif\ifGm@swap@papersize
+\newif\ifGm@includehead
+\newif\ifGm@includefoot
+\newif\ifGm@includemp
+\newif\ifGm@hbody
+\newif\ifGm@vbody
+\newif\ifGm@heightrounded
+\newif\ifGm@showframe
+\newif\ifGm@showcrop
+\newif\ifGm@pass
+\newif\ifGm@resetpaper
+\newif\ifGm@layout
+\newif\ifGm@newgm
+% \end{macrocode}
+% \begin{macro}{\Gm@cnth}
+% \begin{macro}{\Gm@cntv}
+% The counters for horizontal and vertical partitioning patterns.
+% \begin{macrocode}
+\newcount\Gm@cnth
+\newcount\Gm@cntv
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\c@Gm@tempcnt}
+% The counter is used to set number with \textsf{calc}.
+% \begin{macrocode}
+\newcount\c@Gm@tempcnt
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@bindingoffset}
+% The binding offset for the inner margin.
+% \begin{macrocode}
+\newdimen\Gm@bindingoffset
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@wd@mp}
+% \begin{macro}{\Gm@odd@mp}
+% \begin{macro}{\Gm@even@mp}
+% Correction lengths for \cs{textwidth}, \cs{oddsidemargin} and
+% \cs{evensidemargin} in |includemp| mode.
+% \begin{macrocode}
+\newdimen\Gm@wd@mp
+\newdimen\Gm@odd@mp
+\newdimen\Gm@even@mp
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \begin{macro}{\Gm@layoutwidth}
+% \begin{macro}{\Gm@layoutheight}
+% \begin{macro}{\Gm@layouthoffset}
+% \begin{macro}{\Gm@layoutvoffset}
+% The dimensions for the layout area.
+% \begin{macrocode}
+\newdimen\Gm@layoutwidth
+\newdimen\Gm@layoutheight
+\newdimen\Gm@layouthoffset
+\newdimen\Gm@layoutvoffset
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+% \begin{macro}{\Gm@dimlist}
+% The token in which \LaTeX{} native dimensions can be stored.
+% \begin{macrocode}
+\newtoks\Gm@dimlist
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@warning}
+% The macro to print warning messages.
+% \begin{macrocode}
+\def\Gm@warning#1{\PackageWarningNoLine{geometry}{#1}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifGm@preamble}
+% The macro executes the option given as an argument
+% only if it's specified in the preamble, as the options of
+% |\usepackage| and/or the argument of |\geometry|. Otherwise,
+% the macro would print the warning message and ignores
+% the option setting.
+% \begin{macrocode}
+\def\ifGm@preamble#1{%
+ \ifGm@newgm
+ \Gm@warning{`#1': not available in `\string\newgeometry'; skipped}%
+ \else
+ \expandafter\@firstofone
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@Dhratio}
+% \begin{macro}{\Gm@Dhratiotwo}
+% \begin{macro}{\Gm@Dvratio}
+% The default values for the horizontal and vertical
+% \textsl{marginalratio} are defined. \cs{Gm@Dhratiotwo} denotes the
+% default value of horizontal \textsl{marginratio} for twoside
+% page layout with left and right margins swapped on verso pages,
+% which is set by |twoside|.
+% \begin{macrocode}
+\def\Gm@Dhratio{1:1}% = left:right default for oneside
+\def\Gm@Dhratiotwo{2:3}% = inner:outer default for twoside.
+\def\Gm@Dvratio{2:3}% = top:bottom default
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \begin{macro}{\Gm@Dhscale}
+% \begin{macro}{\Gm@Dvscale}
+% The default values for the horizontal and vertical \textsl{scale}
+% are defined with $0.7$.
+% \begin{macrocode}
+\def\Gm@Dhscale{0.7}%
+\def\Gm@Dvscale{0.7}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\Gm@dvips}%
+% \begin{macro}{\Gm@dvipdfm}%
+% \begin{macro}{\Gm@pdftex}%
+% \begin{macro}{\Gm@luatex}%
+% \begin{macro}{\Gm@xetex}%
+% \begin{macro}{\Gm@vtex}%
+% The driver names.
+% \begin{macrocode}
+\def\Gm@dvips{dvips}%
+\def\Gm@dvipdfm{dvipdfm}%
+\def\Gm@pdftex{pdftex}%
+\def\Gm@luatex{luatex}%
+\def\Gm@xetex{xetex}%
+\def\Gm@vtex{vtex}%
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \begin{macro}{\Gm@true}%
+% \begin{macro}{\Gm@false}%
+% The macros for |true| and |false|.
+% \begin{macrocode}
+\def\Gm@true{true}%
+\def\Gm@false{false}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\Gm@orgpw}
+% \begin{macro}{\Gm@orgph}
+% These macros keep original paper (media) size intact.
+% \begin{macrocode}
+\edef\Gm@orgpw{\the\paperwidth}%
+\edef\Gm@orgph{\the\paperheight}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\Gm@savelength}
+% The macro saves the specified length to |\Gm@restore|.
+% \begin{macrocode}
+\def\Gm@savelength#1{%
+ \g@addto@macro\Gm@restore{\expandafter\noexpand\expandafter\csname
+ #1\endcsname\expandafter=\expandafter\the\csname #1\endcsname\relax}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@saveboolean}
+% The macro saves the specified boolean to |\Gm@restore|.
+% \begin{macrocode}
+\def\Gm@saveboolean#1{%
+ \csname if#1\endcsname
+ \g@addto@macro\Gm@restore{\expandafter\noexpand\csname #1true\endcsname}%
+ \else
+ \g@addto@macro\Gm@restore{\expandafter\noexpand\csname #1false\endcsname}%
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@restore}
+% The initialization for |\Gm@restore|.
+% \begin{macrocode}
+\def\Gm@restore{}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@save}
+% The definition of the macro saving the real lengths
+% \LaTeX\ options.
+% \begin{macrocode}
+\def\Gm@save{%
+ \Gm@savelength{paperwidth}%
+ \Gm@savelength{paperheight}%
+ \Gm@savelength{textwidth}%
+ \Gm@savelength{textheight}%
+ \Gm@savelength{evensidemargin}%
+ \Gm@savelength{oddsidemargin}%
+ \Gm@savelength{topmargin}%
+ \Gm@savelength{headheight}%
+ \Gm@savelength{headsep}%
+ \Gm@savelength{topskip}%
+ \Gm@savelength{footskip}%
+ \Gm@savelength{baselineskip}%
+ \Gm@savelength{marginparwidth}%
+ \Gm@savelength{marginparsep}%
+ \Gm@savelength{columnsep}%
+ \Gm@savelength{hoffset}%
+ \Gm@savelength{voffset}
+ \Gm@savelength{Gm@layoutwidth}%
+ \Gm@savelength{Gm@layoutheight}%
+ \Gm@savelength{Gm@layouthoffset}%
+ \Gm@savelength{Gm@layoutvoffset}%
+ \Gm@saveboolean{@twocolumn}%
+ \Gm@saveboolean{@twoside}%
+ \Gm@saveboolean{@mparswitch}%
+ \Gm@saveboolean{@reversemargin}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@initnewgm}
+% The macro initializes the parameters for layout
+% in |\newgeometry|.
+% \begin{macrocode}
+\def\Gm@initnewgm{%
+ \Gm@passfalse
+ \Gm@swap@papersizefalse
+ \Gm@dimlist={}
+ \Gm@hbodyfalse
+ \Gm@vbodyfalse
+ \Gm@heightroundedfalse
+ \Gm@includeheadfalse
+ \Gm@includefootfalse
+ \Gm@includempfalse
+ \let\Gm@width\@undefined
+ \let\Gm@height\@undefined
+ \let\Gm@textwidth\@undefined
+ \let\Gm@textheight\@undefined
+ \let\Gm@lines\@undefined
+ \let\Gm@hscale\@undefined
+ \let\Gm@vscale\@undefined
+ \let\Gm@hmarginratio\@undefined
+ \let\Gm@vmarginratio\@undefined
+ \let\Gm@lmargin\@undefined
+ \let\Gm@rmargin\@undefined
+ \let\Gm@tmargin\@undefined
+ \let\Gm@bmargin\@undefined
+ \Gm@layoutfalse
+ \Gm@layouthoffset\z@
+ \Gm@layoutvoffset\z@
+ \Gm@bindingoffset\z@}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@initall}
+% This initialization is called as soon as the package is load
+% It's also called as soon as |reset| option is specified.
+% \begin{macrocode}
+\def\Gm@initall{%
+ \let\Gm@driver\@empty
+ \let\Gm@truedimen\@empty
+ \let\Gm@paper\@undefined
+ \Gm@resetpaperfalse
+ \Gm@landscapefalse
+ \Gm@verbosefalse
+ \Gm@showframefalse
+ \Gm@showcropfalse
+ \Gm@newgmfalse
+ \Gm@initnewgm}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@setdriver}
+% The macro sets the specified driver.
+% \begin{macrocode}
+\def\Gm@setdriver#1{%
+ \expandafter\let\expandafter\Gm@driver\csname Gm@#1\endcsname}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@unsetdriver}
+% The macro unsets the specified driver if it has been set.
+% \begin{macrocode}
+\def\Gm@unsetdriver#1{%
+ \expandafter\ifx\csname Gm@#1\endcsname\Gm@driver\let\Gm@driver\@empty\fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@setbool}
+% \begin{macro}{\Gm@setboolrev}
+% The macros for boolean option processing.
+% \begin{macrocode}
+\def\Gm@setbool{\@dblarg\Gm@@setbool}%
+\def\Gm@setboolrev{\@dblarg\Gm@@setboolrev}%
+\def\Gm@@setbool[#1]#2#3{\Gm@doif{#1}{#3}{\csname Gm@#2\Gm@bool\endcsname}}%
+\def\Gm@@setboolrev[#1]#2#3{\Gm@doifelse{#1}{#3}%
+ {\csname Gm@#2\Gm@false\endcsname}{\csname Gm@#2\Gm@true\endcsname}}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\Gm@doif}
+% \begin{macro}{\Gm@doifelse}
+% \cs{Gm@doif} excutes the third argument |#3| using a boolean value
+% |#2| of a option |#1|. \cs{Gm@doifelse} executes the third
+% argument |#3| if a boolean option |#1| with its value |#2| |true|,
+% and executes the fourth argument |#4| if |false|.
+% \begin{macrocode}
+\def\Gm@doif#1#2#3{%
+ \lowercase{\def\Gm@bool{#2}}%
+ \ifx\Gm@bool\@empty
+ \let\Gm@bool\Gm@true
+ \fi
+ \ifx\Gm@bool\Gm@true
+ \else
+ \ifx\Gm@bool\Gm@false
+ \else
+ \let\Gm@bool\relax
+ \fi
+ \fi
+ \ifx\Gm@bool\relax
+ \Gm@warning{`#1' should be set to `true' or `false'}%
+ \else
+ #3
+ \fi}%
+\def\Gm@doifelse#1#2#3#4{%
+ \Gm@doif{#1}{#2}{\ifx\Gm@bool\Gm@true #3\else #4\fi}}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\Gm@reverse}
+% The macro reverses a bool value.
+% \begin{macrocode}
+\def\Gm@reverse#1{%
+ \csname ifGm@#1\endcsname
+ \csname Gm@#1false\endcsname\else\csname Gm@#1true\endcsname\fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@defbylen}
+% \begin{macro}{\Gm@defbycnt}
+% Macros \cs{Gm@defbylen} and \cs{Gm@defbycnt} can be used to define
+% \cs{Gm@xxxx} variables by length and counter respectively
+% with \textsf{calc} package.
+% \begin{macrocode}
+\def\Gm@defbylen#1#2{%
+ \begingroup\setlength\@tempdima{#2}%
+ \expandafter\xdef\csname Gm@#1\endcsname{\the\@tempdima}\endgroup}%
+\def\Gm@defbycnt#1#2{%
+ \begingroup\setcounter{Gm@tempcnt}{#2}%
+ \expandafter\xdef\csname Gm@#1\endcsname{\the\value{Gm@tempcnt}}\endgroup}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \begin{macro}{\Gm@set@ratio}
+% The macro parses the value of options specifying marginal ratios,
+% which is used in \cs{Gm@setbyratio} macro.
+% \begin{macrocode}
+\def\Gm@sep@ratio#1:#2{\@tempcnta=#1\@tempcntb=#2}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@setbyratio}
+% The macro determines the dimension specified by |#4| calculating
+% |#3|$\times a / b$, where $a$ and $b$ are given by \cs{Gm@mratio}
+% with $a:b$ value. If |#1| in brackets is |b|, $a$ and $b$ are swapped.
+% The second argument with |h| or |v| denoting horizontal or vertical
+% is not used in this macro.
+% \begin{macrocode}
+\def\Gm@setbyratio[#1]#2#3#4{% determine #4 by ratio
+ \expandafter\Gm@sep@ratio\Gm@mratio\relax
+ \if#1b
+ \edef\@@tempa{\the\@tempcnta}%
+ \@tempcnta=\@tempcntb
+ \@tempcntb=\@@tempa\relax
+ \fi
+ \expandafter\setlength\expandafter\@tempdimb\expandafter
+ {\csname Gm@#3\endcsname}%
+ \ifnum\@tempcntb>\z@
+ \multiply\@tempdimb\@tempcnta
+ \divide\@tempdimb\@tempcntb
+ \fi
+ \expandafter\edef\csname Gm@#4\endcsname{\the\@tempdimb}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@detiv}
+% This macro determines the fourth length(|#4|) from |#1|(\glen{layoutwidth}
+% or \glen{layoutheight}), |#2| and |#3|. It is used in
+% \cs{Gm@detall} macro.
+% \begin{macrocode}
+\def\Gm@detiv#1#2#3#4{% determine #4.
+ \expandafter\setlength\expandafter\@tempdima\expandafter
+ {\csname Gm@layout#1\endcsname}%
+ \expandafter\setlength\expandafter\@tempdimb\expandafter
+ {\csname Gm@#2\endcsname}%
+ \addtolength\@tempdima{-\@tempdimb}%
+ \expandafter\setlength\expandafter\@tempdimb\expandafter
+ {\csname Gm@#3\endcsname}%
+ \addtolength\@tempdima{-\@tempdimb}%
+ \ifdim\@tempdima<\z@
+ \Gm@warning{`#4' results in NEGATIVE (\the\@tempdima).%
+ ^^J\@spaces `#2' or `#3' should be shortened in length}%
+ \fi
+ \expandafter\edef\csname Gm@#4\endcsname{\the\@tempdima}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@detiiandiii}
+% This macro determines |#2| and |#3| from |#1| with the first argument
+% (|#1|) can be |width| or |height|, which is expanded into dimensions
+% of paper and total body. It is used in \cs{Gm@detall} macro.
+% \begin{macrocode}
+\def\Gm@detiiandiii#1#2#3{% determine #2 and #3.
+ \expandafter\setlength\expandafter\@tempdima\expandafter
+ {\csname Gm@layout#1\endcsname}%
+ \expandafter\setlength\expandafter\@tempdimb\expandafter
+ {\csname Gm@#1\endcsname}%
+ \addtolength\@tempdima{-\@tempdimb}%
+ \ifdim\@tempdima<\z@
+ \Gm@warning{`#2' and `#3' result in NEGATIVE (\the\@tempdima).%
+ ^^J\@spaces `#1' should be shortened in length}%
+ \fi
+ \ifx\Gm@mratio\@undefined
+ \expandafter\Gm@sep@ratio\Gm@Dmratio\relax
+ \else
+ \expandafter\Gm@sep@ratio\Gm@mratio\relax
+ \ifnum\@tempcntb>\z@\else
+ \Gm@warning{margin ratio a:b should be non-zero; default used}%
+ \expandafter\Gm@sep@ratio\Gm@Dmratio\relax
+ \fi
+ \fi
+ \@tempdimb=\@tempdima
+ \advance\@tempcntb\@tempcnta
+ \divide\@tempdima\@tempcntb
+ \multiply\@tempdima\@tempcnta
+ \advance\@tempdimb-\@tempdima
+ \expandafter\edef\csname Gm@#2\endcsname{\the\@tempdima}%
+ \expandafter\edef\csname Gm@#3\endcsname{\the\@tempdimb}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@detall}
+% This macro determines partition of each direction.
+% The first argument (|#1|) should be |h| or |v|, the second (|#2|)
+% |width| or |height|, the third (|#3|) |lmargin| or |top|, and
+% the last (|#4|) |rmargin| or |bottom|.
+% \begin{macrocode}
+\def\Gm@detall#1#2#3#4{%
+ \@tempcnta\z@
+ \if#1h
+ \let\Gm@mratio\Gm@hmarginratio
+ \edef\Gm@Dmratio{\if@twoside\Gm@Dhratiotwo\else\Gm@Dhratio\fi}%
+ \else
+ \let\Gm@mratio\Gm@vmarginratio
+ \edef\Gm@Dmratio{\Gm@Dvratio}%
+ \fi
+% \end{macrocode}
+% \cs{@tempcnta} is treated as a three-digit binary value with
+% top, middle and bottom denoted |left|(|top|), |width|(|height|)
+% and |right|(|bottom|) margins user specified respectively.
+% \begin{macrocode}
+ \if#1h
+ \ifx\Gm@lmargin\@undefined\else\advance\@tempcnta4\relax\fi
+ \ifGm@hbody\advance\@tempcnta2\relax\fi
+ \ifx\Gm@rmargin\@undefined\else\advance\@tempcnta1\relax\fi
+ \Gm@cnth\@tempcnta
+ \else
+ \ifx\Gm@tmargin\@undefined\else\advance\@tempcnta4\relax\fi
+ \ifGm@vbody\advance\@tempcnta2\relax\fi
+ \ifx\Gm@bmargin\@undefined\else\advance\@tempcnta1\relax\fi
+ \Gm@cntv\@tempcnta
+ \fi
+% \end{macrocode}
+% Case the value is |000| (=0) with nothing fixed (default):
+% \begin{macrocode}
+ \ifcase\@tempcnta
+ \if#1h
+ \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}%
+ \else
+ \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}%
+ \fi
+ \Gm@detiiandiii{#2}{#3}{#4}%
+% \end{macrocode}
+% Case |001| (=1) with |right|(|bottom|) fixed:
+% \begin{macrocode}
+ \or
+ \ifx\Gm@mratio\@undefined
+ \if#1h
+ \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}%
+ \else
+ \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}%
+ \fi
+ \setlength\@tempdimc{\@nameuse{Gm@#4}}%
+ \Gm@detiiandiii{#2}{#3}{#4}%
+ \expandafter\let\csname Gm@#2\endcsname\@undefined
+ \Gm@defbylen{#4}{\@tempdimc}%
+ \else
+ \Gm@setbyratio[f]{#1}{#4}{#3}%
+ \fi
+ \Gm@detiv{#2}{#3}{#4}{#2}%
+% \end{macrocode}
+% Case |010| (=2) with |width|(|height|) fixed:
+% \begin{macrocode}
+ \or\Gm@detiiandiii{#2}{#3}{#4}%
+% \end{macrocode}
+% Case |011| (=3) with both |width|(|height|) and |right|(|bottom|) fixed:
+% \begin{macrocode}
+ \or\Gm@detiv{#2}{#2}{#4}{#3}%
+% \end{macrocode}
+% Case |100| (=4) with |left|(|top|) fixed:
+% \begin{macrocode}
+ \or
+ \ifx\Gm@mratio\@undefined
+ \if#1h
+ \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}%
+ \else
+ \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}%
+ \fi
+ \setlength\@tempdimc{\@nameuse{Gm@#3}}%
+ \Gm@detiiandiii{#2}{#4}{#3}%
+ \expandafter\let\csname Gm@#2\endcsname\@undefined
+ \Gm@defbylen{#3}{\@tempdimc}%
+ \else
+ \Gm@setbyratio[b]{#1}{#3}{#4}%
+ \fi
+ \Gm@detiv{#2}{#3}{#4}{#2}%
+% \end{macrocode}
+% Case |101| (=5) with both |left|(|top|) and |right|(|bottom|) fixed:
+% \begin{macrocode}
+ \or\Gm@detiv{#2}{#3}{#4}{#2}%
+% \end{macrocode}
+% Case |110| (=6) with both |left|(|top|) and |width|(|height|) fixed:
+% \begin{macrocode}
+ \or\Gm@detiv{#2}{#2}{#3}{#4}%
+% \end{macrocode}
+% Case |111| (=7) with all fixed though it is over-specified:
+% \begin{macrocode}
+ \or\Gm@warning{Over-specification in `#1'-direction.%
+ ^^J\@spaces `#2' (\@nameuse{Gm@#2}) is ignored}%
+ \Gm@detiv{#2}{#3}{#4}{#2}%
+ \else\fi}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@clean}
+% The macro for setting unspecified dimensions to be \cs{@undefined}.
+% This is used by \cs{geometry} macro.
+% \begin{macrocode}
+\def\Gm@clean{%
+ \ifnum\Gm@cnth<4\let\Gm@lmargin\@undefined\fi
+ \ifodd\Gm@cnth\else\let\Gm@rmargin\@undefined\fi
+ \ifnum\Gm@cntv<4\let\Gm@tmargin\@undefined\fi
+ \ifodd\Gm@cntv\else\let\Gm@bmargin\@undefined\fi
+ \ifGm@hbody\else
+ \let\Gm@hscale\@undefined
+ \let\Gm@width\@undefined
+ \let\Gm@textwidth\@undefined
+ \fi
+ \ifGm@vbody\else
+ \let\Gm@vscale\@undefined
+ \let\Gm@height\@undefined
+ \let\Gm@textheight\@undefined
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@parse@divide}
+% The macro parses (|h|,|v|)|divide| options.
+% \begin{macrocode}
+\def\Gm@parse@divide#1#2#3#4{%
+ \def\Gm@star{*}%
+ \@tempcnta\z@
+ \@for\Gm@tmp:=#1\do{%
+ \expandafter\KV@@sp@def\expandafter\Gm@frag\expandafter{\Gm@tmp}%
+ \edef\Gm@value{\Gm@frag}%
+ \ifcase\@tempcnta\relax\edef\Gm@key{#2}%
+ \or\edef\Gm@key{#3}%
+ \else\edef\Gm@key{#4}%
+ \fi
+ \@nameuse{Gm@set\Gm@key false}%
+ \ifx\empty\Gm@value\else
+ \ifx\Gm@star\Gm@value\else
+ \setkeys{Gm}{\Gm@key=\Gm@value}%
+ \fi\fi
+ \advance\@tempcnta\@ne}%
+ \let\Gm@star\relax}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@branch}
+% The macro splits a value into the same two values.
+% \begin{macrocode}
+\def\Gm@branch#1#2#3{%
+ \@tempcnta\z@
+ \@for\Gm@tmp:=#1\do{%
+ \KV@@sp@def\Gm@frag{\Gm@tmp}%
+ \edef\Gm@value{\Gm@frag}%
+ \ifcase\@tempcnta\relax% cnta == 0
+ \setkeys{Gm}{#2=\Gm@value}%
+ \or% cnta == 1
+ \setkeys{Gm}{#3=\Gm@value}%
+ \else\fi
+ \advance\@tempcnta\@ne}%
+ \ifnum\@tempcnta=\@ne
+ \setkeys{Gm}{#3=\Gm@value}%
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@magtooffset}
+% This macro is used to adjust offsets by \cs{mag}.
+% \begin{macrocode}
+\def\Gm@magtooffset{%
+ \@tempdima=\mag\Gm@truedimen sp%
+ \@tempdimb=1\Gm@truedimen in%
+ \divide\@tempdimb\@tempdima
+ \multiply\@tempdimb\@m
+ \addtolength{\hoffset}{1\Gm@truedimen in}%
+ \addtolength{\voffset}{1\Gm@truedimen in}%
+ \addtolength{\hoffset}{-\the\@tempdimb}%
+ \addtolength{\voffset}{-\the\@tempdimb}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@setlength}
+% This macro stores \LaTeX{} native dimensions, which are stored and
+% set afterwards.
+% \begin{macrocode}
+\def\Gm@setlength#1#2{%
+ \let\Gm@len=\relax\let\Gm@td=\relax
+ \edef\addtolist{\noexpand\Gm@dimlist=%
+ {\the\Gm@dimlist \Gm@len{#1}{#2}}}\addtolist}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@expandlengths}
+% This macro processes \cs{Gm@dimlist}.
+% \begin{macrocode}
+\def\Gm@expandlengths{%
+ \def\Gm@td{\Gm@truedimen}%
+ \def\Gm@len##1##2{\setlength{##1}{##2}}%
+ \the\Gm@dimlist}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@setsize}
+% The macro sets |paperwidth| and |paperheight| dimensions
+% using \cs{Gm@setlength} macro.
+% \begin{macrocode}
+\def\Gm@setsize#1(#2,#3)#4{%
+ \let\Gm@td\relax
+ \expandafter\Gm@setlength\csname #1width\endcsname{#2\Gm@td #4}%
+ \expandafter\Gm@setlength\csname #1height\endcsname{#3\Gm@td #4}%
+ \ifGm@landscape\Gm@swap@papersizetrue\else\Gm@swap@papersizefalse\fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@setpaper@ifpre}
+% The macro changes the paper size.
+% \begin{macrocode}
+\def\Gm@setpaper@ifpre#1{%
+ \ifGm@preamble{#1}{\def\Gm@paper{#1}\@nameuse{Gm@#1}{paper}}}%
+% \end{macrocode}
+% \end{macro}
+% Various paper size are defined here.
+% \begin{macrocode}
+\@namedef{Gm@a0paper}#1{\Gm@setsize{#1}(841,1189){mm}}% ISO A0
+\@namedef{Gm@a1paper}#1{\Gm@setsize{#1}(594,841){mm}}% ISO A1
+\@namedef{Gm@a2paper}#1{\Gm@setsize{#1}(420,594){mm}}% ISO A2
+\@namedef{Gm@a3paper}#1{\Gm@setsize{#1}(297,420){mm}}% ISO A3
+\@namedef{Gm@a4paper}#1{\Gm@setsize{#1}(210,297){mm}}% ISO A4
+\@namedef{Gm@a5paper}#1{\Gm@setsize{#1}(148,210){mm}}% ISO A5
+\@namedef{Gm@a6paper}#1{\Gm@setsize{#1}(105,148){mm}}% ISO A6
+\@namedef{Gm@b0paper}#1{\Gm@setsize{#1}(1000,1414){mm}}% ISO B0
+\@namedef{Gm@b1paper}#1{\Gm@setsize{#1}(707,1000){mm}}% ISO B1
+\@namedef{Gm@b2paper}#1{\Gm@setsize{#1}(500,707){mm}}% ISO B2
+\@namedef{Gm@b3paper}#1{\Gm@setsize{#1}(353,500){mm}}% ISO B3
+\@namedef{Gm@b4paper}#1{\Gm@setsize{#1}(250,353){mm}}% ISO B4
+\@namedef{Gm@b5paper}#1{\Gm@setsize{#1}(176,250){mm}}% ISO B5
+\@namedef{Gm@b6paper}#1{\Gm@setsize{#1}(125,176){mm}}% ISO B6
+\@namedef{Gm@c0paper}#1{\Gm@setsize{#1}(917,1297){mm}}% ISO C0
+\@namedef{Gm@c1paper}#1{\Gm@setsize{#1}(648,917){mm}}% ISO C1
+\@namedef{Gm@c2paper}#1{\Gm@setsize{#1}(458,648){mm}}% ISO C2
+\@namedef{Gm@c3paper}#1{\Gm@setsize{#1}(324,458){mm}}% ISO C3
+\@namedef{Gm@c4paper}#1{\Gm@setsize{#1}(229,324){mm}}% ISO C4
+\@namedef{Gm@c5paper}#1{\Gm@setsize{#1}(162,229){mm}}% ISO C5
+\@namedef{Gm@c6paper}#1{\Gm@setsize{#1}(114,162){mm}}% ISO C6
+\@namedef{Gm@b0j}#1{\Gm@setsize{#1}(1030,1456){mm}}% JIS B0
+\@namedef{Gm@b1j}#1{\Gm@setsize{#1}(728,1030){mm}}% JIS B1
+\@namedef{Gm@b2j}#1{\Gm@setsize{#1}(515,728){mm}}% JIS B2
+\@namedef{Gm@b3j}#1{\Gm@setsize{#1}(364,515){mm}}% JIS B3
+\@namedef{Gm@b4j}#1{\Gm@setsize{#1}(257,364){mm}}% JIS B4
+\@namedef{Gm@b5j}#1{\Gm@setsize{#1}(182,257){mm}}% JIS B5
+\@namedef{Gm@b6j}#1{\Gm@setsize{#1}(128,182){mm}}% JIS B6
+\@namedef{Gm@ansiapaper}#1{\Gm@setsize{#1}(8.5,11){in}}%
+\@namedef{Gm@ansibpaper}#1{\Gm@setsize{#1}(11,17){in}}%
+\@namedef{Gm@ansicpaper}#1{\Gm@setsize{#1}(17,22){in}}%
+\@namedef{Gm@ansidpaper}#1{\Gm@setsize{#1}(22,34){in}}%
+\@namedef{Gm@ansiepaper}#1{\Gm@setsize{#1}(34,44){in}}%
+\@namedef{Gm@letterpaper}#1{\Gm@setsize{#1}(8.5,11){in}}%
+\@namedef{Gm@legalpaper}#1{\Gm@setsize{#1}(8.5,14){in}}%
+\@namedef{Gm@executivepaper}#1{\Gm@setsize{#1}(7.25,10.5){in}}%
+\@namedef{Gm@screen}#1{\Gm@setsize{#1}(225,180){mm}}%
+% \end{macrocode}
+%
+% \begin{key}{Gm}{paper}
+% |paper| takes a paper name as its value.
+% \begin{macrocode}
+\define@key{Gm}{paper}{\setkeys{Gm}{#1}}%
+\let\KV@Gm@papername\KV@Gm@paper
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{a[0-6]paper}
+% \begin{key}{Gm}{b[0-6]paper}
+% \begin{key}{Gm}{b[0-6]j}
+% \begin{key}{Gm}{ansi[a-e]paper}
+% \begin{key}{Gm}{letterpaper}
+% \begin{key}{Gm}{legalpaper}
+% \begin{key}{Gm}{executivepaper}
+% \begin{key}{Gm}{screen}
+% The following paper names are available.
+% \begin{macrocode}
+\define@key{Gm}{a0paper}[true]{\Gm@setpaper@ifpre{a0paper}}%
+\define@key{Gm}{a1paper}[true]{\Gm@setpaper@ifpre{a1paper}}%
+\define@key{Gm}{a2paper}[true]{\Gm@setpaper@ifpre{a2paper}}%
+\define@key{Gm}{a3paper}[true]{\Gm@setpaper@ifpre{a3paper}}%
+\define@key{Gm}{a4paper}[true]{\Gm@setpaper@ifpre{a4paper}}%
+\define@key{Gm}{a5paper}[true]{\Gm@setpaper@ifpre{a5paper}}%
+\define@key{Gm}{a6paper}[true]{\Gm@setpaper@ifpre{a6paper}}%
+\define@key{Gm}{b0paper}[true]{\Gm@setpaper@ifpre{b0paper}}%
+\define@key{Gm}{b1paper}[true]{\Gm@setpaper@ifpre{b1paper}}%
+\define@key{Gm}{b2paper}[true]{\Gm@setpaper@ifpre{b2paper}}%
+\define@key{Gm}{b3paper}[true]{\Gm@setpaper@ifpre{b3paper}}%
+\define@key{Gm}{b4paper}[true]{\Gm@setpaper@ifpre{b4paper}}%
+\define@key{Gm}{b5paper}[true]{\Gm@setpaper@ifpre{b5paper}}%
+\define@key{Gm}{b6paper}[true]{\Gm@setpaper@ifpre{b6paper}}%
+\define@key{Gm}{c0paper}[true]{\Gm@setpaper@ifpre{c0paper}}%
+\define@key{Gm}{c1paper}[true]{\Gm@setpaper@ifpre{c1paper}}%
+\define@key{Gm}{c2paper}[true]{\Gm@setpaper@ifpre{c2paper}}%
+\define@key{Gm}{c3paper}[true]{\Gm@setpaper@ifpre{c3paper}}%
+\define@key{Gm}{c4paper}[true]{\Gm@setpaper@ifpre{c4paper}}%
+\define@key{Gm}{c5paper}[true]{\Gm@setpaper@ifpre{c5paper}}%
+\define@key{Gm}{c6paper}[true]{\Gm@setpaper@ifpre{c6paper}}%
+\define@key{Gm}{b0j}[true]{\Gm@setpaper@ifpre{b0j}}%
+\define@key{Gm}{b1j}[true]{\Gm@setpaper@ifpre{b1j}}%
+\define@key{Gm}{b2j}[true]{\Gm@setpaper@ifpre{b2j}}%
+\define@key{Gm}{b3j}[true]{\Gm@setpaper@ifpre{b3j}}%
+\define@key{Gm}{b4j}[true]{\Gm@setpaper@ifpre{b4j}}%
+\define@key{Gm}{b5j}[true]{\Gm@setpaper@ifpre{b5j}}%
+\define@key{Gm}{b6j}[true]{\Gm@setpaper@ifpre{b6j}}%
+\define@key{Gm}{ansiapaper}[true]{\Gm@setpaper@ifpre{ansiapaper}}%
+\define@key{Gm}{ansibpaper}[true]{\Gm@setpaper@ifpre{ansibpaper}}%
+\define@key{Gm}{ansicpaper}[true]{\Gm@setpaper@ifpre{ansicpaper}}%
+\define@key{Gm}{ansidpaper}[true]{\Gm@setpaper@ifpre{ansidpaper}}%
+\define@key{Gm}{ansiepaper}[true]{\Gm@setpaper@ifpre{ansiepaper}}%
+\define@key{Gm}{letterpaper}[true]{\Gm@setpaper@ifpre{letterpaper}}%
+\define@key{Gm}{legalpaper}[true]{\Gm@setpaper@ifpre{legalpaper}}%
+\define@key{Gm}{executivepaper}[true]{\Gm@setpaper@ifpre{executivepaper}}%
+\define@key{Gm}{screen}[true]{\Gm@setpaper@ifpre{screen}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}\end{key}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{paperwidth}
+% \begin{key}{Gm}{paperheight}
+% \begin{key}{Gm}{papersize}
+% Direct specification for paper size is also possible.
+% \begin{macrocode}
+\define@key{Gm}{paperwidth}{\ifGm@preamble{paperwidth}{%
+ \def\Gm@paper{custom}\Gm@setlength\paperwidth{#1}}}%
+\define@key{Gm}{paperheight}{\ifGm@preamble{paperheight}{%
+ \def\Gm@paper{custom}\Gm@setlength\paperheight{#1}}}%
+\define@key{Gm}{papersize}{\ifGm@preamble{papersize}{%
+ \def\Gm@paper{custom}\Gm@branch{#1}{paperwidth}{paperheight}}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{layout}
+% \begin{key}{Gm}{layoutwidth}
+% \begin{key}{Gm}{layoutheight}
+% \begin{key}{Gm}{layoutsize}
+% Direct specification for layout size is also possible.
+% \begin{macrocode}
+\define@key{Gm}{layout}{\Gm@layouttrue\@nameuse{Gm@#1}{Gm@layout}}%
+\let\KV@Gm@layoutname\KV@Gm@layout
+\define@key{Gm}{layoutwidth}{\Gm@layouttrue\Gm@setlength\Gm@layoutwidth{#1}}%
+\define@key{Gm}{layoutheight}{\Gm@layouttrue\Gm@setlength\Gm@layoutheight{#1}}%
+\define@key{Gm}{layoutsize}{\Gm@branch{#1}{layoutwidth}{layoutheight}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}
+% \begin{key}{Gm}{landscape}
+% \begin{key}{Gm}{portrait}
+% Paper orientation setting.
+% \begin{macrocode}
+\define@key{Gm}{landscape}[true]{\ifGm@preamble{landscape}{%
+ \Gm@doifelse{landscape}{#1}%
+ {\ifGm@landscape\else\Gm@landscapetrue\Gm@reverse{swap@papersize}\fi}%
+ {\ifGm@landscape\Gm@landscapefalse\Gm@reverse{swap@papersize}\fi}}}%
+\define@key{Gm}{portrait}[true]{\ifGm@preamble{portrait}{%
+ \Gm@doifelse{portrait}{#1}%
+ {\ifGm@landscape\Gm@landscapefalse\Gm@reverse{swap@papersize}\fi}%
+ {\ifGm@landscape\else\Gm@landscapetrue\Gm@reverse{swap@papersize}\fi}}}%
+% \end{macrocode}
+% \end{key}\end{key}
+% \begin{key}{Gm}{hscale}
+% \begin{key}{Gm}{vscale}
+% \begin{key}{Gm}{scale}
+% These options can determine the length(s) of \gpart{total body}
+% giving \textit{scale(s)} against the paper size.
+% \begin{macrocode}
+\define@key{Gm}{hscale}{\Gm@hbodytrue\edef\Gm@hscale{#1}}%
+\define@key{Gm}{vscale}{\Gm@vbodytrue\edef\Gm@vscale{#1}}%
+\define@key{Gm}{scale}{\Gm@branch{#1}{hscale}{vscale}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{width}
+% \begin{key}{Gm}{height}
+% \begin{key}{Gm}{total}
+% \begin{key}{Gm}{totalwidth}
+% \begin{key}{Gm}{totalheight}
+% These options give concrete dimension(s) of \gpart{total body}.
+% |totalwidth| and |totalheight| are aliases of |width| and |height|
+% respectively.
+% \begin{macrocode}
+\define@key{Gm}{width}{\Gm@hbodytrue\Gm@defbylen{width}{#1}}%
+\define@key{Gm}{height}{\Gm@vbodytrue\Gm@defbylen{height}{#1}}%
+\define@key{Gm}{total}{\Gm@branch{#1}{width}{height}}%
+\let\KV@Gm@totalwidth\KV@Gm@width
+\let\KV@Gm@totalheight\KV@Gm@height
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}\end{key}
+% \begin{key}{Gm}{textwidth}
+% \begin{key}{Gm}{textheight}
+% \begin{key}{Gm}{text}
+% \begin{key}{Gm}{body}
+% These options directly sets the dimensions \cs{textwidth} and
+% \cs{textheight}. |body| is an alias of |text|.
+% \begin{macrocode}
+\define@key{Gm}{textwidth}{\Gm@hbodytrue\Gm@defbylen{textwidth}{#1}}%
+\define@key{Gm}{textheight}{\Gm@vbodytrue\Gm@defbylen{textheight}{#1}}%
+\define@key{Gm}{text}{\Gm@branch{#1}{textwidth}{textheight}}%
+\let\KV@Gm@body\KV@Gm@text
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}
+% \begin{key}{Gm}{lines}
+% The option sets \cs{textheight} with the number of lines.
+% \begin{macrocode}
+\define@key{Gm}{lines}{\Gm@vbodytrue\Gm@defbycnt{lines}{#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{includehead}
+% \begin{key}{Gm}{includefoot}
+% \begin{key}{Gm}{includeheadfoot}
+% \begin{key}{Gm}{includemp}
+% \begin{key}{Gm}{includeall}
+% The options take the corresponding dimensions as part of
+% \gpart{body}.
+% \begin{macrocode}
+\define@key{Gm}{includehead}[true]{\Gm@setbool{includehead}{#1}}%
+\define@key{Gm}{includefoot}[true]{\Gm@setbool{includefoot}{#1}}%
+\define@key{Gm}{includeheadfoot}[true]{\Gm@doifelse{includeheadfoot}{#1}%
+ {\Gm@includeheadtrue\Gm@includefoottrue}%
+ {\Gm@includeheadfalse\Gm@includefootfalse}}%
+\define@key{Gm}{includemp}[true]{\Gm@setbool{includemp}{#1}}%
+\define@key{Gm}{includeall}[true]{\Gm@doifelse{includeall}{#1}%
+ {\Gm@includeheadtrue\Gm@includefoottrue\Gm@includemptrue}%
+ {\Gm@includeheadfalse\Gm@includefootfalse\Gm@includempfalse}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}\end{key}
+% \begin{key}{Gm}{ignorehead}
+% \begin{key}{Gm}{ignorefoot}
+% \begin{key}{Gm}{ignoreheadfoot}
+% \begin{key}{Gm}{ignoremp}
+% \begin{key}{Gm}{ignoreall}
+% These options exclude \gpart{head}, \gpart{foot}
+% and \gpart{marginpars} when determining \gpart{body}.
+% \begin{macrocode}
+\define@key{Gm}{ignorehead}[true]{%
+ \Gm@setboolrev[ignorehead]{includehead}{#1}}%
+\define@key{Gm}{ignorefoot}[true]{%
+ \Gm@setboolrev[ignorefoot]{includefoot}{#1}}%
+\define@key{Gm}{ignoreheadfoot}[true]{\Gm@doifelse{ignoreheadfoot}{#1}%
+ {\Gm@includeheadfalse\Gm@includefootfalse}%
+ {\Gm@includeheadtrue\Gm@includefoottrue}}%
+\define@key{Gm}{ignoremp}[true]{%
+ \Gm@setboolrev[ignoremp]{includemp}{#1}}%
+\define@key{Gm}{ignoreall}[true]{\Gm@doifelse{ignoreall}{#1}%
+ {\Gm@includeheadfalse\Gm@includefootfalse\Gm@includempfalse}%
+ {\Gm@includeheadtrue\Gm@includefoottrue\Gm@includemptrue}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}\end{key}
+% \begin{key}{Gm}{heightrounded}
+% The option rounds \cs{textheight} to n-times of \cs{baselineskip}
+% plus \cs{topskip}.
+% \begin{macrocode}
+\define@key{Gm}{heightrounded}[true]{\Gm@setbool{heightrounded}{#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{hdivide}
+% \begin{key}{Gm}{vdivide}
+% \begin{key}{Gm}{divide}
+% The options are useful to specify partitioning
+% in each direction of the paper.
+% \begin{macrocode}
+\define@key{Gm}{hdivide}{\Gm@parse@divide{#1}{lmargin}{width}{rmargin}}%
+\define@key{Gm}{vdivide}{\Gm@parse@divide{#1}{tmargin}{height}{bmargin}}%
+\define@key{Gm}{divide}{\Gm@parse@divide{#1}{lmargin}{width}{rmargin}%
+ \Gm@parse@divide{#1}{tmargin}{height}{bmargin}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+%
+% \begin{key}{Gm}{lmargin}
+% \begin{key}{Gm}{rmargin}
+% \begin{key}{Gm}{tmargin}
+% \begin{key}{Gm}{bmargin}
+% \begin{key}{Gm}{left}
+% \begin{key}{Gm}{inner}
+% \begin{key}{Gm}{innermargin}
+% \begin{key}{Gm}{right}
+% \begin{key}{Gm}{outer}
+% \begin{key}{Gm}{outermargin}
+% \begin{key}{Gm}{top}
+% \begin{key}{Gm}{bottom}
+% These options set \gpart{margins}.
+% |left|, |inner|, |innermargin| are aliases of |lmargin|.
+% |right|, |outer|, |outermargin| are aliases of |rmargin|.
+% |top| and |bottom| are aliases of |tmargin| and |bmargin| respectively.
+% \begin{macrocode}
+\define@key{Gm}{lmargin}{\Gm@defbylen{lmargin}{#1}}%
+\define@key{Gm}{rmargin}{\Gm@defbylen{rmargin}{#1}}%
+\let\KV@Gm@left\KV@Gm@lmargin
+\let\KV@Gm@inner\KV@Gm@lmargin
+\let\KV@Gm@innermargin\KV@Gm@lmargin
+\let\KV@Gm@right\KV@Gm@rmargin
+\let\KV@Gm@outer\KV@Gm@rmargin
+\let\KV@Gm@outermargin\KV@Gm@rmargin
+\define@key{Gm}{tmargin}{\Gm@defbylen{tmargin}{#1}}%
+\define@key{Gm}{bmargin}{\Gm@defbylen{bmargin}{#1}}%
+\let\KV@Gm@top\KV@Gm@tmargin
+\let\KV@Gm@bottom\KV@Gm@bmargin
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}\end{key}
+% \end{key}\end{key}\end{key}\end{key}\end{key}
+% \end{key}\end{key}
+% \begin{key}{Gm}{hmargin}
+% \begin{key}{Gm}{vmargin}
+% \begin{key}{Gm}{margin}
+% These options are shorthands for setting \gpart{margins}.
+% \begin{macrocode}
+\define@key{Gm}{hmargin}{\Gm@branch{#1}{lmargin}{rmargin}}%
+\define@key{Gm}{vmargin}{\Gm@branch{#1}{tmargin}{bmargin}}%
+\define@key{Gm}{margin}{\Gm@branch{#1}{lmargin}{tmargin}%
+ \Gm@branch{#1}{rmargin}{bmargin}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{hmarginratio}
+% \begin{key}{Gm}{vmarginratio}
+% \begin{key}{Gm}{marginratio}
+% \begin{key}{Gm}{hratio}
+% \begin{key}{Gm}{vratio}
+% \begin{key}{Gm}{ratio}
+% Options specifying the margin ratios.
+% \begin{macrocode}
+\define@key{Gm}{hmarginratio}{\edef\Gm@hmarginratio{#1}}%
+\define@key{Gm}{vmarginratio}{\edef\Gm@vmarginratio{#1}}%
+\define@key{Gm}{marginratio}{\Gm@branch{#1}{hmarginratio}{vmarginratio}}%
+\let\KV@Gm@hratio\KV@Gm@hmarginratio
+\let\KV@Gm@vratio\KV@Gm@vmarginratio
+\let\KV@Gm@ratio\KV@Gm@marginratio
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{hcentering}
+% \begin{key}{Gm}{vcentering}
+% \begin{key}{Gm}{centering}
+% Useful shorthands to place \gpart{body} centered.
+% \begin{macrocode}
+\define@key{Gm}{hcentering}[true]{\Gm@doifelse{hcentering}{#1}%
+ {\def\Gm@hmarginratio{1:1}}{}}%
+\define@key{Gm}{vcentering}[true]{\Gm@doifelse{vcentering}{#1}%
+ {\def\Gm@vmarginratio{1:1}}{}}%
+\define@key{Gm}{centering}[true]{\Gm@doifelse{centering}{#1}%
+ {\def\Gm@hmarginratio{1:1}\def\Gm@vmarginratio{1:1}}{}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{twoside}
+% If |twoside=true|, \cs{@twoside} and \cs{@mparswitch} is set to |true|.
+% \begin{macrocode}
+\define@key{Gm}{twoside}[true]{\Gm@doifelse{twoside}{#1}%
+ {\@twosidetrue\@mparswitchtrue}{\@twosidefalse\@mparswitchfalse}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{asymmetric}
+% |asymmetric| sets \cs{@mparswitchfalse} and \cs{@twosidetrue}
+% A |asymmetric=false| has no effect.
+% \begin{macrocode}
+\define@key{Gm}{asymmetric}[true]{\Gm@doifelse{asymmetric}{#1}%
+ {\@twosidetrue\@mparswitchfalse}{}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{bindingoffset}
+% The macro adds the specified space to the inner margin.
+% \begin{macrocode}
+\define@key{Gm}{bindingoffset}{\Gm@setlength\Gm@bindingoffset{#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{headheight}
+% \begin{key}{Gm}{headsep}
+% \begin{key}{Gm}{footskip}
+% \begin{key}{Gm}{head}
+% \begin{key}{Gm}{foot}
+% The direct settings of \gpart{head} and/or \gpart{foot} dimensions.
+% \begin{macrocode}
+\define@key{Gm}{headheight}{\Gm@setlength\headheight{#1}}%
+\define@key{Gm}{headsep}{\Gm@setlength\headsep{#1}}%
+\define@key{Gm}{footskip}{\Gm@setlength\footskip{#1}}%
+\let\KV@Gm@head\KV@Gm@headheight
+\let\KV@Gm@foot\KV@Gm@footskip
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}\end{key}
+% \begin{key}{Gm}{nohead}
+% \begin{key}{Gm}{nofoot}
+% \begin{key}{Gm}{noheadfoot}
+% They are only shorthands to set \gpart{head} and/or \gpart{foot}
+% to be |0pt|.
+% \begin{macrocode}
+\define@key{Gm}{nohead}[true]{\Gm@doifelse{nohead}{#1}%
+ {\Gm@setlength\headheight\z@\Gm@setlength\headsep\z@}{}}%
+\define@key{Gm}{nofoot}[true]{\Gm@doifelse{nofoot}{#1}%
+ {\Gm@setlength\footskip\z@}{}}%
+\define@key{Gm}{noheadfoot}[true]{\Gm@doifelse{noheadfoot}{#1}%
+ {\Gm@setlength\headheight\z@\Gm@setlength\headsep
+ \z@\Gm@setlength\footskip\z@}{}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{footnotesep}
+% The option directly sets a native dimension \cs{footnotesep}.
+% \begin{macrocode}
+\define@key{Gm}{footnotesep}{\Gm@setlength{\skip\footins}{#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{marginparwidth}
+% \begin{key}{Gm}{marginpar}
+% \begin{key}{Gm}{marginparsep}
+% They directly set native dimensions \cs{marginparwidth} and
+% \cs{marginparsep}.
+% \begin{macrocode}
+\define@key{Gm}{marginparwidth}{\Gm@setlength\marginparwidth{#1}}%
+\let\KV@Gm@marginpar\KV@Gm@marginparwidth
+\define@key{Gm}{marginparsep}{\Gm@setlength\marginparsep{#1}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{nomarginpar}
+% The macro is a shorthand for \cs{marginparwidth}|=0pt| and
+% \cs{marginparsep}|=0pt|.
+% \begin{macrocode}
+\define@key{Gm}{nomarginpar}[true]{\Gm@doifelse{nomarginpar}{#1}%
+ {\Gm@setlength\marginparwidth\z@\Gm@setlength\marginparsep\z@}{}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{columnsep}
+% The option sets a native dimension \cs{columnsep}.
+% \begin{macrocode}
+\define@key{Gm}{columnsep}{\Gm@setlength\columnsep{#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{hoffset}
+% \begin{key}{Gm}{voffset}
+% \begin{key}{Gm}{offset}
+% The former two options set native dimensions \cs{hoffset} and
+% \cs{voffset}. |offset| can set both of them with the same value.
+% \begin{macrocode}
+\define@key{Gm}{hoffset}{\Gm@setlength\hoffset{#1}}%
+\define@key{Gm}{voffset}{\Gm@setlength\voffset{#1}}%
+\define@key{Gm}{offset}{\Gm@branch{#1}{hoffset}{voffset}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{layouthoffset}
+% \begin{key}{Gm}{layoutvoffset}
+% \begin{key}{Gm}{layoutoffset}
+% \begin{macrocode}
+\define@key{Gm}{layouthoffset}{\Gm@setlength\Gm@layouthoffset{#1}}%
+\define@key{Gm}{layoutvoffset}{\Gm@setlength\Gm@layoutvoffset{#1}}%
+\define@key{Gm}{layoutoffset}{\Gm@branch{#1}{layouthoffset}{layoutvoffset}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}
+% \begin{key}{Gm}{twocolumn}
+% The option sets \cs{twocolumn} switch.
+% \begin{macrocode}
+\define@key{Gm}{twocolumn}[true]{%
+ \Gm@doif{twocolumn}{#1}{\csname @twocolumn\Gm@bool\endcsname}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{onecolumn}
+% This option has the reverse effect of |twocolumn| option.
+% \begin{macrocode}
+\define@key{Gm}{onecolumn}[true]{%
+ \Gm@doifelse{onecolumn}{#1}{\@twocolumnfalse}{\@twocolumntrue}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{reversemp}
+% \begin{key}{Gm}{reversemarginpar}
+% The both options set \cs{reversemargin}.
+% \begin{macrocode}
+\define@key{Gm}{reversemp}[true]{%
+ \Gm@doif{reversemp}{#1}{\csname @reversemargin\Gm@bool\endcsname}}%
+\define@key{Gm}{reversemarginpar}[true]{%
+ \Gm@doif{reversemarginpar}{#1}{\csname @reversemargin\Gm@bool\endcsname}}%
+% \end{macrocode}
+% \end{key}\end{key}
+% \begin{key}{Gm}{dviver}
+% \begin{macrocode}
+\define@key{Gm}{driver}{\ifGm@preamble{driver}{%
+ \edef\@@tempa{#1}\edef\@@auto{auto}\edef\@@none{none}%
+ \ifx\@@tempa\@empty\let\Gm@driver\relax\else
+ \ifx\@@tempa\@@none\let\Gm@driver\relax\else
+ \ifx\@@tempa\@@auto\let\Gm@driver\@empty\else
+ \setkeys{Gm}{#1}\fi\fi\fi\let\@@auto\relax\let\@@none\relax}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{dvips}
+% \begin{key}{Gm}{dvipdfm}\begin{key}{Gm}{dvipdfmx}\begin{key}{Gm}{xdvipdfmx}
+% \begin{key}{Gm}{pdftex}
+% \begin{key}{Gm}{luatex}
+% \begin{key}{Gm}{xetex}
+% \begin{key}{Gm}{vtex}
+% The \Gm\ package supports |dvips|, |dvipdfm|,
+% |pdflatex|, |luatex| and |vtex|. |dvipdfm| works like |dvips|.
+% \begin{macrocode}
+\define@key{Gm}{dvips}[true]{\ifGm@preamble{dvips}{%
+ \Gm@doifelse{dvips}{#1}{\Gm@setdriver{dvips}}{\Gm@unsetdriver{dvips}}}}%
+\define@key{Gm}{dvipdfm}[true]{\ifGm@preamble{dvipdfm}{%
+ \Gm@doifelse{dvipdfm}{#1}{\Gm@setdriver{dvipdfm}}{\Gm@unsetdriver{dvipdfm}}}}%
+\define@key{Gm}{dvipdfmx}[true]{\ifGm@preamble{dvipdfm}{%
+ \Gm@doifelse{dvipdfm}{#1}{\Gm@setdriver{dvipdfm}}{\Gm@unsetdriver{dvipdfm}}}}%
+\define@key{Gm}{xdvipdfmx}[true]{\ifGm@preamble{dvipdfm}{%
+ \Gm@doifelse{dvipdfm}{#1}{\Gm@setdriver{dvipdfm}}{\Gm@unsetdriver{dvipdfm}}}}%
+\define@key{Gm}{pdftex}[true]{\ifGm@preamble{pdftex}{%
+ \Gm@doifelse{pdftex}{#1}{\Gm@setdriver{pdftex}}{\Gm@unsetdriver{pdftex}}}}%
+\define@key{Gm}{luatex}[true]{\ifGm@preamble{luatex}{%
+ \Gm@doifelse{luatex}{#1}{\Gm@setdriver{luatex}}{\Gm@unsetdriver{luatex}}}}%
+\define@key{Gm}{xetex}[true]{\ifGm@preamble{xetex}{%
+ \Gm@doifelse{xetex}{#1}{\Gm@setdriver{xetex}}{\Gm@unsetdriver{xetex}}}}%
+\define@key{Gm}{vtex}[true]{\ifGm@preamble{vtex}{%
+ \Gm@doifelse{vtex}{#1}{\Gm@setdriver{vtex}}{\Gm@unsetdriver{vtex}}}}%
+% \end{macrocode}
+% \end{key}\end{key}\end{key}\end{key}\end{key}\end{key}\end{key}\end{key}
+% \begin{key}{Gm}{verbose}
+% The verbose mode.
+% \begin{macrocode}
+\define@key{Gm}{verbose}[true]{\ifGm@preamble{verbose}{\Gm@setbool{verbose}{#1}}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{reset}
+% The option cancels all the options specified before |reset|,
+% except |pass|. |mag| ($\neq1000$) with |truedimen| cannot be also
+% reset.
+% \begin{macrocode}
+\define@key{Gm}{reset}[true]{\ifGm@preamble{reset}{%
+ \Gm@doifelse{reset}{#1}{\Gm@restore@org\Gm@initall
+ \ProcessOptionsKV[c]{Gm}\Gm@setdefaultpaper}{}}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{resetpaper}
+% If |resetpaper| is set to |true|, the paper size redefined in the package
+% is discarded and the original one is restored. This option may be useful
+% to print nonstandard sized documents with normal printers and papers.
+% \begin{macrocode}
+\define@key{Gm}{resetpaper}[true]{\ifGm@preamble{resetpaper}{%
+ \Gm@setbool{resetpaper}{#1}}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{mag}
+% |mag| is expanded immediately when it is specified. So |reset| can't
+% reset |mag| when it is set with |truedimen|.
+% \begin{macrocode}
+\define@key{Gm}{mag}{\ifGm@preamble{mag}{\mag=#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{truedimen}
+% If |truedimen| is set to |true|, all of the internal
+% explicit dimensions is changed to \textit{true} dimensions,
+% e.g., |1in| is changed to |1truein|.
+% \begin{macrocode}
+\define@key{Gm}{truedimen}[true]{\ifGm@preamble{truedimen}{%
+ \Gm@doifelse{truedimen}{#1}{\let\Gm@truedimen\Gm@true}%
+ {\let\Gm@truedimen\@empty}}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{pass}
+% The option makes all the options specified ineffective except
+% verbose switch.
+% \begin{macrocode}
+\define@key{Gm}{pass}[true]{\ifGm@preamble{pass}{\Gm@setbool{pass}{#1}}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{showframe}
+% The showframe option prints page frames to help you understand
+% what the resulting layout is like.
+% \begin{macrocode}
+\define@key{Gm}{showframe}[true]{\Gm@setbool{showframe}{#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{key}{Gm}{showcrop}
+% The showcrop option prints crop marks at each corner of the layout area.
+% \begin{macrocode}
+\define@key{Gm}{showcrop}[true]{\Gm@setbool{showcrop}{#1}}%
+% \end{macrocode}
+% \end{key}
+% \begin{macro}{\Gm@setdefaultpaper}
+% The macro stores paper dimensions.
+% This macro should be called after |\ProcessOptionsKV[c]{Gm}|.
+% If the |landscape| option in |\documentclass| is
+% specified, the class immediately swaps the paper dimensions.
+% \begin{macrocode}
+\def\Gm@setdefaultpaper{%
+ \ifx\Gm@paper\@undefined
+ \Gm@setsize{paper}(\strip@pt\paperwidth,\strip@pt\paperheight){pt}%
+ \Gm@setsize{Gm@layout}(\strip@pt\paperwidth,\strip@pt\paperheight){pt}%
+ \Gm@swap@papersizefalse
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@adjustpaper}
+% The macro checks if paperwidth/height is larger than 0pt,
+% which is used in \cs{Gm@process}.
+% The paper dimensions can be swapped when paper orientation
+% is changed over by |landscape| and |portrait| options.
+% \begin{macrocode}
+\def\Gm@adjustpaper{%
+ \ifdim\paperwidth>\p@\else
+ \PackageError{geometry}{%
+ \string\paperwidth\space(\the\paperwidth) too short}{%
+ Set a paper type (e.g., `a4paper').}%
+ \fi
+ \ifdim\paperheight>\p@\else
+ \PackageError{geometry}{%
+ \string\paperheight\space(\the\paperheight) too short}{%
+ Set a paper type (e.g., `a4paper').}%
+ \fi
+ \ifGm@swap@papersize
+ \setlength\@tempdima{\paperwidth}%
+ \setlength\paperwidth{\paperheight}%
+ \setlength\paperheight{\@tempdima}%
+ \fi
+ \ifGm@layout\else
+ \setlength\Gm@layoutwidth{\paperwidth}%
+ \setlength\Gm@layoutheight{\paperheight}%
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@checkmp}
+% The macro checks whether or not the marginpars overrun the page.
+% \begin{macrocode}
+\def\Gm@checkmp{%
+ \ifGm@includemp\else
+ \@tempcnta\z@\@tempcntb\@ne
+ \if@twocolumn
+ \@tempcnta\@ne
+ \else
+ \if@reversemargin
+ \@tempcnta\@ne\@tempcntb\z@
+ \fi
+ \fi
+ \@tempdima\marginparwidth
+ \advance\@tempdima\marginparsep
+ \ifnum\@tempcnta=\@ne
+ \@tempdimc\@tempdima
+ \setlength\@tempdimb{\Gm@lmargin}%
+ \advance\@tempdimc-\@tempdimb
+ \ifdim\@tempdimc>\z@
+ \Gm@warning{The marginal notes overrun the paper edge.^^J
+ \@spaces Add \the\@tempdimc\space and more to the left margin}%
+ \fi
+ \fi
+ \ifnum\@tempcntb=\@ne
+ \@tempdimc\@tempdima
+ \setlength\@tempdimb{\Gm@rmargin}%
+ \advance\@tempdimc-\@tempdimb
+ \ifdim\@tempdimc>\z@
+ \Gm@warning{The marginal notes overrun the paper.^^J
+ \@spaces Add \the\@tempdimc\space and more to the right margin}%
+ \fi
+ \fi
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@adjustmp}
+% The macro sets marginpar correction when |includemp| is set,
+% which is used in \cs{Gm@process}. The variables \cs{Gm@wd@mp},
+% \cs{Gm@odd@mp} and \cs{Gm@even@mp} are set here.
+% Note that \cs{Gm@even@mp} should be used only for twoside layout.
+% \begin{macrocode}
+\def\Gm@adjustmp{%
+ \ifGm@includemp
+ \@tempdimb\marginparwidth
+ \advance\@tempdimb\marginparsep
+ \Gm@wd@mp\@tempdimb
+ \Gm@odd@mp\z@
+ \Gm@even@mp\z@
+ \if@twocolumn
+ \Gm@wd@mp2\@tempdimb
+ \Gm@odd@mp\@tempdimb
+ \Gm@even@mp\@tempdimb
+ \else
+ \if@reversemargin
+ \Gm@odd@mp\@tempdimb
+ \if@mparswitch\else
+ \Gm@even@mp\@tempdimb
+ \fi
+ \else
+ \if@mparswitch
+ \Gm@even@mp\@tempdimb
+ \fi
+ \fi
+ \fi
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@adjustbody}
+% If the horizontal dimension of \gpart{body} is specified by user,
+% \cs{Gm@width} is set properly here.
+% \begin{macrocode}
+\def\Gm@adjustbody{
+ \ifGm@hbody
+ \ifx\Gm@width\@undefined
+ \ifx\Gm@hscale\@undefined
+ \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}%
+ \else
+ \Gm@defbylen{width}{\Gm@hscale\Gm@layoutwidth}%
+ \fi
+ \fi
+ \ifx\Gm@textwidth\@undefined\else
+ \setlength\@tempdima{\Gm@textwidth}%
+ \ifGm@includemp
+ \advance\@tempdima\Gm@wd@mp
+ \fi
+ \edef\Gm@width{\the\@tempdima}%
+ \fi
+ \fi
+% \end{macrocode}
+% If the vertical dimension of \gpart{body} is specified by user,
+% \cs{Gm@height} is set properly here.
+% \begin{macrocode}
+ \ifGm@vbody
+ \ifx\Gm@height\@undefined
+ \ifx\Gm@vscale\@undefined
+ \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}%
+ \else
+ \Gm@defbylen{height}{\Gm@vscale\Gm@layoutheight}%
+ \fi
+ \fi
+ \ifx\Gm@lines\@undefined\else
+% \end{macrocode}
+% \cs{topskip} has to be adjusted so that the formula
+% ``$\cs{textheight} = (lines - 1) \times \cs{baselineskip} + \cs{topskip}$''
+% to be correct even if large font sizes are specified by users.
+% If \cs{topskip} is smaller than \cs{ht}\cs{strutbox}, then \cs{topskip}
+% is set to \cs{ht}\cs{strutbox}.
+% \begin{macrocode}
+ \ifdim\topskip<\ht\strutbox
+ \setlength\@tempdima{\topskip}%
+ \setlength\topskip{\ht\strutbox}%
+ \Gm@warning{\noexpand\topskip was changed from \the\@tempdima\space
+ to \the\topskip}%
+ \fi
+ \setlength\@tempdima{\baselineskip}%
+ \multiply\@tempdima\Gm@lines
+ \addtolength\@tempdima{\topskip}%
+ \addtolength\@tempdima{-\baselineskip}%
+ \edef\Gm@textheight{\the\@tempdima}%
+ \fi
+ \ifx\Gm@textheight\@undefined\else
+ \setlength\@tempdima{\Gm@textheight}%
+ \ifGm@includehead
+ \addtolength\@tempdima{\headheight}%
+ \addtolength\@tempdima{\headsep}%
+ \fi
+ \ifGm@includefoot
+ \addtolength\@tempdima{\footskip}%
+ \fi
+ \edef\Gm@height{\the\@tempdima}%
+ \fi
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@process}
+% The main macro processing the specified dimensions is defined.
+% \begin{macrocode}
+\def\Gm@process{%
+% \end{macrocode}
+% If |pass| is set, the original dimensions and switches are restored
+% and process is ended here.
+% \begin{macrocode}
+ \ifGm@pass
+ \Gm@restore@org
+ \else
+ \Gm@@process
+ \fi}%
+% \end{macrocode}
+% The main processing macro.
+% \begin{macrocode}
+\def\Gm@@process{%
+ \Gm@expandlengths
+ \Gm@adjustpaper
+ \addtolength\Gm@layoutwidth{-\Gm@bindingoffset}%
+ \Gm@adjustmp
+ \Gm@adjustbody
+ \Gm@detall{h}{width}{lmargin}{rmargin}%
+ \Gm@detall{v}{height}{tmargin}{bmargin}%
+% \end{macrocode}
+% The real dimensions are set properly according to the result
+% of the auto-completion calculation.
+% \begin{macrocode}
+ \setlength\textwidth{\Gm@width}%
+ \setlength\textheight{\Gm@height}%
+ \setlength\topmargin{\Gm@tmargin}%
+ \setlength\oddsidemargin{\Gm@lmargin}%
+ \addtolength\oddsidemargin{-1\Gm@truedimen in}%
+% \end{macrocode}
+% If |includemp| is set to |true|, \cs{textwidth} and \cs{oddsidemargin}
+% are adjusted.
+% \begin{macrocode}
+ \ifGm@includemp
+ \advance\textwidth-\Gm@wd@mp
+ \advance\oddsidemargin\Gm@odd@mp
+ \fi
+% \end{macrocode}
+% Determining \cs{evensidemargin}.
+% In the twoside page layout, the right margin value \cs{Gm@rmargin} is used.
+% If the marginal note width is included,
+% \cs{evensidemargin} should be corrected by \cs{Gm@even@mp}.
+% \begin{macrocode}
+ \if@mparswitch
+ \setlength\evensidemargin{\Gm@rmargin}%
+ \addtolength\evensidemargin{-1\Gm@truedimen in}%
+ \ifGm@includemp
+ \advance\evensidemargin\Gm@even@mp
+ \fi
+ \else
+ \evensidemargin\oddsidemargin
+ \fi
+% \end{macrocode}
+% The bindingoffset correction for \cs{oddsidemargin}.
+% \begin{macrocode}
+ \advance\oddsidemargin\Gm@bindingoffset
+ \addtolength\topmargin{-1\Gm@truedimen in}%
+% \end{macrocode}
+% If the head of the page is included in \gpart{total body},
+% \cs{headheight} and \cs{headsep} are removed from \cs{textheight},
+% otherwise from \cs{topmargin}.
+% \begin{macrocode}
+ \ifGm@includehead
+ \addtolength\textheight{-\headheight}%
+ \addtolength\textheight{-\headsep}%
+ \else
+ \addtolength\topmargin{-\headheight}%
+ \addtolength\topmargin{-\headsep}%
+ \fi
+% \end{macrocode}
+% If the foot of the page is included in \gpart{total body},
+% \cs{footskip} is removed from \cs{textheight}.
+% \begin{macrocode}
+ \ifGm@includefoot
+ \addtolength\textheight{-\footskip}%
+ \fi
+% \end{macrocode}
+% If |heightrounded| is set, \cs{textheight} is rounded.
+% \begin{macrocode}
+ \ifGm@heightrounded
+ \setlength\@tempdima{\textheight}%
+ \addtolength\@tempdima{-\topskip}%
+ \@tempcnta\@tempdima
+ \@tempcntb\baselineskip
+ \divide\@tempcnta\@tempcntb
+ \setlength\@tempdimb{\baselineskip}%
+ \multiply\@tempdimb\@tempcnta
+ \advance\@tempdima-\@tempdimb
+ \multiply\@tempdima\tw@
+ \ifdim\@tempdima>\baselineskip
+ \addtolength\@tempdimb{\baselineskip}%
+ \fi
+ \addtolength\@tempdimb{\topskip}%
+ \textheight\@tempdimb
+ \fi
+% \end{macrocode}
+% The paper width is set back by adding \cs{Gm@bindingoffset}.
+% \begin{macrocode}
+ \advance\oddsidemargin\Gm@layouthoffset%
+ \advance\evensidemargin\Gm@layouthoffset%
+ \advance\topmargin\Gm@layoutvoffset%
+ \addtolength\Gm@layoutwidth{\Gm@bindingoffset}%
+ }% end of \Gm@@process
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gm@detectdriver}
+% The macro checks the typeset environment and changes the driver option
+% if necessary. To make the engine detection more robust, the macro is
+% rewritten with packages \textsf{ifpdf}, \textsf{ifvtex} and
+% \textsf{ifxetex}.
+% \begin{macrocode}
+\def\Gm@detectdriver{%
+% \end{macrocode}
+% If the driver option is not specified explicitly, then driver
+% auto-detection works.
+% \begin{macrocode}
+ \ifx\Gm@driver\@empty
+ \typeout{*geometry* driver: auto-detecting}%
+% \end{macrocode}
+% \cs{ifpdf} is defined in \textsf{ifpdf} package in `oberdiek' bundle.
+% \begin{macrocode}
+ \ifpdf
+ \ifx\pdfextension\@undefined
+ \Gm@setdriver{pdftex}%
+ \else
+ \Gm@setdriver{luatex}%
+ \fi
+ \else
+ \Gm@setdriver{dvips}%
+ \fi
+% \end{macrocode}
+% \cs{ifvtex} is defined in \textsf{ifvtex} package in `oberdiek'
+% bundle.
+% \begin{macrocode}
+ \ifvtex
+ \Gm@setdriver{vtex}%
+ \fi
+% \end{macrocode}
+% \cs{ifxetex} is defined in \textsf{ifxetex} package written by
+% Will Robertson.
+% \begin{macrocode}
+ \ifxetex
+ \Gm@setdriver{xetex}
+ \fi
+% \end{macrocode}
+% When the driver option is set by the user, check if it is valid or not.
+% \begin{macrocode}
+ \else
+ \ifx\Gm@driver\Gm@xetex %%
+ \ifxetex\else
+ \Gm@warning{Wrong driver setting: `xetex'; trying `pdftex' driver}%
+ \Gm@setdriver{pdftex}
+ \fi
+ \fi
+ \ifx\Gm@driver\Gm@vtex
+ \ifvtex\else
+ \Gm@warning{Wrong driver setting: `vtex'; trying `dvips' driver}%
+ \Gm@setdriver{dvips}%
+ \fi
+ \fi
+ \fi
+ \ifx\Gm@driver\relax
+ \typeout{*geometry* detected driver: <none>}%
+ \else
+ \typeout{*geometry* detected driver: \Gm@driver}%
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@showparams}
+% Prints the resulted parammeters and dimensions to STDOUT
+% if |verbose| is true.
+% |\Gm@width| and |\Gm@height| are expanded to get the real size.
+% \begin{macrocode}
+\def\Gm@showparams#1{%
+ \ifGm@verbose\expandafter\typeout\else\expandafter\wlog\fi
+ {\Gm@logcontent{#1}}}%
+\def\Gm@showdim#1{* \string#1=\the#1^^J}%
+\def\Gm@showbool#1{\@nameuse{ifGm@#1}#1\space\fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@logcontent}
+% The content of geometry paramenters and native dimensions for the
+% page layout.
+% \begin{macrocode}
+\def\Gm@logcontent#1{%
+ *geometry* verbose mode - [ #1 ] result:^^J%
+ \ifGm@pass * pass: disregarded the geometry package!^^J%
+ \else
+ * driver: \if\Gm@driver<none>\else\Gm@driver\fi^^J%
+ * paper: \ifx\Gm@paper\@undefined<default>\else\Gm@paper\fi^^J%
+ * layout: \ifGm@layout<custom>\else<same size as paper>\fi^^J%
+ \ifGm@layout
+ * layout(width,height): (\the\Gm@layoutwidth,\the\Gm@layoutheight)^^J%
+ \fi
+ * layoutoffset:(h,v)=(\the\Gm@layouthoffset,\the\Gm@layoutvoffset)^^J%
+ \@ifundefined{Gm@lines}{}{* lines: \Gm@lines^^J}%
+ \@ifundefined{Gm@hmarginratio}{}{* hratio: \Gm@hmarginratio^^J}%
+ \@ifundefined{Gm@vmarginratio}{}{* vratio: \Gm@vmarginratio^^J}%
+ \ifdim\Gm@bindingoffset=\z@\else
+ * bindingoffset: \the\Gm@bindingoffset^^J\fi
+ * modes: %
+ \Gm@showbool{landscape}%
+ \Gm@showbool{includehead}%
+ \Gm@showbool{includefoot}%
+ \Gm@showbool{includemp}%
+ \if@twoside twoside\space\fi%
+ \if@mparswitch\else\if@twoside asymmetric\space\fi\fi%
+ \Gm@showbool{heightrounded}%
+ \ifx\Gm@truedimen\@empty\else truedimen\space\fi%
+ \Gm@showbool{showframe}%
+ \Gm@showbool{showcrop}%
+ ^^J%
+ * h-part:(L,W,R)=(\Gm@lmargin, \Gm@width, \Gm@rmargin)^^J%
+ * v-part:(T,H,B)=(\Gm@tmargin, \Gm@height, \Gm@bmargin)^^J%
+ \fi
+ \Gm@showdim{\paperwidth}%
+ \Gm@showdim{\paperheight}%
+ \Gm@showdim{\textwidth}%
+ \Gm@showdim{\textheight}%
+ \Gm@showdim{\oddsidemargin}%
+ \Gm@showdim{\evensidemargin}%
+ \Gm@showdim{\topmargin}%
+ \Gm@showdim{\headheight}%
+ \Gm@showdim{\headsep}%
+ \Gm@showdim{\topskip}%
+ \Gm@showdim{\footskip}%
+ \Gm@showdim{\marginparwidth}%
+ \Gm@showdim{\marginparsep}%
+ \Gm@showdim{\columnsep}%
+ * \string\skip\string\footins=\the\skip\footins^^J%
+ \Gm@showdim{\hoffset}%
+ \Gm@showdim{\voffset}%
+ \Gm@showdim{\mag}%
+ * \string\@twocolumn\if@twocolumn true\else false\fi^^J%
+ * \string\@twoside\if@twoside true\else false\fi^^J%
+ * \string\@mparswitch\if@mparswitch true\else false\fi^^J%
+ * \string\@reversemargin\if@reversemargin true\else false\fi^^J%
+ * (1in=72.27pt=25.4mm, 1cm=28.453pt)^^J}%
+% \end{macrocode}
+% \end{macro}
+%
+% Macros for the page frames and cropmarks.
+% \begin{macrocode}
+\def\Gm@cropmark(#1,#2,#3,#4){%
+ \begin{picture}(0,0)
+ \setlength\unitlength{1truemm}%
+ \linethickness{0.25pt}%
+ \put(#3,0){\line(#1,0){17}}%
+ \put(0,#4){\line(0,#2){17}}%
+ \end{picture}}%
+\providecommand*\vb@xt@{\vbox to}%
+\def\Gm@vrule{\vrule width 0.2pt height\textheight depth\z@}%
+\def\Gm@hrule{\hrule height 0.2pt depth\z@ width\textwidth}%
+\def\Gm@hruled{\hrule height\z@ depth0.2pt width\textwidth}%
+\newcommand*{\Gm@vrules@mpi}{%
+ \hb@xt@\@tempdima{\llap{\Gm@vrule}\ignorespaces
+ \hskip \textwidth\Gm@vrule\hskip \marginparsep
+ \llap{\Gm@vrule}\hfil\Gm@vrule}}%
+\newcommand*{\Gm@vrules@mpii}{%
+ \hb@xt@\@tempdima{\hskip-\marginparwidth\hskip-\marginparsep
+ \llap{\Gm@vrule}\ignorespaces
+ \hskip \marginparwidth\rlap{\Gm@vrule}\hskip \marginparsep
+ \llap{\Gm@vrule}\hskip\textwidth\rlap{\Gm@vrule}\hss}}%
+\newcommand*{\Gm@pageframes}{%
+ \vb@xt@\z@{%
+ \ifGm@showcrop
+ \vb@xt@\z@{\vskip-1\Gm@truedimen in\vskip\Gm@layoutvoffset%
+ \hb@xt@\z@{\hskip-1\Gm@truedimen in\hskip\Gm@layouthoffset%
+ \vb@xt@\Gm@layoutheight{%
+ \let\protect\relax
+ \hb@xt@\Gm@layoutwidth{\Gm@cropmark(-1,1,-3,3)\hfil\Gm@cropmark(1,1,3,3)}%
+ \vfil
+ \hb@xt@\Gm@layoutwidth{\Gm@cropmark(-1,-1,-3,-3)\hfil\Gm@cropmark(1,-1,3,-3)}}%
+ \hss}%
+ \vss}%
+ \fi%
+ \ifGm@showframe
+ \if@twoside
+ \ifodd\count\z@
+ \let\@themargin\oddsidemargin
+ \else
+ \let\@themargin\evensidemargin
+ \fi
+ \fi
+ \moveright\@themargin%
+ \vb@xt@\z@{%
+ \vskip\topmargin\vb@xt@\z@{\vss\Gm@hrule}%
+ \vskip\headheight\vb@xt@\z@{\vss\Gm@hruled}%
+ \vskip\headsep\vb@xt@\z@{\vss\Gm@hrule}%
+ \@tempdima\textwidth
+ \advance\@tempdima by \marginparsep
+ \advance\@tempdima by \marginparwidth
+ \if@mparswitch
+ \ifodd\count\z@
+ \Gm@vrules@mpi
+ \else
+ \Gm@vrules@mpii
+ \fi
+ \else
+ \Gm@vrules@mpi
+ \fi
+ \vb@xt@\z@{\vss\Gm@hrule}%
+ \vskip\footskip\vb@xt@\z@{\vss\Gm@hruled}%
+ \vss}%
+ \fi%
+ }}%
+% \end{macrocode}
+%
+% \begin{macro}{\ProcessOptionsKV}
+% This macro can process class and package options using `key=value'
+% scheme. Only class options are processed with an optional argument
+% `|c|', package options with `|p|' , and both of them by default.
+% \begin{macrocode}
+\def\ProcessOptionsKV{\@ifnextchar[%]
+ {\@ProcessOptionsKV}{\@ProcessOptionsKV[]}}%
+\def\@ProcessOptionsKV[#1]#2{%
+ \let\@tempa\@empty
+ \@tempcnta\z@
+ \if#1p\@tempcnta\@ne\else\if#1c\@tempcnta\tw@\fi\fi
+ \ifodd\@tempcnta
+ \edef\@tempa{\@ptionlist{\@currname.\@currext}}%
+ \else
+ \@for\CurrentOption:=\@classoptionslist\do{%
+ \@ifundefined{KV@#2@\CurrentOption}%
+ {}{\edef\@tempa{\@tempa,\CurrentOption,}}}%
+ \ifnum\@tempcnta=\z@
+ \edef\@tempa{\@tempa,\@ptionlist{\@currname.\@currext}}%
+ \fi
+ \fi
+ \edef\@tempa{\noexpand\setkeys{#2}{\@tempa}}%
+ \@tempa
+ \AtEndOfPackage{\let\@unprocessedoptions\relax}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\def\Gm@setkeys{\setkeys{Gm}}%
+% \end{macrocode}
+% \begin{macro}{\Gm@processconf}
+% \cs{ExecuteOptions} is replaced with \cs{Gm@setkey} to make it
+% possible to deal with '\meta{key}=\meta{value}' as its argument.
+% \begin{macrocode}
+\def\Gm@processconfig{%
+ \let\Gm@origExecuteOptions\ExecuteOptions
+ \let\ExecuteOptions\Gm@setkeys
+ \InputIfFileExists{geometry.cfg}{}{}
+ \let\ExecuteOptions\Gm@origExecuteOptions}%
+% \end{macrocode}
+% \end{macro}
+%
+% The original page layout before loading \Gm\ is saved here.
+% |\Gm@restore@org| is defined here for |reset| option.
+% \begin{macrocode}
+\Gm@save
+\edef\Gm@restore@org{\Gm@restore}%
+\Gm@initall
+% \end{macrocode}
+% Processing config file.
+% \begin{macrocode}
+\Gm@processconfig
+% \end{macrocode}
+% The optional arguments to \cs{documentclass} are processed here.
+% \begin{macrocode}
+\ProcessOptionsKV[c]{Gm}%
+% \end{macrocode}
+% Paper dimensions given by class default are stored.
+% \begin{macrocode}
+\Gm@setdefaultpaper
+% \end{macrocode}
+% The optional arguments to \cs{usepackage} are processed here.
+% \begin{macrocode}
+\ProcessOptionsKV[p]{Gm}%
+% \end{macrocode}
+% Actual settings and calculation for layout dimensions are processed.
+% \begin{macrocode}
+\Gm@process
+% \end{macrocode}
+%
+% \begin{macro}{\AtBeginDocument}
+% The processes for |verbose|, |showframe| and drivers are added to
+% |\AtBeginDocument|.
+% |\Gm@restore@org| is redefined here with the paper size specified
+% in the preamble for |\newgeometry| to use it. This should be done
+% before magnifying the paper size with |\mag| because the layout
+% calculation would be affected by changing the paper size.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \Gm@savelength{paperwidth}%
+ \Gm@savelength{paperheight}%
+ \edef\Gm@restore@org{\Gm@restore}%
+% \end{macrocode}
+% The original paper size is used if |resetpaper|.
+% \begin{macrocode}
+ \ifGm@resetpaper
+ \edef\Gm@pw{\Gm@orgpw}%
+ \edef\Gm@ph{\Gm@orgph}%
+ \else
+ \edef\Gm@pw{\the\paperwidth}%
+ \edef\Gm@ph{\the\paperheight}%
+ \fi
+% \end{macrocode}
+% If |pass| is not set, the paper size is multiplied
+% according to the specified |mag|.
+% \begin{macrocode}
+ \ifGm@pass\else
+ \ifnum\mag=\@m\else
+ \Gm@magtooffset
+ \divide\paperwidth\@m
+ \multiply\paperwidth\the\mag
+ \divide\paperheight\@m
+ \multiply\paperheight\the\mag
+ \fi
+ \fi
+% \end{macrocode}
+% Checking the driver options.
+% \begin{macrocode}
+ \Gm@detectdriver
+% \end{macrocode}
+% If |xetex| and |\pdfpagewidth| is defined,
+% |\pdfpagewidth| and |\pdfpageheight| would be set.
+% \begin{macrocode}
+ \ifx\Gm@driver\Gm@xetex
+ \@ifundefined{pdfpagewidth}{}{%
+ \setlength\pdfpagewidth{\Gm@pw}%
+ \setlength\pdfpageheight{\Gm@ph}}%
+ \ifnum\mag=\@m\else
+ \ifx\Gm@truedimen\Gm@true
+ \setlength\paperwidth{\Gm@pw}%
+ \setlength\paperheight{\Gm@ph}%
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% If |pdftex| is set to |true|, pdf-commands are set properly.
+% To avoid |pdftex| magnification problem, \cs{pdfhorigin} and
+% \cs{pdfvorigin} are adjusted for \cs{mag}.
+% \begin{macrocode}
+ \ifx\Gm@driver\Gm@pdftex
+ \@ifundefined{pdfpagewidth}{}{%
+ \setlength\pdfpagewidth{\Gm@pw}%
+ \setlength\pdfpageheight{\Gm@ph}}%
+ \ifnum\mag=\@m\else
+ \@tempdima=\mag sp
+ \@ifundefined{pdfhorigin}{}{%
+ \divide\pdfhorigin\@tempdima
+ \multiply\pdfhorigin\@m
+ \divide\pdfvorigin\@tempdima
+ \multiply\pdfvorigin\@m}%
+ \ifx\Gm@truedimen\Gm@true
+ \setlength\paperwidth{\Gm@pw}%
+ \setlength\paperheight{\Gm@ph}%
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% If |luatex| is set to |true|, pdf-commands are set properly.
+% To avoid |luatex| magnification problem, \cs{horigin} and
+% \cs{vorigin} are adjusted for \cs{mag}.
+% \begin{macrocode}
+ \ifx\Gm@driver\Gm@luatex
+ \setlength\pagewidth{\Gm@pw}%
+ \setlength\pageheight{\Gm@ph}%
+ \ifnum\mag=\@m\else
+ \@tempdima=\mag sp
+ \edef\Gm@horigin{\pdfvariable horigin}%
+ \edef\Gm@vorigin{\pdfvariable vorigin}%
+ \divide\Gm@horigin\@tempdima
+ \multiply\Gm@horigin\@m
+ \divide\Gm@vorigin\@tempdima
+ \multiply\Gm@vorigin\@m
+ \ifx\Gm@truedimen\Gm@true
+ \setlength\paperwidth{\Gm@pw}%
+ \setlength\paperheight{\Gm@ph}%
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% With V\TeX{} environment, V\TeX{} variables are set here.
+% \begin{macrocode}
+ \ifx\Gm@driver\Gm@vtex
+ \@ifundefined{mediawidth}{}{%
+ \mediawidth=\paperwidth
+ \mediaheight=\paperheight}%
+ \ifvtexdvi
+ \AtBeginDvi{\special{papersize=\the\paperwidth,\the\paperheight}}%
+ \fi
+ \fi
+% \end{macrocode}
+% If |dvips| or |dvipdfm| is specified, paper size is embedded in dvi
+% file with \cs{special}. For dvips, a landscape correction is added
+% because a landscape document converted by dvips is upside-down in
+% PostScript viewers.
+% \begin{macrocode}
+ \ifx\Gm@driver\Gm@dvips
+ \AtBeginDvi{\special{papersize=\the\paperwidth,\the\paperheight}}%
+ \ifx\Gm@driver\Gm@dvips\ifGm@landscape
+ \AtBeginDvi{\special{! /landplus90 true store}}%
+ \fi\fi
+% \end{macrocode}
+% If |dvipdfm| is specified and \textsf{atbegshi} package in
+% `oberdiek' bundle is loaded, \cs{AtBeginShipoutFirst} is used
+% instead of \cs{AtBeginDvi} for compatibility with \textsf{hyperref}
+% and |dvipdfm| program.
+% \begin{macrocode}
+ \else\ifx\Gm@driver\Gm@dvipdfm
+ \ifcase\ifx\AtBeginShipoutFirst\relax\@ne\else
+ \ifx\AtBeginShipoutFirst\@undefined\@ne\else\z@\fi\fi
+ \AtBeginShipoutFirst{\special{papersize=\the\paperwidth,\the\paperheight}}%
+ \or
+ \AtBeginDvi{\special{papersize=\the\paperwidth,\the\paperheight}}%
+ \fi
+ \fi\fi
+% \end{macrocode}
+% Page frames are shipped out when |showframe=true|, cropmarks for |showcrop=true|
+% on each page. The \textsf{atbegshi} package is used for overloading |\shipout|.
+% \begin{macrocode}
+ \@tempswafalse
+ \ifGm@showframe
+ \@tempswatrue
+ \else\ifGm@showcrop
+ \@tempswatrue
+ \fi\fi
+ \if@tempswa
+ \RequirePackage{atbegshi}%
+ \AtBeginShipout{\setbox\AtBeginShipoutBox=\vbox{%
+ \baselineskip\z@skip\lineskip\z@skip\lineskiplimit\z@
+ \Gm@pageframes\box\AtBeginShipoutBox}}%
+ \fi
+% \end{macrocode}
+% The layout dimensions for \cs{restoregeometry} are saved
+% at the end of the \cs{AtBeginDocument}.
+% \begin{macrocode}
+ \Gm@save
+ \edef\Gm@restore@pkg{\Gm@restore}%
+% \end{macrocode}
+% The package checks whether or not the marginpars overrun the page,
+% if |verbose| and unless |pass|.
+% \begin{macrocode}
+ \ifGm@verbose\ifGm@pass\else\Gm@checkmp\fi\fi
+% \end{macrocode}
+% |\Gm@showparams| puts the resulting parameters and dimensions
+% into the log file. With |verbose|, they are shown on the terminal
+% as well.
+% \begin{macrocode}
+ \Gm@showparams{preamble}%
+% \end{macrocode}
+% The following lines free the memories no longer needed.
+% \begin{macrocode}
+ \let\Gm@pw\relax
+ \let\Gm@ph\relax
+ }% end of \AtBeginDocument
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\geometry}
+% The macro \cs{geometry} can be called multiple times
+% in the preamble (before |\begin{document}|).
+% \begin{macrocode}
+\newcommand{\geometry}[1]{%
+ \Gm@clean
+ \setkeys{Gm}{#1}%
+ \Gm@process}%
+\@onlypreamble\geometry
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Gm@changelayout}
+% The macro, which can be called from |\newgeometry|,
+% |\restoregeometry| and |\loadgeometry|, changes the layout
+% in the middle of the document.
+% \begin{macrocode}
+\DeclareRobustCommand\Gm@changelayout{%
+ \setlength{\@colht}{\textheight}
+ \setlength{\@colroom}{\textheight}%
+ \setlength{\vsize}{\textheight}
+ \setlength{\columnwidth}{\textwidth}%
+ \if@twocolumn%
+ \advance\columnwidth-\columnsep
+ \divide\columnwidth\tw@%
+ \@firstcolumntrue%
+ \fi%
+ \setlength{\hsize}{\columnwidth}%
+ \setlength{\linewidth}{\hsize}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\newgeometry}
+% The macro |\newgeometry|, which changes the layout,
+% can be used only in the document.
+% It would reset the options specified in the preamble except for
+% paper size options and |\mag|.
+% \begin{macrocode}
+\newcommand{\newgeometry}[1]{%
+ \clearpage
+ \Gm@restore@org
+ \Gm@initnewgm
+ \Gm@newgmtrue
+ \setkeys{Gm}{#1}%
+ \Gm@newgmfalse
+ \Gm@process
+ \ifnum\mag=\@m\else\Gm@magtooffset\fi
+ \Gm@changelayout
+ \Gm@showparams{newgeometry}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\restoregeometry}
+% The macro restores the resulting layout specified in the preamble,
+% namely the first-page layout right after |\begin{document}|.
+% \begin{macrocode}
+\newcommand{\restoregeometry}{%
+ \clearpage
+ \Gm@restore@pkg
+ \Gm@changelayout}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\savegeometry}
+% The macro saves the layout with the name specified
+% with the argument. The saved layout can be loaded
+% with |\loadgeometry{|\meta{name}|}|.
+% \begin{macrocode}
+\newcommand*{\savegeometry}[1]{%
+ \Gm@save
+ \expandafter\edef\csname Gm@restore@@#1\endcsname{\Gm@restore}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\loadgeometry}
+% The macro loads the layout saved with |\savegeometry{|\meta{name}|}|.
+% If the name is not found, the macro would warn it and
+% do nothing for the layout.
+% \begin{macrocode}
+\newcommand*{\loadgeometry}[1]{%
+ \clearpage
+ \@ifundefined{Gm@restore@@#1}{%
+ \PackageError{geometry}{%
+ \string\loadgeometry : name `#1' undefined}{%
+ The name `#1' should be predefined with \string\savegeometry}%
+ }{\@nameuse{Gm@restore@@#1}%
+ \Gm@changelayout}}%
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Config file}
+% In the configuration file |geometry.cfg|, one can use
+% \cs{ExecuteOptions} to set the site or user default settings.
+% \begin{macrocode}
+%<*config>
+%<<SAVE_INTACT
+
+% Uncomment and edit the line below to set default options.
+%\ExecuteOptions{a4paper}
+
+%SAVE_INTACT
+%</config>
+% \end{macrocode}
+%
+% \section{Sample file}
+% Here is a sample document for the \Gm\ package.
+% \begin{macrocode}
+%<*samples>
+%<<SAVE_INTACT
+\documentclass[12pt]{article}% uses letterpaper by default
+% \documentclass[12pt,a4paper]{article}% for A4 paper
+%---------------------------------------------------------------
+% Edit and uncomment one of the settings below
+%---------------------------------------------------------------
+% \usepackage{geometry}
+% \usepackage[centering]{geometry}
+% \usepackage[width=10cm,vscale=.7]{geometry}
+% \usepackage[margin=1cm, papersize={12cm,19cm}, resetpaper]{geometry}
+% \usepackage[margin=1cm,includeheadfoot]{geometry}
+\usepackage[margin=1cm,includeheadfoot,includemp]{geometry}
+% \usepackage[margin=1cm,bindingoffset=1cm,twoside]{geometry}
+% \usepackage[hmarginratio=2:1, vmargin=2cm]{geometry}
+% \usepackage[hscale=0.5,twoside]{geometry}
+% \usepackage[hscale=0.5,asymmetric]{geometry}
+% \usepackage[hscale=0.5,heightrounded]{geometry}
+% \usepackage[left=1cm,right=4cm,top=2cm,includefoot]{geometry}
+% \usepackage[lines=20,left=2cm,right=6cm,top=2cm,twoside]{geometry}
+% \usepackage[width=15cm, marginparwidth=3cm, includemp]{geometry}
+% \usepackage[hdivide={1cm,,2cm}, vdivide={3cm,8in,}, nohead]{geometry}
+% \usepackage[headsep=20pt, head=40pt,foot=20pt,includeheadfoot]{geometry}
+% \usepackage[text={6in,8in}, top=2cm, left=2cm]{geometry}
+% \usepackage[centering,includemp,twoside,landscape]{geometry}
+% \usepackage[mag=1414,margin=2cm]{geometry}
+% \usepackage[mag=1414,margin=2truecm,truedimen]{geometry}
+% \usepackage[a5paper, landscape, twocolumn, twoside,
+% left=2cm, hmarginratio=2:1, includemp, marginparwidth=43pt,
+% bottom=1cm, foot=.7cm, includefoot, textheight=11cm, heightrounded,
+% columnsep=1cm,verbose]{geometry}
+%---------------------------------------------------------------
+% No need to change below
+%---------------------------------------------------------------
+\geometry{verbose,showframe}% the options appended.
+\usepackage{lipsum}% for dummy text of 150 paragraphs
+\newcommand\mynote{\marginpar[\raggedright
+A sample margin note in the left side.]%
+{\raggedright A sample margin note.}}%
+\newcommand\myfootnote{\footnote{This is a sample footnote text.}}
+\begin{document}
+\lipsum[1-2]\mynote\lipsum[3-4]\mynote
+\lipsum[5-11]\mynote\lipsum[12]\myfootnote
+\lipsum[13-22]\mynote\lipsum[23-32]
+\end{document}
+%SAVE_INTACT
+%</samples>
+% \end{macrocode}
+%
+% \Finale
+%
+\endinput
diff --git a/macros/latex/contrib/geometry/geometry.pdf b/macros/latex/contrib/geometry/geometry.pdf
new file mode 100644
index 0000000000..66f3c55c4e
--- /dev/null
+++ b/macros/latex/contrib/geometry/geometry.pdf
Binary files differ