From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/genmpage/genmpage.dtx | 352 +++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 macros/latex/contrib/genmpage/genmpage.dtx (limited to 'macros/latex/contrib/genmpage/genmpage.dtx') diff --git a/macros/latex/contrib/genmpage/genmpage.dtx b/macros/latex/contrib/genmpage/genmpage.dtx new file mode 100644 index 0000000000..2b8019bb61 --- /dev/null +++ b/macros/latex/contrib/genmpage/genmpage.dtx @@ -0,0 +1,352 @@ +% \iffalse +%% +%% +%% Copyright (C) 2001-2006 Thomas Lotze +%% +%% This file may be distributed under the terms of the LaTeX Project +%% Public License, as described in lppl.txt in the base LaTeX +%% distribution. Either version 1.3c or, at your option, any later +%% version. +%% +%<*dtx> + \ProvidesFile{genmpage.dtx} + [2006/09/16 Generalized minipage environment (Thomas Lotze)] +% +%\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{genmpage}[2006/09/16 Generalized minipage environment (Thomas Lotze)] +%\RequirePackage{keyval} +% \ProvidesFile{genmpage.drv} +% \fi +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage{genmpage} +\addtolength{\oddsidemargin}{-1cm} +\addtolength{\textwidth}{2cm} +\begin{document} +\DocInput{genmpage.dtx} +\end{document} +% +% \fi +% +% \GetFileInfo{genmpage.dtx} +% +% \changes{v0.3.1}{2006/09/16} +% {Some changes to the doc, bumping license to 1.3c.} +% \changes{v0.3}{2001/02/16} +% {Addition of |parindent| and |keepparindent| as well as vertical +% alignment options |T| and |B|. Some changes to the doc.} +% \changes{v0.2}{2001/01/23} +% {\LaTeX's minipages replaced, minipage parameters accessible as keys, documentation} +% \changes{v0.1}{2001/01/16} +% {Initial version} +% \marginparsep0pt +% +% \MakeShortVerb{|} +% +% \title{The |genmpage| Package\\-- Generalized minipages --} +% \author{Thomas Lotze} +% \date{\filedate} +% \maketitle +% +% \section{Introduction} +% +% The purpose of this small package is to make \LaTeX's minipages +% more flexible. It is now possible to define styles which determine +% many of the design parameters of a minipage. Such styles can be +% used by calling the |minipage| environment with an additional +% optional argument. +% +% The issue arose from a usenet discussion in |de.comp.text.tex|: +% someone needed to typeset the content of all minipages in a +% document |\raggedright| when he switched to |\raggedright| +% typesetting of the document's body text. This normally +% requires either placing a |\raggedright| in every |minipage| +% environment (which is tedious, error-prone, and has little to +% do with logical mark-up), or defining a new environment (which +% is impractical for everyday use because of the optional argument +% structure of the |minipage| environment). +% +% Other than the justification of a minipage's contents, the +% minipage styles introduced by this package can be used to preset +% its font parameters (family, series, shape, size), the horizontal +% and vertical minipage size, the inner and outer vertical +% alignment parameters, and the indentation of paragraphs. +% Furthermore, two options for the vertical alignment are +% introduced in order to align adjacent minipages with respect +% to their real (visual) top and bottom margins. +% +% The |genmpage| package has been written for \LaTeXe. As the +% published experimental code for \LaTeX\ 3 shows, there will +% be the concept of templates which might well +% render this package useless. At least, it will be both +% necessary and convenient to re-implement it in terms of +% templates. +% +% Please feel free to send suggestions, bug reports, or any +% comments whatsoever concerning this package and its documentation +% to the author at |thomas@thomas-lotze.de|, or via usenet news +% in |de.comp.text.tex| or |comp.text.tex|. The package is developed in a +% subversion repository at +% |https://svn.thomas-lotze.de/repos/public/genmpage/|, releases being +% published on the CTAN. +% +% \section{Usage} +% +% As already mentioned, the |minipage| environment as redefined +% by the |genmpage| package takes another optional argument +% which contains the new parameter settings. In order to preserve +% the argument structure of the usual |minipage| environment, +% this new optional argument comes last. This way, if the +% |genmpage| package is loaded but no values are preset, a +% |minipage| environment without the new argument acts exactly +% as if the package was not present in the first place. +% +% \subsection{Keys} +% +% The new argument is evaluated as a |key=value| list. The usual +% requirements of the |keyval| package hold. The following keys +% are defined: +% +% \begin{description} +% +% \item[|flush|, |raggedright|, |RaggedRight|, |raggedleft|, |center|:] +% These keys are given without values and determine the +% justification of the minipages contents in the obvious way. +% If |RaggedRight| is used, the |ragged2e| package must be +% loaded. This is not provided for by the |genmpage| package. +% +% \item[|ffamily|, |fseries|, |fshape|:] +% These keys determine the font family, series, and shape of +% the text inside the minipage. They must be given the same +% values as the corresponding |NFSS| commands |\fontfamily|, +% |\fontseries|, and |\fontshape|, resp. +% +% \item[|resetfont|:] +% This key doesn't require a value. If it is given, a +% |\normalfont| is issued before the other font selection +% commands. +% +% \item[|fsize|:] +% A key to determine the font size. Possible values are the +% usual size commands without the backslash, e.g.\@ +% |fsize=small|. +% +% \item[|width|, |height|, |outer|, |inner|:] +% Width, height, and outer and inner vertical alignment of +% the minipage (taken as values to these keys). If these keys +% are set, either directly in the optional argument of the +% |minipage| environment, in the preamble, or by using styles +% (see below), they override the values given by the usual +% |minipage| arguments. +% +% \item[|widtharg|, |heightarg|, |outerarg|, |innerarg|:] +% Not requiring values, these keys stop the respective keys +% for width, height, and alignment from taking precedence +% over the usual |minipage| arguments. +% +% \item[|parindent|, |keepparindent|:] +% \LaTeX\ sets |\parindent| to zero within a minipage. +% If the |parindent| key is set, its value is used for +% |\parindent| instead. This value can be any \LaTeX\ length. +% If |keepparindent| is set (without values), the paragraph +% indentation valid outside the minipage is also used within. +% +% \end{description} +% +% Other than in the new optional argument of the |minipage| +% environment, all keys can be set by the |keyval| command +% |\setkeys|, for instance: +% +% \medskip +% |\setkeys{GenMP}{height=0.3\textheight,resetfont,fshape=it,inner=s}| +% \medskip +% +% \subsection{New options for vertical alignment} +% +% Following a suggestion by Donald Arseneau (thanks!), I've +% introduced two new options for the outer vertical alignment +% of minipages. With the options |T| and |B|, minipages are +% aligned with respect to their visual margins as opposed to +% the baselines of the first or last line of text, resp. This +% will come in most handy if a minipage starts with an image. +% +% As the |genmpage| package doesn't try to fiddle with \LaTeX's +% way of digesting alignment options, it recognizes the |T| and +% |B| options, inserts a |\vspace{0pt}| command at the beginning +% or end of the minipage, and passes on a |t| or |b| option. +% Therefore, |T| and |B| can only be used as values to the +% |genmpage| package's |inner| key but not as one of the +% traditional alignment arguments of minipages. +% +% \subsection{Styles} +% +% \DescribeMacro +% \defineMPstyle\marg{style}\marg{definitions}\\ +% A minipage style is more or less a shorthand for a series +% of |key=value| (or |key|) definitions. Any minipage style +% defined by |\defineMPstyle| can be used as a key without a +% value either in the |minipage| argument, |setkey| commands, +% or even other style definitions. |\defineMPstyle| silently +% redefines a style already existent. An example: +% +% \medskip +% |\defineMPstyle{comment}{resetfont,fsize=small,width=0.2\textwidth}| +% \medskip +% +% There is one style predefined: |\defineMPstyle}{plain}{}|. +% The |plain| style is called before all other definitions. +% Redefining it will change the behaviour of all minipages +% concerning those parameters which are not set either explicitly +% or by using a style or |setkeys| command. As \TeX\ knows no +% command for switching back to justified text, things like +% |\raggedright| cannot be overridden later and should therefore +% be used in the |plain| style with great care. +% +% \section{To do} +% +% \begin{itemize} +% \item +% Further testing +% \item +% Improving the documentation, in particular including a section +% with usage examples +% \item +% Implementing some frame and color features +% \end{itemize} +% +% \section{Implementation} +% +% \begin{macrocode} +\newlength\@GenMPparindent + +\def\@iiiminipage#1#2[#3]#4{% + \@ifnextchar[% + {\@ivminipage{#1}{#2}{#3}{#4}} + {\@ivminipage{#1}{#2}{#3}{#4}[]}} + +\def\@ivminipage#1#2#3#4[#5]{% + \setkeys{GenMP}{plain,#5}% + \if@GenMPwidth\else\@GenMPwidth#4\fi + \if@GenMPheight\else + \def\@GenMPtempa{#2}\def\@GenMPtempb{\relax}% + \ifx\@GenMPtempa\@GenMPtempb% + \let\@GenMPheight=\relax + \else + \def\@GenMPheight{#2}% + \fi + \fi + \if@GenMPouter\else\def\@GenMPouter{#1}\fi% + \if@GenMPinner\else\def\@GenMPinner{#3}\fi% + \@GenMPparindent\parindent + \leavevmode + \@pboxswfalse + \@tempdima\@GenMPwidth + \def\@mpargs{{\@GenMPouter}{\@GenMPheight}[\@GenMPinner]{\@GenMPwidth}}% + \setbox\@tempboxa\vbox\bgroup + \color@begingroup + \hsize\@tempdima + \textwidth\hsize \columnwidth\hsize + \@parboxrestore + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + \let\@footnotetext\@mpfootnotetext + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage} + +\def\@setminipage{% + \@minipagetrue + \@GenMPtop + \@GenMPflush + \@GenMPresetfont + \@GenMPffamily\@GenMPfseries\@GenMPfshape\selectfont + \@GenMPfsize + \@GenMPsetpi + \everypar{\@minipagefalse\everypar{}}} + +\let\@GenMPendminipage\endminipage +\def\endminipage{% + \@GenMPbottom + \@GenMPendminipage} + +\let\@GenMPflush=\relax +\define@key{GenMP}{flush}[]{\let\@GenMPflush=\relax} +\define@key{GenMP}{raggedright}[]{\let\@GenMPflush=\raggedright} +\define@key{GenMP}{RaggedRight}[]{\let\@GenMPflush=\RaggedRight} +\define@key{GenMP}{raggedleft}[]{\let\@GenMPflush=\raggedleft} +\define@key{GenMP}{center}[]{\let\@GenMPflush=\centering} + +\let\@GenMPffamily=\relax +\let\@GenMPfseries=\relax +\let\@GenMPfshape=\relax +\let\@GenMPresetfont=\relax +\let\@GenMPfsize=\relax +\define@key{GenMP}{ffamily}{\def\@GenMPffamily{\fontfamily{#1}}} +\define@key{GenMP}{fseries}{\def\@GenMPfseries{\fontseries{#1}}} +\define@key{GenMP}{fshape}{\def\@GenMPfshape{\fontshape{#1}}} +\define@key{GenMP}{resetfont}[true]{% + \def\@GenMPread{#1}\def\@GenMPtempa{true}% + \ifx\@GenMPread\@GenMPtempa% + \let\@GenMPresetfont=\normalfont + \else + \let\@GenMPresetfont=\relax + \fi} +\define@key{GenMP}{fsize}{\def\@GenMPfsize{\csname #1\endcsname}} + +\let\@GenMPsetpi=\relax +\define@key{GenMP}{keepparindent}[true]{% + \def\@GenMPread{#1}\def\@GenMPtempa{true}% + \ifx\@GenMPread\@GenMPtempa% + \def\@GenMPsetpi{\parindent\@GenMPparindent}% + \fi} +\define@key{GenMP}{parindent}{\def\@GenMPsetpi{\parindent#1}} + +\newlength\@GenMPwidth +\newif\if@GenMPwidth +\let\if@GenMPwidth\iffalse +\define@key{GenMP}{width}{\let\if@GenMPwidth\iftrue\@GenMPwidth#1} +\define@key{GenMP}{widtharg}[]{\let\if@GenMPwidth\iffalse} +\newif\if@GenMPheight +\let\if@GenMPheight\iffalse +\define@key{GenMP}{height}{\let\if@GenMPheight\iftrue\def\@GenMPheight{#1}} +\define@key{GenMP}{heightarg}[]{\let\if@GenMPheight\iffalse} + +\newif\if@GenMPouter +\let\if@GenMPouter\iffalse +\let\@GenMPtop=\relax +\let\@GenMPbottom=\relax +\define@key{GenMP}{outer}{% + \def\@GenMPread{#1}\def\@GenMPtempa{T}% + \ifx\@GenMPread\@GenMPtempa% + \def\@GenMPtop{\vspace{0pt}}% + \def\@GenMPouter{t}% + \else + \def\@GenMPtempa{B}% + \ifx\@GenMPread\@GenMPtempa% + \def\@GenMPbottom{\vspace{0pt}}% + \def\@GenMPouter{b}% + \else + \def\@GenMPouter{#1}% + \fi + \fi + \let\if@GenMPouter\iftrue +} +\define@key{GenMP}{outerarg}[]{\let\if@GenMPouter\iffalse} + +\newif\if@GenMPinner +\let\if@GenMPinner\iffalse +\define@key{GenMP}{inner}{\let\if@GenMPinner\iftrue\def\@GenMPinner{#1}} +\define@key{GenMP}{innerarg}[]{\let\if@GenMPinner\iffalse} + +\def\defineMPstyle#1#2{% + \define@key{GenMP}{#1}[]{\setkeys{GenMP}{#2}}} + +\defineMPstyle{plain}{} +% \end{macrocode} +% +% \Finale +% +\endinput +% +% end of file `genmpage.dtx' -- cgit v1.2.3