% \iffalse meta-comment % %% File: parskip.dtx %% (C) Copyright 1989 H.Partl, TU Wien %% (C) Copyright 2001 Robin Fairbairns %% (C) Copyright 2018-2021 Frank Mittelbach % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this % license or (at your option) any later version. The latest version % of this license is in the file % % https://www.latex-project.org/lppl.txt % % % The development version of the bundle can be found below % % https://github.com/FrankMittelbach/fmitex-parskip/ % % for those people who are interested or want to report an issue. % %<*driver> \documentclass{article} \usepackage{doc,url} \EnableCrossrefs \CodelineIndex \begin{document} \DocInput{parskip.dtx} \end{document} % % % \fi % % % \newcommand\option[1]{\texttt{#1}} % \newcommand\cs[1]{\texttt{\bslash#1}} % \newcommand\pkg[1]{\textsf{#1}} % % \title{The \texttt{parskip} package\thanks{This is a % reimplementation of a package originally written by Hubert Partl % in 1989 and later maintained by Robin Fairbairns.}} % \author{Frank Mittelbach} % % \maketitle % % \begin{abstract} % The \pkg{parskip} package helps in implementing paragraph layouts % where the paragraphs are separated by a vertical space instead of % (or in addition to) indenting them. % % The package can be used with any document class at any size. By % default it produces the following paragraph layout: Zero % \cs{parindent} and non-zero \cs{parskip}. The stretchable glue in % \cs{parskip} helps \LaTeX{} in finding the best place for page % breaks. % % \end{abstract} % % \section{Introduction} % % Many \LaTeX{} constructs are internally built by using the paragraph % mechanism even if technically there aren't text paragraphs. In most % such cases the \LaTeX{} code handles indentation and suppressed it % if necessary. But unfortunately this is normally not done for % \cs{parskip} (as that is zero in the default layouts) and thus % changing it will result in vertical spaces in unexpected places. % % This package attempts to fix the spacing in table of contents % structures, list environments, and around display headings that would % get screwed up by a positive \cs{parskip} value. % % It is, however, is no more than quick fix; the `proper' way to % achieve effects as far-reaching as this is to create a new class. % % \subsection{History} % % This file was originally developed by Hubert Partl in 1989 (i.e., % for \LaTeX\,2.09) to provide a somewhat crude solution to an % existing problem in case no proper document class (back then called % document style) support was available. % % About ten years later Robin Fairbairns picked up the orphaned % package and his version was then the one available for \LaTeXe{} % during the next 15\textsuperscript{+} years. % % Finally, while working on the next edition of the \LaTeX{} Companion % the current author did a reimplementation, that added support for TOC % data and heading structures. Also a few additional key/value options % were added to make the package more useful. It still is and will % remain an inferior choice compared to a properly designed document % class. But it offers a starting point if nothing is around. % % % % \section{The user interface} % % The \pkg{parskip} package doesn't offer any document user commands % and just needs loading with \cs{usepackage}. % % % \subsection{Options to customize the package}\label{sec:options} % % All of the package options are implemented as key/value options. % \begin{description} % \item[\option{skip}] % With the package option \texttt{skip} it is possible to explicitly % specify the vertical space between paragraphs. If the option is % not given (or given without a value) then \verb=.5\baselineskip= % plus \texttt{2pt} of stretch is assumed. % \item[\option{tocskip}] % By default the \cs{parskip} is zero within \cs{tableofcontents} % and similar lists, regardless of its value elsewhere. With the % option \texttt{tocskip} it can be given a different value. If % used without an explicit value you get the same \cs{parskip} as elsewhere % within these lists. % \item[\option{indent}] % With the package option \texttt{indent} it is possible to explicitly set % the paragraph indentation. Using this option without a value keeps the % document class indentation unchanged, if it is specified with a % value then that value is used. If the package is loaded without % this option % the indentation is set % to zero. % \item[\option{parfill}] % With package option \texttt{parfill}, the package also adjusts % \cs{parfillskip} to impose a minimum space at the end of % the last line of a paragraph. If specified without a value then % \texttt{30pt} are assumed, if a value is given that forms the minimum. % \end{description} % % % \section{Differences to the original package} % % If the package is used without any options or just with the option % \option{parfill} it behaves like the earlier version, except that now % the spacing around headings is also adjusted (not adding extra % \cs{parskip}). If this is not desirable when processing an old % document it can be avoided by explicitly % requesting version \texttt{v1} as follows: % \begin{quote} % \verb/\usepackage{parskip}[=v1]/ % \end{quote} % Of course, the new options, etc.\ are then also not available. % % % % \section{Sources, bugs and issues} % % The official production version is available from CTAN. % The latest (development) sources are maintained at GitHub at: % \begin{quote} % \url{https://github.com/FrankMittelbach/fmitex-parskip} % \end{quote} % In case of problems with the package you can report them at % \begin{quote} % \url{https://github.com/FrankMittelbach/fmitex-parskip/issues} % \end{quote} % Please provide a minimal test example that can be run and doesn't % use packages not in a standard \LaTeX{} distribution (and only those % that are needed to show the issue). % % \StopEventually{} % % % % % \section{The Implementation} % % \setcounter{StandardModuleDepth}{1} ^^A everything is inside a module % % \begin{macrocode} %<*package> % \end{macrocode} % % \subsection{The main implementation part} % % % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}[2018-04-01] \DeclareRelease {v1}{2001-04-09}{parskip-2001-04-09.sty} \DeclareCurrentRelease{v2}{2018-08-24} % \end{macrocode} % % \begin{macrocode} \ProvidesPackage{parskip}[2021-03-14 v2.0h non-zero parskip adjustments] % \end{macrocode} % % % % \subsubsection{Option handling} % % Here we define all option keys for use as package options: % \begin{macrocode} \RequirePackage{kvoptions} \SetupKeyvalOptions{family=parskip,prefix=parskip@} % \end{macrocode} % % The key \option{indent} defines the amount of indentation for each % paragraph. If not given the indentation will be zero (default) and % if given without a value then the outer value from the document % class will get used, otherwise the given value is used. % \begin{macrocode} \DeclareStringOption[0pt]{indent}[\parindent] % \end{macrocode} % % The key \option{parfill} defines a minimum amount of white space % that should be left in the last line. By default the last line can % get completely fill up. If given without a value the default (as % before) is to require a minimum of \texttt{30pt}, otherwise the % given value is used. % \begin{macrocode} \DeclareStringOption[0pt]{parfill}[30pt] % \end{macrocode} % % The key \option{skip} defines the vertical separation between % paragraphs. If not given the default (as before) is to use half a % \cs{baselineskip} plus a stretch of \texttt{2pt} to add some % flexibility. If given, one need to provide an explicit value which % is then used as a separation (and it needs to contain any extra % stretch if that is wanted, i.e., there is no extra stretch added % in this case). % \changes{v2.0f}{2020/06/15}{Allow \texttt{skip} key without value % without a package error (gh/14)} % \begin{macrocode} \DeclareStringOption{skip}[] % \end{macrocode} % % The key \option{tocskip} defines the vertical separation inside the lists % \cs{tableofcontents}, \cs{listoffigures} and \cs{listoftables}. By % default there is no extra separatation (i.e., \texttt{0pt}). If % specified without a value the standard \cs{parskip} is used, % otherwise the given value. % \begin{macrocode} \DeclareStringOption[0pt]{tocskip}[\parskip] % \end{macrocode} % % Execute any package options: % \begin{macrocode} \ProcessKeyvalOptions* % \end{macrocode} % % So now we can evaluate the given options and adjust the % parameter settings: % \begin{macrocode} \ifx\parskip@skip\@empty % \end{macrocode} % If no \option{skip} was given (or it was empty) set \cs{parskip} % to half of \verb=.5\baselineskip= plus \texttt{2pt} stretch. Stretch % or shrink inside \cs{baselineskip} is ignored in this case. % \begin{macrocode} \parskip=.5\baselineskip plus 2pt\relax \else % \end{macrocode} % Otherwise set it to the specified value: % \changes{v2.0c}{2019/02/16}{Support calc by using \cs{setlength} % for assignments} % \begin{macrocode} \setlength\parskip\parskip@skip \fi % \end{macrocode} % Setting \cs{parfillskip} was suggested by Donald Arseneau at some % point on comp.text.tex: % \begin{macrocode} \setlength\parfillskip\parskip@parfill \advance\parfillskip 0pt plus 1fil\relax % \end{macrocode} % \cs{parindent} gets whatever was specified. If the key was given % without an option this will essentially reassign the now ``current'' value. % \begin{macrocode} \setlength\parindent\parskip@indent % \end{macrocode} % % % % \subsection{Handling document elements} % % Setting up a non-zero \cs{parskip} has some side-effects in document % elements such as lists or headings etc. Here we try to keep these % side-effects somewhat under control. % % We make use of the \pkg{etoolbox} package to do patching. % \begin{macrocode} \RequirePackage{etoolbox} % \end{macrocode} % % \subsubsection{Lists} % % To accompany this, the vertical spacing in the list environments is changed % to use the same as \cs{parskip} in all relevant places (for % \cs{normalsize} only), i.e. %\begin{verbatim} % \parsep = \parskip % \itemsep = \z@ % add nothing to \parskip between items % \topsep = \z@ % add nothing to \parskip before first item %\end{verbatim} % % However, if the user explicitly asked for a zero parskip (via the % \option{skip} option) we % shouldn't do this but rather keep the default list settings, so % we better check for this. % % \begin{macrocode} \ifdim \parskip > 0pt % \end{macrocode} % % \begin{macrocode} \def\@listI{\leftmargin\leftmargini \topsep\z@ \parsep\parskip \itemsep\z@} \let\@listi\@listI \@listi % \end{macrocode} % % \begin{macrocode} \def\@listii{\leftmargin\leftmarginii \labelwidth\leftmarginii\advance\labelwidth-\labelsep \topsep\z@ \parsep\parskip \itemsep\z@} % \end{macrocode} % % \begin{macrocode} \def\@listiii{\leftmargin\leftmarginiii \labelwidth\leftmarginiii\advance\labelwidth-\labelsep \topsep\z@ \parsep\parskip \itemsep\z@} % % and finally ... % \partopsep = \z@ % don't even add anything before first item (beyond % % \parskip) even if the list is preceded by a blank line \partopsep=\z@ \fi % \end{macrocode} % % % \subsubsection{TOCs and similar lists} % % Within a table of contents or a list of figures we don't want any % additional vertical spacing just because the individual lines in % such a list are implemented as one-line paragraphs. So we locally % set the \cs{parskip} to zero by default. Should be really something that is % done already in \LaTeX{}. % \changes{v2.0e}{2020/05/19}{Fix space at start of \cs{@starttoc} (gh/12)} % \begin{macrocode} \patchcmd\@starttoc {\begingroup \makeatletter} {\begingroup \makeatletter % \end{macrocode} % Just setting \cs{parskip} to zero as it was done in the original % version of the package, does not always work. If the list starts % out with an ordinary paragraph (and not with \cs{addvspace} as it % usually does) we will get a zero \cs{parskip} but the heading % above assumes we get the normal \cs{parskip} and has therefore % removed that amount from its own vertical skip. As long as the % parskip value is not too large people didn't notice that heading % and list moved closer to each other but if you use, say, % \texttt{[skip=20pt]} you will even see an overlap. % % We therefore do the following: we look at the last skip, undo it % and then issue a skip that is equal to \cs{parskip} + % \cs{lastskip}. % This way the skip seen by any following code has the right value % which is important for \cs{addvspace} calulations. Only then we % locally set \cs{parskip} to zero or rather to % \cs{parskip@tocskip}, the parameter that the user can set through % an option. % \changes{v2.0e}{2020/05/19}{Add \texttt{tocskip} option} % \begin{macrocode} \skip@\lastskip \advance\skip@\parskip \vskip-\lastskip \vskip\skip@ \parskip\parskip@tocskip} {}{\typeout{Couldn't patch \string\@starttoc}} % \end{macrocode} % % % % % \subsubsection{Standard headings} % % For the same reason we don't want to see an additional \cs{parskip} % being added before and after a display heading, so we subtract its % value (in two places): % \begin{macrocode} \patchcmd\@startsection {\addvspace\@tempskipa} {\advance\@tempskipa-\parskip\addvspace\@tempskipa} {}{\typeout{Couldn't patch \string\@startsection}} % \end{macrocode} % % \begin{macrocode} \patchcmd\@xsect {\vskip\@tempskipa} {\advance\@tempskipa-\parskip\vskip\@tempskipa} {}{\typeout{Couldn't patch \string\@xsect}} % \end{macrocode} % % % % % \subsubsection{\pkg{titlesec} headings} % % If \pkg{titlesec} is used then headings are built using different % commands and we have to cancel the \cs{parskip} there. The principle % is the same. Of course, the patching should only happen if that % package really got loaded, so we defer it to the start of the % document and test for it: % \begin{macrocode} \AtBeginDocument{% \ifx\ttl@straight@ii\@undefined\else % titlesec got loaded \patchcmd\ttl@straight@ii {\addvspace{\@tempskipa}}% {\advance\@tempskipa-\parskip \addvspace\@tempskipa}% {}{\typeout{Couldn't patch \string\ttl@straight@ii}}% \patchcmd\ttl@straight@ii {\vspace{\@tempskipb}}% {\advance\@tempskipb-\parskip \vspace\@tempskipb}% {}{\typeout{Couldn't patch \string\ttl@straight@ii}}% \patchcmd\ttl@part@ii {\vspace*{\@tempskipa}}% {\advance\@tempskipa-\parskip \vspace*\@tempskipa}% {}{\typeout{Couldn't patch \string\ttl@part@ii}}% \patchcmd\ttl@part@ii {\vspace{\@tempskipb}}% {\advance\@tempskipb-\parskip \vspace\@tempskipb}% {}{\typeout{Couldn't patch \string\ttl@part@ii}}% \patchcmd\ttl@page@ii {\vspace*{\@tempskipa}}% {\advance\@tempskipa-\parskip \vspace*\@tempskipa}% {}{\typeout{Couldn't patch \string\ttl@page@ii}}% \patchcmd\ttl@page@ii {\vspace{\@tempskipb}}% {\advance\@tempskipb-\parskip \vspace\@tempskipb}% {}{\typeout{Couldn't patch \string\ttl@page@ii}}% \fi} % \end{macrocode} % % % % \subsubsection{\pkg{amsthm} theorems} % % The \pkg{amsthm} package is one of the few packages that make an % explicit correction for \cs{parskip} which isn't any longer adequate % if this \pkg{parskip} package is loaded. We therefore remove that % setting from the package if it was loaded. % \changes{v2.0b}{2018/09/17}{Support \cs{amsthm} (sx/450551)} % \begin{macrocode} \AtBeginDocument{% \ifx\deferred@thm@head\@undefined\else % amsthm got loaded \patchcmd\deferred@thm@head {\addvspace{-\parskip}}{}% {}{\typeout{Couldn't patch \string\deferred@thm@head!}}% \fi} % \end{macrocode} % % % \subsection{Closing shop} % % \begin{macrocode} %<*package> % \end{macrocode} % % \Finale % \endinput