summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/phfnote/phfnote.dtx
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/phfnote/phfnote.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/phfnote/phfnote.dtx')
-rw-r--r--macros/latex/contrib/phfnote/phfnote.dtx3157
1 files changed, 3157 insertions, 0 deletions
diff --git a/macros/latex/contrib/phfnote/phfnote.dtx b/macros/latex/contrib/phfnote/phfnote.dtx
new file mode 100644
index 0000000000..05deb87518
--- /dev/null
+++ b/macros/latex/contrib/phfnote/phfnote.dtx
@@ -0,0 +1,3157 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2016 by Philippe Faist <philippe.faist@bluewin.ch>
+% -------------------------------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{phfnote.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+%<package>\ProvidesPackage{phfnote}
+%<*package>
+ [2016/08/15 v1.0 phfnote package]
+%</package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{xcolor}
+\usepackage{lipsum}
+\usepackage[preset=xpkgdoc]{phfnote}
+
+\usepackage{needspace}
+
+\makeatletter
+\newsavebox\phfnoteDocVirtualPage@contents
+\newenvironment{phfnoteDocVirtualPage}{%
+ \par%
+ \begingroup%
+ \makeatletter%
+ \begin{lrbox}{\phfnoteDocVirtualPage@contents}%
+ \begin{minipage}{12cm}\vspace*{0.5cm}\relax%
+ \def\rmdefault{cmr}\def\sfdefault{cmbr}\normalfont%
+ \def\shortlipsum{Lorem ipsum dolor sit amet, consectetuer
+ adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
+ adipiscing vitae, felis. Curabitur dictum gravida
+ mauris. Nam arcu libero, nonummy eget, consectetuer id,
+ vulputate a, magna.}%
+ \def\@title{Notes on Lambda-Majorization}%
+ \def\@author{Ph. Faist}%
+ \def\@date{23.12.2011}%
+ \def\notetitletopspace{0pt}%
+ \def\notetitlefont{\sffamily\bfseries}%
+ \def\morepagecontents{\par\vspace{1em}\centering\ldots}%
+ \ignorespaces%
+ }%
+ {%
+ \end{minipage}%
+ \end{lrbox}%
+ %%\centering%
+ \begin{tcolorbox}[text width=6cm,sharp corners,%
+ before={\par\vspace{5pt}\centering\nopagebreak\parindent=0pt},after={\par\vspace{5pt}},%
+ leftrule=0.4pt,toprule=0.4pt,rightrule=0.6pt,bottomrule=0.6pt,%
+ colframe=black,colback=white]%
+ \scalebox{0.5}{\usebox{\phfnoteDocVirtualPage@contents}}%
+ \end{tcolorbox}%
+ %%\par%
+ \endgroup%
+}
+\makeatother
+
+\def\RevTeX{{\small R\raise-0.2ex\hbox{\textsc{ev}}}\TeX}
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+
+\begin{document}
+ \DocInput{phfnote.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v1.0}{2016/04/20}{Initial version}
+%
+% \GetFileInfo{phfnote.dtx}
+%
+% \iffalse Bypass indexing for following commands: \fi
+% \DoNotIndex{\newcommand,\newenvironment,\renewcommand,\long,\def,\edef,\gdef,\xdef,\if,\else,\fi,\par,\relax,\vspace,\vskip,\hspace,\hskip,\vbox,\hbox}
+%
+% \title{\phfqitltxPkgTitle{phfnote}}
+% \author{Philippe Faist\quad\email{philippe.faist@bluewin.ch}}
+% \date{\pkgfmtdate\filedate}
+% \maketitle
+%
+% \begin{abstract}
+% \pkgname{phfnote}---A handy \LaTeX{} class for typesetting short notes and
+% medium-length reports, full of goodies to make it look just right.
+% \end{abstract}
+%
+% \phantomsection\label{sec:toc}
+% \inlinetoc
+%
+% \section{Introduction}
+%
+% Have you ever thought, ``let me write up these short notes using \LaTeX,'' but
+% then disliked the default style of the |article| class? Have you ever asked
+% yourself why half the page should be taken up by the title? Yes? Then
+% welcome to \pkgname{phfnote}.
+%
+% The package \pkgname{phfnote} provides basic formatting for short
+% documents, such as notes on a specific topic, short documentation, or
+% quick memos. It aims to cover all basic needs for such purposes: include
+% a standard set of relevant packages, a nice title which doesn't take up
+% too much space, better page margin sizes, and some basic styling to make
+% the note look nicer. At the same time, it is highly configurable so that
+% nothing is really unchangeable. And all overridden features can be
+% restored individually to their class-provided defaults.
+%
+% This package has been designed to work optimally along with the |article|
+% document class, but in principle any relatively standard \LaTeX{} class should
+% work. Notes can be typeset in \index{two-column} two-column mode with the
+% |twocolumn| option of for example the |article| class. Settings such as the
+% page margins and font goodies are automatically adapted to look best according
+% to the standard document font size (10pt, 11pt, or 12pt).
+%
+% Be aware that this package is not meant as a full-fledged formatting class for
+% complicated articles. For that, you should use a specialized class such as
+% \RevTeX.\footnote{See \url{https://journals.aps.org/revtex}}
+%
+% In the following, we detail individual features of this class, and explain how
+% to activate, deactivate, and customize them.
+%
+%
+% \section{Basic Usage}
+%
+% \subsection{Loading the Package}
+%
+% You can get started with the minimal template:
+%
+% \begin{verbatim}
+% \documentclass[11pt,a4paper]{article}
+% \usepackage{phfnote}
+%
+% \begin{document}
+% \title{Title of my notes}
+% \author{Me}
+% \date{\today}
+% \maketitle
+%
+% ...
+%
+% \end{document}
+% \end{verbatim}
+%
+% The package \pkgname{phfnote} introduces its default note formatting
+% style, with a more compact title, and some formatting adjustments in the
+% text and section headings.
+%
+% \subsection{Presets}
+% \label{sec:presets}
+%
+% There are a number of package options which can be provided to activate,
+% deactivate or adjust the formatting. The most straightforward way of changing
+% the formatting is to use \emph{presets}.
+%
+% Presets are processed immediately when given in the package option list,
+% meaning that their position in the list is meaningful. For example, the
+% option list
+% \begin{verbatim}
+% \usepackage[title=small,preset=article,par=skip]{phfnote}
+% \end{verbatim}
+% will set |title=small| only if it is not overridden by the |article| preset,
+% but will enforce |par=skip| in any case. You may in theory load several
+% presets, e.g. |preset=sfnote,preset=article|, but this is essentially useless
+% since presets tend to set a wide range of settings such that in any case the
+% last preset specified is effectively applied.
+%
+% First, there is a set of presets which are different alternative ``note''
+% styles. All the following define the note to have spacing between paragraphs
+% and no first line indentation, use the default note title style, and use a
+% wider page geometry.
+%
+% \begin{pkgoptions}
+% \item[preset=sfnote] {\fontfamily{cmbr}\selectfont Format the note in \LaTeX'
+% sans-serif ``Computer Modern Bright'' font. This is a nice, light, font for
+% short notes, but I find it more difficult to read at smaller font sizes or
+% in longer paragraphs.}
+% \item[preset=sfssnote] {\fontfamily{cmss}\selectfont Format the note in
+% \LaTeX' default sans-serif font. A very nice sans serif font. It might
+% look heavy though, depending on your taste.}
+% \item[preset=opensansnote] {\fontfamily{fosj}\selectfont Format the note
+% in Open Sans font (using the `\pkgname{opensans}' package with some
+% default options). A very beautiful and readable sans serif font.}
+% \item[preset=utopianote] {\fontfamily{futs}\selectfont Format the note in
+% Utopia font (by using the \pkgname{fourier} package). Perfect to my
+% taste for documenting code for example, but I find it a bit heavy for
+% scientific documents.}
+% \item[preset=mnmynote] Format the note in Minion Pro font, with sans
+% serif text formatted with the Myriad Pro font (professional fonts by
+% Adobe which can be used in \LaTeX{} with the \pkgname{MinionPro} and
+% \pkgname{MyriadPro} packages\footnote{See
+% \url{https://github.com/sebschub/FontPro}; the fonts themselves ship
+% with some Adobe products}). These beautiful fonts can be used for any
+% purpose.
+% \end{pkgoptions}
+%
+% Based essentially on |utopianote|, the preset |pkgdoc| sets up the
+% document to look nice for a \LaTeX{} package documentation. The preset
+% |xpkgdoc| adds additional definitions to aid in documenting \LaTeX{}
+% packages on top of |pkgdoc|.
+% \begin{pkgoptions}
+% \item[preset=pkgdoc] Basic formatting and settings for documenting \LaTeX{}
+% packages. This preset was used for the current document.
+% \item[preset=xpkgdoc] Same as |preset=pkgdoc|, but in addition a set of
+% useful commands are also provided, the \pkgname{tcolorbox} package is
+% loaded along with some default boxes. Also some commands are patched
+% to achieve some fixes. This preset is used for the documentation of
+% packages in the \pkgname{phfqitltx} package suite. (For details see
+% the implementation of |\phfnote@preset@xpkgdoc| below.)
+% \end{pkgoptions}
+%
+%
+% The following preset makes the document look more like an article. There are
+% some slight minor differences with respect to the default |article| class'
+% title in the choice of formatting the title and text.
+%
+% \begin{pkgoptions}
+% \item[preset=article] Sets a more title style closer to |article|'s default
+% title style (but slightly more compact) and sets paragraphs to indent with
+% no skip.
+% \end{pkgoptions}
+%
+% The last preset, |reset|, guarantees that including this package is
+% non-invasive, meaning that only new \LaTeX{} macros are made available without
+% altering any appearance. This is useful if you want to use a small feature
+% provided by this package, but you already have all the page geometry, title,
+% etc.\@ set up and want to make sure those aren't touched.
+%
+% \begin{pkgoptions}
+% \item[preset=reset] Deactivates all features of this package by default.
+% Individual settings can still later be switched on via specific package
+% options. Use this to activate only a specific set of features:
+% |[preset=reset,...]| will ensure that only the additional given features are
+% set.
+%
+% This is safer than deactivating individually all other features, because in
+% the future we may add new features which may be on by default. In this
+% case, the preset |reset| will guarantee all features to be deactivated.
+% \end{pkgoptions}
+%
+% \section{Features}
+%
+% This package provides a large collection of small features, which, put all
+% together, make the document look nicer (hopefully). Let's go through these
+% features, one by one.
+%
+% Note also that some features provided in the presets, such changing the
+% document font, are not provided as individual features here. This is because
+% they may be set and customized directly using few lines of \LaTeX{} code or
+% directly by including an external package. In those cases, you may have a
+% look at the preset's definition for inspiration (see \autoref{impl:presets}).
+%
+% For a summary of package options, see \autoref{sec:package-options}.
+%
+%
+% \subsection{Title Formatting}
+%
+% \subsubsection{Title Styles}
+% \label{sec:title-styles}
+% \label{sec:main-default-title-style}
+%
+% The \pkgname{phfnote} package allows a set of alternative title styles.
+% By default, the |default| title style is used. You may change this
+% setting with the |title=...| package option.
+%
+% \begin{pkgoptions}
+% \item[title=default] The default title style displays the title in large bold
+% sans serif font, left-aligned. Below the title appears the information
+% about author and date, indented, followed by a horizontal rule. It looks
+% like this:
+% \begin{phfnoteDocVirtualPage}
+% \notetitle@style@default\null \shortlipsum \morepagecontents
+% \end{phfnoteDocVirtualPage}
+% As you can see, it saves more space on the page compared to the default
+% article title.
+%
+% \item[title=small] A smaller title style which displays all the relevant
+% information on a single line. This is useful for when even the default
+% title style appears too large. It looks like this:
+% \begin{phfnoteDocVirtualPage}
+% \notetitle@style@small\null \shortlipsum \morepagecontents
+% \end{phfnoteDocVirtualPage}
+%
+% \item[title=article] Mimics the default title style from the |article| class,
+% but saves a little more space. It looks like this:
+% \begin{phfnoteDocVirtualPage}
+% \vspace*{3em}\notetitle@style@article\null \shortlipsum \morepagecontents
+% \end{phfnoteDocVirtualPage}
+%
+% \item[title=] An empty argument to |title| instructs \pkgname{phfnote} not to
+% override any title definition, thus preserving the default class title
+% style.
+%
+% Beware that some other title goodies, such as our more advanced |\thanks|
+% notes, or spacing adjustments for the abstract, will probably not work.
+% \end{pkgoptions}
+%
+%
+% \subsubsection{Customizing the style of the \phfverb{default} and \phfverb{small} title styles}
+%
+% You may customize the appearance of the |default| and |small| title styles by
+% overriding some macros.
+%
+% \needspace{3\baselineskip}
+% \DescribeMacro{\notetitlefont}\DescribeMacro{\notetitleauthorfont}
+% \DescribeMacro{\notetitledatefont} The macros
+% |\notetitlefont|, |\notetitleauthorfont|, and |\notetitledatefont| set the
+% default main font title, author text and date text. You may override these
+% settings with, for instance:
+% \begin{verbatim}
+% \renewcommand{\notetitlefont}{\sffamily\bfseries}
+% \renewcommand{\notetitleauthorfont}{\itshape}
+% \renewcommand{\notetitledatefont}{\footnotesize}
+% \end{verbatim}
+% The spacing of the title may be adjusted with the macros
+% \DescribeMacro{\notetitlebelowspace} |\notetitlebelowspace| and
+% \DescribeMacro{\notetitletopspace} |\notetitletopspace|. Override these with
+% e.g.:
+% \begin{verbatim}
+% \renewcommand{\notetitlebelowspace}{4mm}
+% \renewcommand{\notetitletopspace}{-1.2cm}
+% \end{verbatim}
+% Finally, you may override the command \DescribeMacro{\notetitlehrule}
+% |\notetitlehrule| which draws the rule below the title:
+% \begin{verbatim}
+% \renewcommand{\notetitlehrule}{\hrule height 0.8pt}
+% \end{verbatim}
+%
+%
+%
+% \subsubsection{Title notes: \phfverb\thanks{} and \phfverb\thanksmark}
+%
+% \DescribeMacro{\thanks}
+% Notes in the title can be introduced with the |\thanks| macro. You may use
+% this to specify an e-mail address, an affiliation, or any other more specific
+% information. |\thanks| may appear in all three title, authors and date.
+%
+% The appearance of this additional information depends on the title style. In
+% the default note title style, such thanks-notes appear directly below the
+% title. For example, with
+% {\ttfamily|\|author\{Ph.\@ Faist|\|thanks\{|\|itshape Institute for Theoretical Physics, ETH Zurich\}\}}, you get:
+% \begin{phfnoteDocVirtualPage}
+% \author{Ph. Faist\thanks{\itshape Institute for Theoretical Physics, ETH Zurich}}\relax
+% \notetitle@style@default\null \morepagecontents
+% \end{phfnoteDocVirtualPage}
+% whereas with the other styles, this information is typeset as regular footnotes.
+%
+% \leavevmode\marginpar{\raggedleft \phfverb\thanks\phfverb{[N]}}\relax
+% You may specify an optional argument to |\thanks|, forcing the footnote to a
+% specific number (it must be a number). For example, with
+% {\ttfamily|\|author\{Ph.\@ Faist|\|thanks[9]\{|\|itshape Institute for
+% Theoretical Physics, ETH Zurich\}\}}, you get:
+% \begin{phfnoteDocVirtualPage}
+% \author{Ph. Faist\thanks[9]{\itshape Institute for Theoretical Physics, ETH Zurich}}\relax
+% \notetitle@style@default\null \morepagecontents
+% \end{phfnoteDocVirtualPage}
+%
+% \DescribeMacro{\thanksmark} |\thanksmark[N]| works with |\thanks| as
+% |\footnotemark| works with |\footnote|. It just displays the given number as
+% a footnote mark. In this way, you can have for example several shared
+% affiliations:
+% \begin{phfnoteDocVirtualPage}
+% \title{Notes about Stuff}
+% \date{25.12.2015}
+% \author{First Author\thanks[1]{\itshape Institute ABC}, Second Author\thanks[2]{\itshape Somewhere else},
+% and Third Author\thanksmark[1]}\relax
+% \notetitle@style@default\null \morepagecontents
+% \end{phfnoteDocVirtualPage}
+% the author code was:
+% \begin{verbatim}
+% \author{First Author\thanks[1]{\itshape Institute ABC},
+% Second Author\thanks[2]{\itshape Somewhere else},
+% and Third Author\thanksmark[1]}
+% \end{verbatim}
+%
+% Unfortunately, you still have to provide the numbering manually. On the other
+% hand, this package is not meant to replace \RevTeX, so if you're writing a
+% complicated article with many authors and affiliations, you probably shouldn't
+% be using \pkgname{phfnote} in the first place.
+%
+% \begin{pkgwarning}
+% The optional argument to |\thanks|, as well as the command |\thanksmark|,
+% are not made available if you don't use one of |\phfnote|'s title styles.
+%
+% This behavior is such as to prevent interference with more advanced class
+% mechanisms, such as \RevTeX's.
+% \end{pkgwarning}
+%
+%
+% \subsection{Abstract}
+% \label{sec:abstract-attributes}
+%
+% \DescribeEnv{abstract} The |abstract| environment renders indented text aimed
+% to provide a short summary of the document. We might use, for example, the
+% following code:
+% \begin{verbatim}
+% \begin{abstract}
+% Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus
+% elit, vestibulum ut, placerat ac, adipiscing vitae, felis.
+% Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget,
+% consectetuer id, vulputate a, magna.
+% \end{abstract}
+% \end{verbatim}
+%
+% which would look like this:
+% \begin{phfnoteDocVirtualPage}
+% \title{Notes about Stuff}\relax
+% \date{25.12.2015}\relax
+% \author{Me}\relax
+% \notetitle@style@default
+% \def\noteabstract@nameline{{\parskip=0pt\relax\par\centering\noteabstractnamefont\abstractname\par}\vskip 1ex\relax}%
+% \def\noteabstracttextwidth{0.8\textwidth}%
+% \begin{abstract}
+% Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus
+% elit, vestibulum ut, placerat ac, adipiscing vitae, felis.
+% Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget,
+% consectetuer id, vulputate a, magna.
+% \end{abstract}
+% \morepagecontents
+% \end{phfnoteDocVirtualPage}
+%
+% The |abstract| environment should be given \emph{after} the |\maketitle|
+% command. (In contrast to, e.g., \RevTeX.)
+%
+% You may customize the appearance of the abstract via a list of attributes
+% given as argument to a package option. When you combine arguments, make sure
+% to put them in a braced group: |[abstract={wide,noname,it}]|.
+%
+% \begin{pkgoptions}
+% \item[abstract=\pkgoptattrib{wide}] The abstract should not be indented, and
+% should instead be aligned to the rest of the text.
+% \item[abstract=\pkgoptattrib{narrow}] The abstract should be indented narrower
+% then by default.
+% \item[abstract=\pkgoptattrib{noname}] The title ``Abstract.'' above the text
+% will not be typeset. The abstract text is typeset directly instead.
+% \item[abstract=\pkgoptattrib{original}] Revert to the class' default
+% implementation of the |abstract| environment. The class' implementation is
+% restored and no longer tampered with.
+% \item[abstract=\pkgoptattrib{small}] Use a smaller font for the abstract text
+% (|\small| font).
+% \item[abstract=\pkgoptattrib{compact}] Reduce spacing before and after the
+% abstract. If the abstract is short, this might look slightly better.
+% \item[abstract=\pkgoptattrib{it}] Typeset the abstract text using an italic
+% typeface.
+% \end{pkgoptions}
+%
+%
+% The abstract environment's appearance can be customized more finely
+% by redefining some macros. (In fact, this is what the package
+% options |abstract=...| actually do.) The font used for the text of
+% the abstract is set by \DescribeMacro{\noteabstracttextfont}
+% |\noteabstracttextfont|. This macro should expand to font selection
+% commands, such as |\itshape|, |\bfseries|, |\small|, etc. The title
+% of the abstract (the word ``Abstract.\@'') is typeset in the font set
+% by \DescribeMacro\noteabstractnamefont |\noteabstractnamefont|. The
+% width of the whole abstract text is determined by
+% \DescribeMacro{\noteabstracttextwidth} |\noteabstracttextwidth|.
+% Observe that |\noteabstracttextwidth| is a macro, and not a proper
+% length, so that it can determine more dynamically the length. The
+% spacing below \DescribeMacro{\noteabstractafterspacing}
+% (|\noteabstractafterspacing|) and above
+% \DescribeMacro{\noteabstractbeforespacing}
+% (|\noteabstractbeforespacing|) the abstract can further be
+% specified, also as macros.
+%
+% \subsection{Table of Contents}
+% \label{sec:inline-toc}
+%
+% \DescribeMacro{\inlinetoc} The package \pkgname{phfnote} also provides a
+% table of contents typeset with reduced spacing to be more compact, and
+% with horizontal rules before and after. You can insert the table of
+% contents with the command |\inlinetoc|. It looks like this:
+%
+% \begin{phfnoteDocVirtualPage}
+% \title{Notes about Stuff}\relax
+% \date{25.12.2015}\relax
+% \author{Me}\relax
+% \notetitle@style@default
+% \def\noteabstract@nameline{{\parskip=0pt\relax\par\centering\noteabstractnamefont\abstractname\par}\vskip 1ex\relax}%
+% \def\noteabstracttextwidth{0.8\textwidth}%
+% \begin{abstract}
+% Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus
+% elit, vestibulum ut, placerat ac, adipiscing vitae, felis.
+% \end{abstract}
+% \def\@starttoc#1{\relax
+% \contentsline {section}{\numberline {1}Introduction}{2}{section.1}
+% \contentsline {section}{\numberline {2}Basic Usage}{3}{section.2}
+% \contentsline {subsection}{\numberline {2.1}Loading the Package}{3}{subsection.2.1}
+% \contentsline {subsection}{\numberline {2.2}Presets}{3}{subsection.2.2}
+% }\relax
+% \inlinetoc
+% \morepagecontents
+% \end{phfnoteDocVirtualPage}
+%
+%
+% \subsection{Predefined Package Sets}
+% \label{sec:package-sets}
+%
+% The \pkgname{phfnote} package also provides sets of standard \LaTeX{}
+% packages to load. You may choose between a varying degree of
+% ``richness'' of packages included.
+%
+% \begin{pkgoptions}
+% \item[pkgset=none] Do not include any package set.
+%
+% \item[pkgset=minimal] Include some basic minimal set useful for
+% scientific notes: the \AmS{} packages \pkgname{amsmath},
+% \pkgname{amssymb}, \pkgname{amsfonts}, and \pkgname{amsthm}. The
+% \pkgname{xcolor} package is also loaded.
+%
+% \item[pkgset=rich] Include a fair amount of packages which may be useful.
+% On top of the |minimal| package set, this set includes the packages
+% \pkgname{enumitem}, \pkgname{graphicx}, \pkgname{microtype},
+% \pkgname{caption}, \pkgname{setspace}, as well as \pkgname{inputenc}
+% with the |utf8| option and \pkgname{fontenc} with the |T1| option.
+%
+% This package set is loaded by default.
+%
+% \item[pkgset=extended] Additionally, include packages \pkgname{float},
+% \pkgname{verbdef}, \pkgname{csquotes}, \pkgname{dsfont}, \pkgname{bbm}
+% and \pkgname{mathtools}.
+%
+% \end{pkgoptions}
+%
+%
+% \subsection{Page Geometry}
+% \label{sec:pagegeomdefs}
+%
+% Another important aspect of \pkgname{phfnote} is the handling of page
+% margins. Often the default page margins of the \pkgname{article} class
+% are quite narrow. While it is a good typographical practice to avoid
+% long lines, on occasion we prefer to have notes typeset with wider text.
+% The general answer is the \pkgname{geometry} package, which allows to set all
+% margins in full detail.
+%
+% The \pkgname{phfnote} package provides some standard choices of options for the
+% \pkgname{geometry} package, which are adjusted according to the document font size,
+% and whether the document is typeset in two columns.
+%
+% If you want anything more complicated than what is provided by a default
+% setting here, just use |pagegeomdefs=false| and invoke the \pkgname{geometry} package
+% directly with your preferred set of options.
+%
+% \begin{pkgoptions}
+% \item[pagegeomdefs=true] Include the \pkgname{geometry} package, using the default
+% settings or whatever is specified with the |pagegeom| option.
+% \item[pagegeomdefs=false] Do not attempt to change the document margins, and
+% don't load the \pkgname{geometry} package.
+% \item[nopagegeomdefs] Same as |pagegeomdefs=false|.
+% \end{pkgoptions}
+%
+% The page geometry predefined settings are the following.
+%
+% \begin{pkgoptions}
+% \item[pagegeom=default] Default settings. Not too wide, not too
+% narrow. Settings vary according to single or double column setting, and
+% according to default font point size.
+% \item[pagegeom=narrow] Narrower style. For single-column documents, this is
+% closer to the typographically-advertised-optimal of 50--80 characters per
+% line, but it might look narrow to some.
+% \item[pagegeom=wide] Wide, comfortable style. Wastes less paper.
+% \item[pagegeom=xwide] Extra wide. Use if you pity trees.
+% \item[pagegeom=bigmargin] Makes the margins asymmetric, so that a wide margin
+% note can fit. This style is used in this package documentation, for
+% example.
+% \end{pkgoptions}
+%
+%
+% \subsection{Section Headers Styling}
+% \label{sec:secfmt}
+%
+% The \pkgname{phfnote} package provides some limited styling of section headers. The
+% font, size and ``compactness'' of the headers can be adjusted with title options.
+% But really, these options are quite basic. You should use \pkgname{titlesec} or
+% \pkgname{sectsty} directly if you want anything serious.
+%
+% The section headings are customized using the \pkgname{sectsty} package. If this
+% conflicts in your document, then use the |[secfmt={}]| package option to
+% indicate that section headings should NOT be styled by this package. Then take
+% care of section styling manually.
+%
+% Package options may be used to customize the appearance of the section
+% headings by specifying a list of attributes. When you combine arguments, make
+% sure to put them in a braced group: |[secfmt={section,compact}]|. Beware that
+% attributes are not merged between different occurrences of the |secfmt|
+% keyword in the package options; the last occurrence defines all set
+% attributes. If the |secfmt| package option is not given, then by default only
+% the |section| attribute is set.
+%
+% \begin{pkgnote}
+% Don't forget to include the attribute `|section|' and/or `|paragraph|'
+% depending on which type of heading you want your settings to apply to. For
+% example, \pkgoptionfmt{secfmt=\pkgoptattribnodots{sffamily}} has no effect,
+% you need to use e.g.\@
+% \pkgoptionfmt{secfmt=\pkgoptattribnodots{section,sffamily}}.
+% \end{pkgnote}
+%
+% Available attributes are the following:
+%
+% \begin{pkgoptions}
+% \item[secfmt=\pkgoptattrib{section}] Use the |section| attribute to activate
+% the styling of section-level headings, that is, |\section|, |\subsection|
+% and |\subsubsection|.
+% \item[secfmt=\pkgoptattrib{paragraph}] This attribute indicates that the
+% styling should apply to paragraph-level headings as well (|\paragraph| and
+% |\subparagraph|).
+% \item[secfmt=\pkgoptattrib{compact}] Reduce the sizes of the section headings
+% (if the section-level headings are styled, i.e.\@ you need to specify the
+% |section| attribute), giving the document a more ``compact'' appearance.
+% \item[secfmt=\pkgoptattrib{larger}] Increase the sizes of the section
+% headings. Suitable for longer documents or for small document font sizes.
+% \item[secfmt=\pkgoptattrib{secsquares}] Display black squares on the left side
+% of |\section|-level commands, making them stand out better. This is useful
+% for documents (such as the present one) with several layers of sub-sections.
+% \item[secfmt=\pkgoptattrib{secnummargin}] Display the section, subsection, and
+% subsubsection numbering in the left margin and have the title occupy the
+% full width of the text (such as for this document). If you want both
+% \pkgoptionfmt{secsquares} and \pkgoptionfmt{secnummargin}, you must specify
+% them in that order, or the black square may end up overlapping with the
+% number.
+% \item[secfmt=\pkgoptattrib{rmfamily}] Typeset headings in the regular
+% roman font of the document, instead of trying to apply the
+% {\fontfamily{ppl}\fontseries{bx}\selectfont Palatino font}. This
+% applies to section-level and/or paragraph-level headings, depending on
+% which of the attributes |section| and/or |paragraph| have been
+% specified.
+% \item[secfmt=\pkgoptattrib{sffamily}] Typeset headings in a sans-serif font.
+% The default document sans serif font is used. This applies to section-level
+% and/or paragraph-level headings, depending on which of the attributes
+% |section| and/or |paragraph| have been specified.
+% \item[secfmt=\pkgoptattrib{itpar}] Typeset paragraph-level headings in italic.
+% \item[secfmt=\pkgoptattrib{blockpar}] Change the paragraph-level headings not
+% to be in ``run-in'' style, but to be typeset on their own line like section
+% headings.
+% \item[secfmt=\pkgoptattribempty] Leave the argument empty to keep the original class styling;
+% nothing will be overridden and the \pkgname{sectsty} package is not loaded.
+% \end{pkgoptions}
+%
+% You can also directly modify the section heading style by redefining some
+% macros. Note that these macros only affect those sectioning commands which we
+% have decided to style, which is specified by the |section| and |paragraph|
+% attributes to be specified in the |secfmt={...}| package option.
+%
+% \DescribeMacro{\notesectionallfont} The macro |\notesectionallfont| is invoked
+% for every sectioning command (for those which are styled, see the |section|
+% and |paragraph| attributes). The macro |\notesectionallfont| internally
+% invokes \DescribeMacro{\notesectionallfontfamily} |\notesectionallfontfamily|
+% to select which font family to use. The family should be given as the font
+% code, e.g.: |pbk| = {\fontfamily{pbk}\selectfont Bookman}; |bch| =
+% {\fontfamily{bch}\selectfont Charter}; |ppl| = {\fontfamily{ppl}\selectfont
+% Palatino}; |ptm| = {\fontfamily{ptm}\selectfont Adobe Times}; |phv| =
+% {\fontfamily{phv}\selectfont Adobe Helvetica}; |pcr| =
+% {\fontfamily{pcr}\selectfont Adobe Courier}; |put| =
+% {\fontfamily{put}\selectfont Utopia}; |cmr| = {\fontfamily{cmr}\selectfont
+% Computer Modern Roman}; |cmss| = {\fontfamily{cmss}\selectfont CM Sans Serif};
+% |cmbr| = {\fontfamily{cmbr}\selectfont CM Bright}; google many more or look
+% directly into the source of corresponding \LaTeX{} packages.
+%
+% You may customize these either via attributes or by redefining them directly.
+% Beware that if you redefine |\notesectionallfont| then you are responsible for
+% honoring, or ignoring, the value of |\notesectionallfontfamily|.
+%
+% \DescribeMacro{\notesectionfont} \DescribeMacro{\notesubsectionfont}
+% \DescribeMacro{\notesubsubsectionfont} \DescribeMacro{\noteparagraphfont}
+% \DescribeMacro{\notesubparagraphfont} These macros define the font commands to
+% apply for the section heading corresponding to the given sectioning command.
+% This macro is invoked after |\notesectionallfont|, which means that font
+% definitions in these macros take precedence over those in
+% |\notesectionallfont|.
+%
+% \DescribeMacro{\notesectionsetfonts} The macro |\notesectionsetfonts| is a
+% shorthand to set all section font definitions for the section-level commands
+% |\section|, |\subsection|, and |\subsubsection|. For example,
+% \begin{verbatim}
+% \notesectionsetfonts{\Large}{\large}{\normalsize}
+% \end{verbatim}
+% will set the font sizes for |\section|, |\subsection| and |\subsubsection| in
+% this order.
+%
+% \DescribeMacro{\noteparagraphsetfonts} The macro |\noteparagraphsetfonts| is
+% the corresponding shorthand for the paragraph-level commands. It takes two
+% arguments, the font definitions to apply for headings of level |\paragraph|
+% and |\subparagraph|.
+%
+% \subsection{Appearance of Paragraphs}
+% \label{sec:par-defs}
+%
+% Several presets may be set to define the appearance of paragraphs.
+%
+% \begin{pkgoptions}
+% \item[par=indent] Paragraphs are indented, bearing some
+% similarity to the \pkgname{article} class' default paragraph style.
+% \item[par=skip] Paragraphs are separated by additional spacing,
+% and not indented.
+% \item[par=indentminiskip] Paragraphs are indented, but there is also a small
+% space between each paragraph.
+% \item[par=original] Do not modify the appearance of paragraphs, and leave the
+% class default.
+% \end{pkgoptions}
+%
+% \subsection{Adjusting Spacing of Lines and Words}
+% \label{sec:spacingdefs}
+%
+% The \pkgname{phfnote} package also provides definitions to adjust spacing of lines and
+% words.
+%
+% This includes definitions to avoid overflowing words in the margin in case of
+% long words.
+%
+% \begin{pkgoptions}
+% \item[spacingdefs=true] Apply adjustments to line and word spacing.
+% \item[spacingdefs=false] Do not attempt any adjustments of line or word
+% spacing.
+% \item[nospacingdefs] Alias for |spacingdefs=false|.
+% \end{pkgoptions}
+%
+%
+% \subsection{Adjustments for Fonts}
+% \label{sec:fontdefs}
+%
+% The \pkgname{phfnote} package provides as well some adjustments for fonts to make some
+% fonts look nicer.
+%
+% Concretely, the {\fontfamily{cmbr}\selectfont Computer Modern Bright} font is
+% used as sans serif font instead of {\fontfamily{cmss}\selectfont \LaTeX's
+% default sans serif font}, and the more universal |T1| font encoding is used
+% instead of the default |OT1|.
+%
+% \begin{pkgoptions}
+% \item[fontdefs=true] Apply adjustments to fonts.
+% \item[fontdefs=false] Do not apply adjustments to fonts.
+% \item[nofontdefs] Same as |fontdefs=false|.
+% \end{pkgoptions}
+%
+% \subsection{Footnote Figure Style}
+% \label{sec:footnotedefs}
+%
+% The footnotes' appearance can also be slightly enhanced.
+%
+% \begin{pkgoptions}
+% \item[footnotedefs=true] Changes the symbol appearance a little bit---the
+% footnote number is smaller and typeset in boldface.
+% \item[footnotedefs=false] Do not change the footnote appearance.
+% \item[nofootnotedefs] Same as |footnotedefs=false|.
+% \end{pkgoptions}
+%
+%
+% \subsection{Hyperref Loading}
+% \label{sec:hyperrefdefs}
+%
+% There are many options for setting up the \pkgname{hyperref} package, and often, the
+% defaults (with boxed links) are pretty ugly in my opinion. Enable the
+% |hyperrefdefs| feature of \pkgname{phfnote} to alter the defaults to something I
+% personally like better (dark blue links as in this document).
+%
+% \begin{pkgoptions}
+% \item[hyperrefdefs=true] Load the \pkgname{hyperref} package, and set some sensible
+% settings. Also ensures the |\email| and |\url| commands are made available.
+% \item[hyperrefdefs=false] Do not load the \pkgname{hyperref} package, do not set
+% sensible settings.
+% \item[nohyperrefdefs] Same as |hyperrefdefs=false|.
+% \end{pkgoptions}
+%
+% \DescribeMacro{\url} In order to typeset URLs, the |\url| command is made
+% available from the package \pkgname{url} (which is then linkified by \pkgname{hyperref}). For
+% example, you can type |\url{https://github.com/phfaist/}|.
+%
+% \DescribeMacro{\email} A similar command allows to typeset e-mail addresses.
+% The text is displayed as a hyperlink, which when clicked opens a e-mail
+% composer to that address (via a |mailto:XXX| link). For example, try
+% |\email{pulp_fiction@tarantino.com}|.
+%
+% \DescribeMacro{\phfnotePdfLinkColor} The command |\phfnotePdfLinkColor| may by
+% used to set the color of the links. It takes one argument, a color
+% specification understood by the \pkgname{xcolor} package. For example:
+% \begin{verbatim}
+% \phfnotePdfLinkColor{green!50!black}
+% \end{verbatim}
+%
+% \begin{pkgnote}
+% The package \pkgname{xcolor} must be loaded for |\phfnotePdfLinkColor|
+% to work. (The \pkgname{xcolor} package is automatically loaded as part
+% of a package set as long as you're not using the option |pkgset=none|;
+% see \autoref{sec:package-sets}.)
+% \end{pkgnote}
+%
+%
+% \subsection{Bibliography Definitions}
+% \label{sec:bibliographydefs}
+%
+% This package also provides some definitions for the bibliography.
+%
+% It sets the |naturemagdoi| style by default, which is a hacked (by yours
+% truly) version of the |naturemag| style to include the journal name as a
+% hyperlink (as in APS bibliography styles).
+%
+% The bibliography is also typeset in a smaller font.
+%
+% Finally, an entry in the table of contents is generated.
+%
+% \begin{pkgoptions}
+% \item[bibliographydefs=true] Load the \pkgname{hyperref} package, and set some sensible
+% settings. Also ensures the |\email| and |\url| commands are made available.
+% \item[bibliographydefs=false] Do not load the \pkgname{hyperref} package, do not set
+% sensible settings.
+% \item[nobibliographydefs] Same as |bibliographydefs=false|.
+% \end{pkgoptions}
+%
+% \DescribeMacro{\bibliography} \DescribeMacro{\bibliographystyle} The
+% |\bibliographystyle| and |\bibliography| macros can be used as usual, for
+% example:
+% \begin{verbatim}
+% \bibliographystyle{apsrmp4-1} % optional
+% \bibliography{mybibfile}
+% \end{verbatim}
+% bearing in mind that if the |\bibliographystyle| command is not present, our
+% custom |naturemagdoi| bibliography style is used.
+%
+%
+% \subsection{URL Styles}
+% \label{sec:url-styles}
+%
+% As a bonus, the \pkgname{phfnote} package provides an alternative set of URL styles to
+% use with the |\url| and |\email| commands (see \autoref{sec:hyperrefdefs}).
+%
+% All the styles described below typeset the URL in a slightly smaller size, so
+% as to avoid a common issue with URLs that they tend to appear too large.
+% Also, the tilde character is fixed so that it appears nicely, as in:\\
+% \url{https://people.phys.ethz.ch/~pfaist/}.
+%
+% The URL style can be set with the command |\urlstyle|\marg{name of style}.
+%
+% \begin{description}[font=\ttfamily,labelwidth=8em]
+% \item[notett] typewriter font
+% \item[notesf] default sans serif font
+% \item[notesfss] Computer Modern Sans Serif font
+% \item[noteitsf] italic using default sans serif font
+% \item[noterm] normal roman typeface
+% \item[noteit] just italic typeface
+% \item[notesml] just smaller than surrounding text
+% \end{description}
+%
+%
+% \subsection{A \phfverb{\notesmaller} Command}
+%
+% This general-purpose command is handy to typeset text smaller than its
+% surrounding text, for when you don't know what size the surrounding text is
+% typeset at. In some sense, this is a very very lightweight analogue of what
+% the \pkgname{relsize} package does. (This is used, for example, in our implementation
+% of URL styles introduced in \autoref{sec:url-styles}.)
+%
+% \DescribeMacro{\notesmaller}\DescribeMacro{\notesmaller[0.8]} Set the font
+% size to a fraction of the surrounding font size. The fraction may be
+% specified as an optional argument. A fraction of 0.8 makes the text size 0.8
+% times that of the surrounding text, that is, smaller than the surrounding
+% text. A value of 1 does not change the font size. If the fraction is not
+% specified, the value stored in |\notesmallerfrac| is used.
+%
+% \DescribeMacro{\notesmallerfrac} The fraction by which |\notesmaller| typesets
+% smaller text when no optional argument is given. You may redefine this
+% command to set the default ``smaller'' size fraction.
+%
+% \subsection{Tools Mostly for Hackers}
+%
+% The \pkgname{phfnote} package also provides some small hacks. They are documented
+% further in \autoref{sec:impl-other-stand-alone-defs}. These are:
+% \DescribeMacro{\phfnoteHackSectionStarWithTOC} a macro
+% |\phfnoteHackSectionStarWithTOC| to hack into a command which generates a
+% |\section*|, in order for that command to also generate a corresponding entry
+% in the table of contents; and
+% \DescribeMacro{\phfnoteSaveDefs}\DescribeMacro{\phfnoteRestoreDefs} a pair of
+% commands to save and restore \LaTeX{} definitions.
+%
+%
+%
+%
+% \section{Summary of Package Options}
+% \label{sec:package-options}
+%
+% \begin{pkgoptions}
+% \item[preset=\meta{preset name}] Load a preset specifying a predefined set of
+% options for the general appearance of the document. See documentation in
+% \autoref{sec:presets}
+% \item[title=\meta{title style}] Set the title style. Documentation in
+% \autoref{sec:title-styles}
+% \item[abstract=\meta{abstract attributes}] Set the abstract style by
+% specifying a comma-separated list of attributes. Don't forget to
+% put the list of attributes within braces,
+% |[abstract={wide,noname,it}]|. Documentation in
+% \autoref{sec:abstract-attributes}
+% \item[pkgset=\meta{package set}] Specify a standard set of \LaTeX{}
+% packages to load. See \autoref{sec:package-sets}.
+% \item[pagegeomdefs=\meta{true or false}] Whether to care about page
+% margins. |nopagegeomdefs| is synonym for |pagegeomdefs=false|.
+% \item[pagegeom=\meta{geom style}] Set a page margin style. Only has effect if
+% |pagegeomdefs=true|. Options are documented in \autoref{sec:pagegeomdefs}.
+% \item[secfmt=\meta{section formatting attributes}] A list of attributes
+% defining how section (and possibly paragraph) headings should look like.
+% See \autoref{sec:secfmt}.
+% \item[par=\meta{par style}] Define how paragraphs should be spaced. Refer to
+% \autoref{sec:par-defs}.
+% \item[spacingdefs=\meta{true or false}] Adjust spacing of lines and words
+% (\autoref{sec:spacingdefs}).
+% \item[fontdefs=\meta{true or false}] Adjust some fonts
+% (\autoref{sec:fontdefs}).
+% \item[footnotedefs=\meta{true or false}] Adjust slighly the appearance of
+% footnotes. See \autoref{sec:footnotedefs}.
+% \item[hyperrefdefs=\meta{true or false}] Load the \pkgname{hyperref} package, and set
+% some defaults settings. See \autoref{sec:hyperrefdefs}.
+% \item[bibliographydefs=\meta{true or false}] Adjust the appearance and style
+% of the bibliography. See \autoref{sec:bibliographydefs}.
+% \end{pkgoptions}
+%
+% \begin{pkgtip}
+% To activate only a subset of features, use \pkgoptionfmt{preset=reset} and then
+% enable only the features required. In this way, you can ensure that only those
+% features which are explicitly specified are enabled.
+% \end{pkgtip}
+%
+%
+% \StopEventually{\PrintChangesAndIndex}
+%
+% \section{Implementation}
+%
+% Here comes the gory code.
+%
+% Let's start by loading the \pkgname{kvoptions} package, which we need to
+% parse the package options. It's better to use \pkgname{xkeyval} as
+% backend, because the |\setkeys| by \pkgname{keyval} is a little fragile:
+% for example, it gets confused if, within a preset, we include a package
+% or run a command which itself parses key-vals.
+%
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+\RequirePackage{kvoptions}
+% \end{macrocode}
+%
+% Also load \pkgname{etoolbox}, for various utilities.
+% \begin{macrocode}
+\RequirePackage{etoolbox}
+% \end{macrocode}
+%
+% \subsection{Internal Generic Code}
+%
+% \begin{macro}{\phfnote@internal@execattribbs}
+% An internal general-purpose macro to execute all definitions given in list of
+% attributes.
+%
+% Often, a list of attributes are given via a package option (e.g.\@ for the abstract),
+% and these attributes need to be executed, or implemented, in the order they are given.
+% This macro takes care of that. Each possible attribute must be defined as a macro
+% with a common prefix, to which the attribute is appended.
+%
+% The arguments are:
+% \begin{itemize}
+% \item |#1| = prefix to look for attributes (e.g.\@ |noteabstract@attr@|);
+% \item |#2| = a human-readable name of what |#1| represents, which is used in an error
+% message in case the required attribute is not found (e.g.\@ |{abstract attribute}|);
+% \item |#3| = the list of attributes specified by the user.
+% \end{itemize}
+%
+% For example, |\phfnote@internal@execattribs{noteabstract@attr@}|\hskip0pt\relax
+% |{abstract attribute}|\hskip0pt\relax |{noname,small}| causes the commands
+% |\noteabstract@attr@noname| and |\noteabstract@attr@small| to be invoked, in this
+% order.
+%
+% \begin{macrocode}
+\def\phfnote@internal@execattribs#1#2#3{%
+ \@for\next:=#3\do{%
+ \ifcsname #1\next\endcsname%
+ \csname #1\next\endcsname%
+ \else%
+ \PackageWarning{phfnote}{Unknown #2: '\next'. Ignoring.}
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Title Styling}
+%
+% See \autoref{sec:title-styles} for a description of the styles and which
+% features are available.
+%
+% \subsubsection{First, some common simple definitions for our different styles}
+%
+% \needspace{3\baselineskip}
+% \begin{macro}{\notetitlefont}
+% \begin{macro}{\notetitleauthorfont}
+% \begin{macro}{\notetitledatefont}
+% These may be redefined to adapt the font of the title, author and date.
+%
+% \begin{macrocode}
+\newcommand{\notetitlefont}{\sffamily\bfseries}
+\newcommand{\notetitleauthorfont}{}
+\newcommand{\notetitledatefont}{\footnotesize}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\notetitlebelowspace}
+% \begin{macro}{\notetitletopspace}
+% These macros may be redefined to adjust spacing above and after the title. They are
+% macros, not lengths, so they can be adjusted dynamically on the spot.
+% \begin{macrocode}
+\newcommand{\notetitlebelowspace}{4mm}
+\newcommand{\notetitletopspace}{-1.2cm}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\notetitlehrule}
+% Allow customization of the horizontal rule below the title. The macro
+% |\notetitlehrule| expands to commands which generate the rule, such as
+% ``|\hrule height 1pt|''.
+% \begin{macrocode}
+\newcommand{\notetitlehrule}{\hrule}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\notetitle@title}
+% Provide a ``long'' definition for |\title|, so that the title can have several
+% paragraphs. Our style handles this by putting the title on several lines, and it can
+% be useful depending on how you want to format the title.
+%
+% This macro will replace |\title| when a title style is actually selected in
+% |\phfnote@do@notetitle|.
+% \begin{macrocode}
+\long\def\notetitle@title#1{\long\gdef\@title{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@title@checksetspace}
+% Some of our title styles require the \pkgname{setspace} package. This utility checks that
+% this package is loaded, and generates an error otherwise.
+%
+% |#1| = the current title style name; this is required only for the error message.
+% \begin{macrocode}
+\def\phfnote@title@checksetspace#1{%
+ \ifdefined\singlespace\else%
+ \PackageError{phfnote}{Note title style `#1' requires the
+ `setspace' package to be loaded! Please load it, or use a
+ pkgset which loads it automatically}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Implementation of \phfverb\thanks{} and \phfverb\thanksmark}
+%
+% Here we provide a few fixes for the implementation of |\thanks|, both for our main
+% `default' title style as well as for other simpler styles. Our implementation supports
+% |\thanks[N]{...}| and |\thanksmark[N]| as for footnotes.
+%
+% These newer implementations are only applied if one of our title styles is set.
+% Otherwise, the class defaults are left (which may be needed, e.g., for \RevTeX).
+%
+% \paragraph{Implementation of \phfverb{\thanks} and friends for our main
+% `default' title style}
+%
+% \begin{macro}{\phfnote@setupthanksmpfootnote}
+% Internal---called at the beginning of a |minipage| environment, it sets up necessary
+% stuff to support |\thanks| notes within the minipage, in a single paragraph.
+%
+% Some of this code was taken or really inspired directly from |latex.ltx|.
+% \begin{macrocode}
+\def\phfnote@setupthanksmpfootnote{%
+% \end{macrocode}
+%
+% The |\thanks| macro is implemented as a |\footnote| in a minipage. So we hack into the
+% `mpfootnote' mechanism.
+% \begin{macrocode}
+ \def\thempfootnote{\arabic{mpfootnote}}%
+ \let\footnoterule\relax%
+ \let\thanks\footnote%
+% \end{macrocode}
+%
+% All footnote material is stored in a macro |\phfnote@mpfootmaterial|, initially
+% empty:\footnote{NOTE: this differs from how footnotes are usually treated (directly
+% typeset into a vbox I think). Not sure what the side-effects might be. Because this is
+% just for simple email/institute info/etc. in the title, hopefully this shouldn't have
+% any serious consequences.}
+% \begin{macrocode}
+ \def\phfnote@mpfootmaterial{}%
+% \end{macrocode}
+% and locally define |\@mpfootnotetext| to store the footnote content into that buffer,
+% \begin{macrocode}
+ \long\def\@mpfootnotetext##1{%
+ \protected@edef\@currentlabel%
+ {\csname p@mpfootnote\endcsname\@thefnmark}%
+ \protected@edef\@tmpa{\protect\phfnote@mympfootnotemark{\@thefnmark}{##1}%
+ \protect\phfnote@mpfootnoteglue}%
+ \expandafter\g@addto@macro\expandafter\phfnote@mpfootmaterial%
+ \expandafter{\@tmpa}%
+ }%
+% \end{macrocode}
+%
+% Also provide |\thanksmark|, so that we can refer to other thanks/footnote-marks.
+% \begin{macrocode}
+ \def\thanksmark[##1]{\phfnote@mympfootnotemark{##1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@finalizempfootnotes}
+% Macro to call at the end of a |minipage| environment, to ensure that all |\footnote|'s
+% (and thus |\thanks|'s) are properly formatted.
+%
+% This simply takes all the tokens collected in |\phfnote@mpfootmaterial| (see just
+% above), and typesets it in the |\@mpfootins| box. The latter is automatically typeset
+% by the minipage in |\end{minipage}|.
+% \begin{macrocode}
+\def\phfnote@finalizempfootnotes{%
+ \global\setbox\@mpfootins=\vbox{%
+ \parskip=0pt\parindent=0pt\parshape 1 0.04\textwidth 0.96\textwidth\relax%
+ \noindent\leavevmode%
+ \reset@font\footnotesize%
+ \phfnote@fmt@titlefootnotes%
+ \phfnote@mpfootmaterial}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \needspace{3\baselineskip}
+% \begin{macro}{\phfnote@fmt@titlefootnotes}
+% \begin{macro}{\phfnote@mympfootnotemark}
+% \begin{macro}{\phfnote@mpfootnoteglue}
+% Some formatting utilities which can be overridden if you know what you're doing.
+% |\phfnote@fmt@titlefootnotes| allows you to override the font in which the
+% title-footnotes/thanks are typeset. |\phfnote@mympfootnotemark| is responsible for
+% formatting its argument as a footnote mark, usually in superscript.
+% |\phfnote@mpfootnoteglue| is the glue which is used between two footnote texts (as
+% they are typeset in a single paragraph).
+% \begin{macrocode}
+\def\phfnote@fmt@titlefootnotes{}
+\def\phfnote@mympfootnotemark#1{\@textsuperscript{\normalfont#1}}
+\def\phfnote@mpfootnoteglue{\hskip 1.2em plus 2em minus 0.5em\relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \paragraph{For those not using the main `default' title style}
+%
+% We use \LaTeX's own |\thanks| mechanism, however we patch on the possibility for using
+% |\thanks[N]{text}| and |\thanksmark[N]| for overriding the number which is used.
+%
+% \begin{macro}{\notetitle@thanksmark}
+% The |\thanksmark| is trivially implemented by |\footnotemark|. Very handy indeed.
+%
+% Again, this macro is only made available as |\thanksmark| when a title style is set in
+% |\phfnote@do@notetitle|.
+% \begin{macrocode}
+\def\notetitle@thanksmark{\footnotemark}
+% \end{macrocode}
+% \end{macro}
+%
+% Start by saving the old |\thanks| macro, just in case.
+% \begin{macrocode}
+\let\phfnote@old@thanks\thanks
+% \end{macrocode}
+%
+% \begin{macro}{\notetitle@thanks}
+% Now, we need to extend \LaTeX's |\thanks| to allow an optional argument as for
+% footnotes. This macro will be renamed |\thanks| in |\phfnote@do@notetitle|.
+%
+% Check whether there is an optional argument; if there is none we execute \LaTeX's
+% original thanks code (replicated here), otherwise, we specify the optional argument
+% explicitly at the relevant location in \LaTeX's implementation:
+% \begin{macrocode}
+\def\notetitle@thanks{\@ifnextchar[\phfnote@thanks{\phfnote@thanks[]}}%]
+\long\def\phfnote@thanks[#1]#2{%
+ \if\relax\detokenize{#1}\relax%
+% \end{macrocode}
+%
+% The optional argument is empty---just execute \LaTeX's original |\thanks| code,
+% replicated here:
+% \begin{macrocode}
+ \footnotemark%
+ \protected@xdef\@thanks{\@thanks\protect\footnotetext[\the\c@footnote]{#2}}%
+% \end{macrocode}
+%
+% Otherwise, execute \LaTeX's original |\thanks| code, but with the optional argument
+% inserted wherever needed:
+% \begin{macrocode}
+ \else% argument, pass on to sub-commands:
+ \footnotemark[#1]%
+ \protected@xdef\@thanks{\@thanks\protect\footnotetext[#1]{#2}}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Title Styles Definition}
+%
+% The title styles are documented in \autoref{sec:title-styles}.
+%
+% \paragraph{Title style: `default'}
+%
+% Implementation our main `default' title style. See \autoref{sec:main-default-title-style}.
+%
+% \begin{macro}{\notetitle@style@default}
+% The default title style. Nothing mysterious, hopefully.
+% \begin{macrocode}
+\newcommand{\notetitle@style@default}{%
+ \begingroup\par\raggedright%
+ \phfnote@setupthanksmpfootnote%
+ \vspace*{\notetitletopspace}%
+ \phfnote@title@checksetspace{default}%
+ \begin{minipage}{\textwidth}%
+ \begin{singlespace}%
+ \parskip=0pt\parindent=0pt\relax%
+ {\let\phfnote@old@par\par%
+ \def\par{\phfnote@old@par%
+ \parskip=1.5ex\relax\parshape 1 0pt \textwidth\relax%
+ \noindent}%
+ \par%
+ \Large {\notetitlefont \@title}\par}%
+ \vskip 2mm\relax
+ \if\relax\detokenize\expandafter{\@author}\relax\else%
+ \par\parshape 1 0.04\textwidth 0.96\textwidth\relax%
+ {\notetitleauthorfont \@author}%
+ \vskip 2mm\relax%
+ \fi
+ \if\relax\detokenize\expandafter{\@date}\relax\else%
+ \par\parshape 1 0.04\textwidth 0.96\textwidth\relax%
+ {\notetitledatefont \@date}
+ \vskip 2mm\relax%
+ \fi
+ \global\let\@thanks\@empty%
+ \phfnote@finalizempfootnotes%
+ \end{singlespace}%
+ \end{minipage}\par%
+ \vspace*{2mm}%
+ \notetitlehrule\relax%
+ \par%
+ \endgroup%
+ \vskip\notetitlebelowspace\relax% don't change this, abstract needs to \removelastskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{Title style: `small'}
+%
+% Implementation an alternate `small' title style.
+%
+% \begin{macro}{\notetitle@style@small}
+% The default title style. Nothing mysterious, hopefully.
+% \begin{macrocode}
+\newcommand{\notetitle@style@small}{%
+ \begingroup\par\raggedright%
+ \let\footnote\thanks%
+ \vspace*{\notetitletopspace}%
+ {\notetitlefont \@title}%
+ \hfill\makebox{\fontsize{9pt}{10pt}\selectfont {\notetitleauthorfont \@author}%
+ \hspace*{2mm}--\hspace*{2mm}{\emph{\notetitledatefont \@date}}}%
+ \vspace*{1mm}\notetitlehrule\relax\vspace*{1mm}%
+ \par%
+ \endgroup%
+ \vskip\notetitlebelowspace\relax% don't change this, abstract needs to \removelastskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{Title style: `article'}
+%
+% Implementation the `article' title style.
+%
+% \begin{macro}{\notetitle@style@article}
+% The title style definition. Nothing mysterious, hopefully.
+% \begin{macrocode}
+\newcommand{\notetitle@style@article}{%
+ \vspace*{-3em}%
+ \begingroup
+ \centering
+ \let\footnote\thanks%
+ {\LARGE \@title \par}%
+ \vskip 1.5em%
+ {\large%
+ \lineskip .5em%
+ \begin{tabular}[t]{c}%
+ \@author%
+ \end{tabular}\par}%
+ \vskip 1.5em%
+ {\large \@date}%
+ \par%
+ \endgroup%
+ \par%
+ \vskip 2.5em\relax%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Plugging into \phfverb{\maketitle}}
+%
+% Actually perform the definitions to make |\maketitle| produce the
+% title with the given style. Specifically, we override
+% |\@maketitle|. The latter is called internally by |\maketitle|, and
+% the advantage of overriding |\@maketitle| only is that we inherit
+% the mechanism provided by the style class to deal with two-column
+% layouts.
+%
+% \begin{macro}{\phfnote@do@notetitle}
+% This macro takes care of installing the correct title into the
+% document, by overriding |\@maketitle|.
+%
+% This macro is called later after processing the package options.
+% Its argument |#1| is the style name, e.g., |default|.
+%
+% \begin{macrocode}
+\def\phfnote@do@notetitle#1{
+% \end{macrocode}
+% If we have an empty title style, then we leave default title provided by the class.
+% \begin{macrocode}
+ \if\relax\detokenize\expandafter{#1}\relax
+ \else
+% \end{macrocode}
+% Otherwise, we have a title style to set. Do some checks that the given style is indeed
+% defined.
+% \begin{macrocode}
+ \ifcsname notetitle@style@#1\endcsname
+ \def\phfnote@tmp@titsty{#1}%
+ \else
+ \PackageError{phfnote}{Unknown title style: '#1'.}{Unknown title
+ style: '#1'. Please consult the package documentation for available
+ styles.}
+ \def\phfnote@tmp@titsty{default}%
+ \fi
+% \end{macrocode}
+% Apply new (default) definitions of |\thanks|, |\thanksmark| and |\title|. Do this here
+% only, because this can clash with more complicated versions from, e.g., \RevTeX.
+% \begin{macrocode}
+ \let\title\notetitle@title
+ \let\thanks\notetitle@thanks
+ \let\thanksmark\notetitle@thanksmark
+% \end{macrocode}
+% Now, actually overload the title style by redefining |\@maketitle|.
+% \begin{macrocode}
+ \def\@maketitle{\csname notetitle@style@\phfnote@tmp@titsty\endcsname}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Abstract}
+%
+% Now we can take care of the abstract. Unlike the title styles, the abstract has a base
+% implementation. Then, we may have attributes which change some parameters.
+%
+%
+% \begin{environment}{notedefaultabstract}
+% First, save the old environment |\begin{abstract}...\end{abstract}| provided by the
+% class (if any).
+% \begin{macrocode}
+\let\notedefaultabstract\abstract
+\let\endnotedefaultabstract\endabstract
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\noteabstracttextfont}
+% \begin{macro}{\noteabstractnamefont}
+% \begin{macro}{\noteabstracttextwidth}
+% \begin{macro}{\noteabstractafterspacing}
+% \begin{macro}{\noteabstractbeforepacing}
+% Macros which can be overridden to customize the abstract. See
+% \autoref{sec:abstract-attributes}.
+% \begin{macrocode}
+\newcommand{\noteabstracttextfont}{}
+\newcommand{\noteabstractnamefont}{\bfseries\small}
+\if@twocolumn
+ \newcommand\noteabstracttextwidth{\hsize}
+\else
+ \newcommand{\noteabstracttextwidth}{0.9\hsize}
+\fi
+\newcommand\noteabstractafterspacing{1.5em}
+\newcommand\noteabstractbeforespacing{1.5em}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\noteabstract@nameline}
+% Create the line which contains the title of the abstract, that is, the word
+% ``Abstract.'' This can be overloaded, of course, for customization.
+% \begin{macrocode}
+\def\noteabstract@nameline{
+ {\parskip=0pt\relax\par\centering\noteabstractnamefont%
+ \abstractname%
+ \par}\vskip 1ex\relax%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{noteabstract}
+% The proper |noteabstract| environment.
+%
+% \begin{macrocode}
+\newenvironment{noteabstract}{%
+ \removelastskip%
+ \vspace{\noteabstractbeforespacing}%
+ \begingroup%
+ \par\noindent\centering%
+ \begin{minipage}{\noteabstracttextwidth}%
+ \noteabstract@nameline%
+ \noteabstracttextfont%
+ }%
+ {%
+ \end{minipage}%
+ \par%
+ \endgroup%
+ \vspace{\noteabstractafterspacing}%
+}
+% \end{macrocode}
+% \end{environment}
+%
+% The abstract can be customized by the attributes. Here we define them:
+% \begin{macrocode}
+\def\noteabstract@attr@wide{%
+ \def\noteabstracttextwidth{\textwidth}%
+}
+\def\noteabstract@attr@narrow{%
+ \if@twocolumn
+ \else
+ \def\noteabstracttextwidth{0.8\textwidth}%
+ \fi
+}
+\def\noteabstract@attr@noname{%
+ \def\noteabstract@nameline{}%\vspace*{1ex}}%
+}
+\def\noteabstract@attr@original{%
+ \let\abstract\notedefaultabstract
+ \let\endabstract\endnotedefaultabstract
+}
+\def\noteabstract@attr@small{%
+ \g@addto@macro\noteabstracttextfont{\small}%
+}
+\def\noteabstract@attr@compact{%
+ \renewcommand\noteabstractafterspacing{1ex}%
+ \renewcommand\noteabstractbeforespacing{1ex}%
+}
+\def\noteabstract@attr@it{%
+ \g@addto@macro\noteabstracttextfont{\itshape}%
+}
+% \end{macrocode}
+%
+% \begin{macro}{\phfnote@do@noteabstract}
+% This helper both defines the |abstract| environment, and also sets the abstract
+% attributes. This macro will be called according to the package options.
+%
+% |#1| = a comma-separated list of attributes.
+% \begin{macrocode}
+\def\phfnote@do@noteabstract#1{
+ \let\abstract\noteabstract
+ \let\endabstract\endnoteabstract
+ \phfnote@internal@execattribs{noteabstract@attr@}{abstract attribute}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Page Geometry Settings}
+%
+% For the page geometry settings, we just have a bunch of styles which we define as
+% macros. The macros just set up |\PassOptionsToPackage| for the \pkgname{geometry} package.
+% Then the correct macro will be selected according to the current \pkgname{phfnote} package
+% options.
+%
+% The description of these settings are given in \autoref{sec:pagegeomdefs}.
+%
+% \begin{macro}{\phfnote@pagegeomstyle@default}
+% Default setting.
+% \begin{macrocode}
+\def\phfnote@pagegeomstyle@default{
+ \if@twocolumn
+ \PassOptionsToPackage{hmargin=1in,vmargin=0.75in,includeheadfoot}{geometry}%
+ \else
+ % fix the margins a bit to make text wider
+ \ifcase\@ptsize% mods for 10 pt
+ \PassOptionsToPackage{hmargin=1.5in,vmargin=1.25in}{geometry}%
+ \or% mods for 11 pt
+ \PassOptionsToPackage{hmargin=1.5in,vmargin=1.25in}{geometry}%
+ \or% mods for 12 pt
+ \PassOptionsToPackage{hmargin=1.25in,vmargin=1.25in}{geometry}%
+ \fi%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@pagegeomstyle@narrow}
+% Narrow style.
+% \begin{macrocode}
+\def\phfnote@pagegeomstyle@narrow{
+ \if@twocolumn
+ \PassOptionsToPackage{hmargin=1.25in,vmargin=0.75in,includeheadfoot}{geometry}%
+ \else
+ % fix the margins a bit to make text wider
+ \ifcase\@ptsize% mods for 10 pt
+ \PassOptionsToPackage{hmargin=1.75in,vmargin=1.5in}{geometry}%
+ \or% mods for 11 pt
+ \PassOptionsToPackage{hmargin=1.75in,vmargin=1.5in}{geometry}%
+ \or% mods for 12 pt
+ \PassOptionsToPackage{hmargin=1.5in,vmargin=1.5in}{geometry}%
+ \fi%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@pagegeomstyle@wide}
+% Wide style.
+% \begin{macrocode}
+\def\phfnote@pagegeomstyle@wide{
+ \if@twocolumn
+ \PassOptionsToPackage{hmargin=0.75in,vmargin=0.75in,includeheadfoot}{geometry}%
+ \else
+ % fix the margins a bit to make text wider
+ \ifcase\@ptsize% mods for 10 pt
+ \PassOptionsToPackage{hmargin=1.25in,vmargin=1.25in}{geometry}%
+ \or% mods for 11 pt
+ \PassOptionsToPackage{hmargin=1.25in,vmargin=1.25in}{geometry}%
+ \or% mods for 12 pt
+ \PassOptionsToPackage{hmargin=1in,vmargin=1.25in}{geometry}%
+ \fi%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@pagegeomstyle@xwide}
+% Extra wide.
+% \begin{macrocode}
+\def\phfnote@pagegeomstyle@xwide{
+ \if@twocolumn
+ \PassOptionsToPackage{hmargin=0.5in,vmargin=0.5in,includeheadfoot}{geometry}%
+ \else
+ % fix the margins a bit to make text wider
+ \ifcase\@ptsize% mods for 10 pt
+ \PassOptionsToPackage{hmargin=1in,vmargin=1.25in}{geometry}%
+ \or% mods for 11 pt
+ \PassOptionsToPackage{hmargin=1in,vmargin=1.25in}{geometry}%
+ \or% mods for 12 pt
+ \PassOptionsToPackage{hmargin=0.75in,vmargin=1.25in}{geometry}%
+ \fi%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@pagegeomstyle@bigmargin}
+% |bigmargin| style.
+% \begin{macrocode}
+\def\phfnote@pagegeomstyle@bigmargin{%
+ \if@twocolumn
+ \PassOptionsToPackage{hmargin=1.5in,vmargin=0.75in,includeheadfoot}{geometry}%
+ \else
+ % fix the margins a bit to make text wider
+ \ifcase\@ptsize% mods for 10 pt
+ \PassOptionsToPackage{hmargin={2.25in,1.75in},vmargin=1.25in}{geometry}%
+ \or% mods for 11 pt
+ \PassOptionsToPackage{hmargin={2.25in,1.75in},vmargin=1.25in}{geometry}%
+ \or% mods for 12 pt
+ \PassOptionsToPackage{hmargin={2in,1.5in},vmargin=1.25in}{geometry}%
+ \fi%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\phfnote@do@pagegeomdefs}
+% Finally, provide a helper to set the page geometry. Just call the right macro.
+% \begin{macrocode}
+\newcommand{\phfnote@do@pagegeomdefs}[1]{
+ \ifcsname phfnote@pagegeomstyle@#1\endcsname
+ \csname phfnote@pagegeomstyle@#1\endcsname
+ \else
+ \PackageWarning{phfnote}{Unknown page geometry style: `#1'!}
+ \fi
+
+ \RequirePackage{geometry}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Text, Paragraph and Line Spacing}
+%
+% \paragraph{Text \& Line Spacing}
+%
+% \begin{macro}{\phfnote@do@spacing}
+% Some cosmetic definitions to adjust line spacing. The line spacing is slightly
+% adjusted according to font size to make the document more readable. Depending on
+% whether the \pkgname{setspace} package is loaded, we use it or go low-level with a
+% redefinition of \LaTeX{}' |\baselinestretch|. If the \pkgname{captions} package is loaded,
+% the figure captions' line spacing is also adjusted.
+%
+% Also set an |\emergencystretch| so that lines get spaced out for underfull boxes,
+% rather than overflowing far into the margin.
+% \begin{macrocode}
+\def\phfnote@do@spacing{
+ \@ifpackageloaded{setspace}{
+ \def\phfnote@dostretch##1{%
+ \setstretch{##1}\phfnote@docaptionstretch{##1}}
+ }{
+ \def\phfnote@dostretch##1{%
+ \renewcommand\baselinestretch{##1}\phfnote@docaptionstretch{##1}}
+ }
+ \@ifpackageloaded{caption}{
+ \def\phfnote@docaptionstretch##1{\captionsetup{font={stretch=##1}}}
+ }{
+ \def\phfnote@docaptionstretch##1{\PackageWarning{phfnote}{Can't
+ set line spacing for captions, because the package `caption'
+ is not loaded. Please load it before `phfnote', or use an
+ appropriate (e.g. `rich') pkgset which loads this package
+ automatically .}}
+ }
+ \if@twocolumn
+ \phfnote@dostretch{1.0} % leave default
+ \emergencystretch=3em\relax
+ \else
+ \ifcase\@ptsize% 10pt
+ \phfnote@dostretch{1.1}
+ \or% 11pt
+ \phfnote@dostretch{1.0} % 1.05? better 1.0...
+ \or% 12pt
+ \phfnote@dostretch{1.0} % 1.03? not really noticeable...
+ \fi
+ \emergencystretch=6em\relax
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{Paragraph Spacing Presets}
+%
+% Here again, we define several possibilities for paragraph settings as
+% individual macros (see \autoref{sec:par-defs}). Depending on the package
+% option, we execute the corresponding macro.
+%
+% \begin{macrocode}
+\def\phfnote@par@original{%
+}
+\def\phfnote@par@indent{%
+ \parindent=1.5em\relax
+ \parskip=0pt\relax
+}
+\def\phfnote@par@indentminiskip{%
+ \parindent=1.5em\relax
+ \parskip=0.3em plus 0.1em\relax
+}
+\def\phfnote@par@skip{%
+ \parindent=0pt\relax
+ \parskip=0.8em plus 0.2em minus 0.1em\relax
+}
+% \end{macrocode}
+%
+% \begin{macro}{\phfnote@do@par}
+% Execute the given paragraph setting. The argument |#1| is the setting, for example,
+% |skip|.
+% \begin{macrocode}
+\def\phfnote@do@par#1{%
+ \ifcsname phfnote@par@#1\endcsname
+ \csname phfnote@par@#1\endcsname
+ \else
+ \PackageWarning{phfnote}{Bad paragraph setting: #1. Leaving original}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Section Styling}
+%
+% Very limited support for styling section and paragraph headers
+% (\autoref{sec:secfmt}). If you want anything serious, use \pkgname{sectsty} or
+% \pkgname{titlesec} directly.
+%
+% \begin{macro}{\notesectionallfont}
+% \begin{macro}{\notesectionallfontfamily}
+% Define the |\notesectionallfont| and |\notesectionallfontfamily|, which
+% control the general font used in section headings.
+% \begin{macrocode}
+\newcommand{\notesectionallfont}{%
+ \fontfamily{\notesectionallfontfamily}\fontseries{bx}\selectfont}
+\newcommand{\notesectionallfontfamily}{ppl}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\notesectionfont}
+% \begin{macro}{\notesubsectionfont}
+% \begin{macro}{\notesubsubsectionfont}
+% \begin{macro}{\noteparagraphfont}
+% \begin{macro}{\notesubparagraphfont}
+% These macros are called for their respective sectioning command,
+% after |\notesectionallfont| has been invoked. (Again, only for
+% those sectioning commands which are styled by us.)
+%
+% \begin{macrocode}
+\newcommand{\notesectionfont}{\large}
+\newcommand{\notesubsectionfont}{\normalsize}
+\newcommand{\notesubsubsectionfont}{\small}
+\newcommand{\noteparagraphfont}{\normalsize}
+\newcommand{\notesubparagraphfont}{\normalsize}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\notesectionsetfonts}
+% \begin{macro}{\noteparagraphsetfonts}
+% Helpers to directly set the font commands for |\section|,
+% |\subsection| and |\subsubsection| (with |\notesectionsetfonts|),
+% and for |\paragraph| and |\subparagraph| (with |\noteparagraphsetfonts|).
+% \begin{macrocode}
+\newcommand{\notesectionsetfonts}[3]{%
+ \renewcommand{\notesectionfont}{#1}%
+ \renewcommand{\notesubsectionfont}{#2}%
+ \renewcommand{\notesubsubsectionfont}{#3}%
+}
+\newcommand{\noteparagraphsetfonts}[2]{%
+ \renewcommand{\noteparagraphfont}{#1}%
+ \renewcommand{\notesubparagraphfont}{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% Define the attributes which the user can set. See
+% \autoref{sec:secfmt}.
+%
+% \begin{macrocode}
+\def\phfnote@do@secfmt@section{
+ \RequirePackage{sectsty}
+ \sectionfont{\notesectionallfont\notesectionfont}
+ \subsectionfont{\notesectionallfont\notesubsectionfont}
+ \subsubsectionfont{\notesectionallfont\notesubsubsectionfont}
+}
+\def\phfnote@do@secfmt@paragraph{
+ \RequirePackage{sectsty}
+ \paragraphfont{\notesectionallfont\noteparagraphfont}
+ \subparagraphfont{\notesectionallfont\notesubparagraphfont}
+}
+\def\phfnote@do@secfmt@compact{
+ \notesectionsetfonts{\normalsize}{\small}{\small}
+}
+\def\phfnote@do@secfmt@larger{
+ \notesectionsetfonts{\Large}{\large}{\normalsize}
+}
+
+\def\phfnote@do@secfmt@secsquares{
+ \RequirePackage{amssymb}
+ \let\phfnote@secsquares@old@seccntformat\@seccntformat
+ \def\@seccntformat##1{%
+ \expandafter\ifx\csname ##1\endcsname\section\relax%
+ \unexpanded{\makebox[0pt][r]{\raisebox{0.15ex}{{%
+ \notesmaller[0.6]\ensuremath{\blacksquare}}}%
+ \hspace*{1.2ex}}}%
+ \fi%
+ \phfnote@secsquares@old@seccntformat{##1}}
+}
+\def\phfnote@do@secfmt@secnummargin{
+ \let\phfnote@secnummargin@old@seccntformat\@seccntformat
+ \def\@seccntformat##1{%
+ \protect\makebox[0pt][r]{\phfnote@secnummargin@old@seccntformat{##1}}}
+}
+
+\def\phfnote@do@secfmt@rmfamily{
+ \renewcommand\notesectionallfontfamily{\rmdefault}
+}
+\def\phfnote@do@secfmt@sffamily{
+ \renewcommand\notesectionallfontfamily{\sfdefault}
+}
+\def\phfnote@do@secfmt@itpar{
+ \def\noteparagraphfont{\normalfont\normalsize\itshape}
+ \def\notesubparagraphfont{\normalfont\normalsize\itshape}
+}
+\def\phfnote@do@secfmt@blockpar{
+ \let\phfnote@old@paragraph\paragraph
+ \def\paragraph##1{%
+ \phfnote@old@paragraph{##1}%
+ \hspace*{0pt}\par\nopagebreak% ugly hack!!
+ }
+}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\phfnote@do@secfmt}
+% Actually perform the required styling, according to the package
+% options given as argument. The argument is a comma-separated list
+% of attributes specified by the user.
+% \begin{macrocode}
+\def\phfnote@do@secfmt#1{%
+ \phfnote@internal@execattribs{phfnote@do@secfmt@}{section formatting preset}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{\LaTeX{} Package Sets}
+%
+% Define the package sets as macros. Depending on the user-specified
+% options we load the corresponding one(s) (several may be specified).
+%
+% See \autoref{sec:package-sets} for a description of what these
+% package sets do.
+%
+% \begin{macro}{\phfnote@do@pkgset@none}
+% \begin{macro}{\phfnote@do@pkgset@minimal}
+% \begin{macro}{\phfnote@do@pkgset@rich}
+% \begin{macro}{\phfnote@do@pkgset@extended}
+% Macros which implement the package sets. Each macro invokes |\RequirePackage|
+% for the appropriate packages.
+% \begin{macrocode}
+\def\phfnote@do@pkgset@none{
+}
+
+\def\phfnote@do@pkgset@minimal{
+
+ \RequirePackage{amsmath}
+ \RequirePackage{amsfonts}
+ \RequirePackage{amssymb}
+ \RequirePackage{amsthm}
+
+ \RequirePackage{xcolor}
+
+}
+
+\def\phfnote@do@pkgset@rich{
+
+ \phfnote@do@pkgset@minimal
+
+ \RequirePackage{setspace}
+ \RequirePackage{caption}
+
+ \RequirePackage{microtype}
+
+ \PassOptionsToPackage{shortlabels}{enumitem}
+ \RequirePackage{enumitem}
+
+ \RequirePackage{graphicx}
+
+ \PassOptionsToPackage{T1}{fontenc}
+ \RequirePackage{fontenc}
+
+ \PassOptionsToPackage{utf8}{inputenc}
+ \RequirePackage{inputenc}
+}
+
+\def\phfnote@do@pkgset@extended{
+
+ \phfnote@do@pkgset@rich
+
+ \RequirePackage{float}
+
+ \RequirePackage{verbdef}
+
+ \PassOptionsToPackage{autostyle,autopunct=true}{csquotes}
+ \RequirePackage{csquotes}
+
+ \RequirePackage{dsfont}
+ \RequirePackage{bbm}
+ \RequirePackage{mathtools}
+
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\phfnote@do@pkgset}
+% Finally, define the helper which will load the required package sets.
+% \begin{macrocode}
+\def\phfnote@do@pkgset#1{
+ \phfnote@internal@execattribs{phfnote@do@pkgset@}{package set}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Hyperref Support and Hyperlinks}
+%
+% \begin{pkgnote}
+% The name `|docnotelinkcolor|' is historical and hard-coded in many
+% other files I've used, so I'm DEFINITELY NOT changing it.
+% \end{pkgnote}
+%
+% \needspace{3\baselineskip}
+% \begin{macro}{\phfnote@do@pdfhyperrefdefs}
+% \begin{macro}{\email}
+% \begin{macro}{\url}
+% Load the \pkgname{hyperref} package and provide sensible defaults.
+% \begin{macrocode}
+\newcommand{\phfnote@do@pdfhyperrefdefs}{%
+% \end{macrocode}
+% Make sure a color-managing package is loaded, {color} or {xcolor}, and define our default color:
+% \begin{macrocode}
+ \phfnote@requirecolorpackage%
+ \definecolor{docnotelinkcolor}{rgb}{0,0,0.4}%
+% \end{macrocode}
+%
+% Load URL package, and save a version of |\url| which is not patched
+% by \pkgname{hyperref}:
+% \begin{macrocode}
+ \RequirePackage{url}%
+ \DeclareUrlCommand\phfnote@format@url{}%
+% \end{macrocode}
+%
+% Set up \pkgname{hyperref} options:
+% \begin{macrocode}
+ \PassOptionsToPackage{bookmarks=true,backref=false}{hyperref}%
+ \RequirePackage{hyperref}%
+ %
+ \hypersetup{unicode=true,%
+ bookmarksnumbered=false,bookmarksopen=false,bookmarksopenlevel=1,%
+ breaklinks=true,pdfborder={0 0 0},colorlinks=true}%
+ \hypersetup{%
+ anchorcolor=docnotelinkcolor,citecolor=docnotelinkcolor,%
+ filecolor=docnotelinkcolor,linkcolor=docnotelinkcolor,%
+ menucolor=docnotelinkcolor,runcolor=docnotelinkcolor,%
+ urlcolor=docnotelinkcolor}%
+% \end{macrocode}
+%
+% Provide an |\email| command for specifying e-mails. Note that the |\url| command is
+% already provided by the packages \pkgname{url} and \pkgname{hyperref}.
+% \begin{macrocode}
+ \let\email\phfnote@email%
+% \end{macrocode}
+%
+% And finally set a nicer default |\url|/|\email| style:
+% \begin{macrocode}
+ \urlstyle{notesf}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\phfnotePdfLinkColor}
+% Set links color. Use as |\phfnotePdfLinkColor|\marg{color}.
+% Color may be any color name or specification recognized by the
+% \pkgname{xcolor} package.
+%
+% \begin{macrocode}
+\newcommand{\phfnotePdfLinkColor}[1]{%
+ \@ifpackageloaded{xcolor}{%
+ \colorlet{docnotelinkcolor}{#1}%
+ }{% else:
+ \PackageWarning{phfnote}{\protect\phfnotePdfLinkColor may only be
+ used if the package xcolor is loaded.}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \needspace{3\baselineskip}
+% \begin{macro}{\phfnote@sanitize@url}
+% \begin{macro}{\phfnote@format@url}
+% \begin{macro}{\phfnote@email}
+% Provide base macros to be able to build up |\email| command for emails and other
+% URL-like commands which should sanitize their arguments.
+%
+% Also prepare the command |\phfnote@email| which will be renamed |\email| in our
+% \pkgname{hyperref} package setup (see above).
+%
+% \begin{macrocode}
+\def\phfnote@sanitize@url{%
+ \catcode`\$12%
+ \catcode`\&12%
+ \catcode`\#12%
+ \catcode`\^12%
+ \catcode`\_12%
+ \catcode`\%12%
+ % \catcode`\^^J10% newline = space
+ % \catcode`\^^M10% newline = space
+ \relax%
+}%
+\providecommand\phfnote@format@url{\texttt}
+\def\phfnote@email{\begingroup\phfnote@sanitize@url\phfnote@impl@email@}%
+\def\phfnote@impl@email@#1{\endgroup\href{mailto:#1}{\phfnote@format@url{#1}}}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\phfnote@requirecolorpackage}
+% And finally define an internal utility to make sure that a color package (either
+% \pkgname{color} or \pkgname{xcolor}) is loaded. If none are loaded, the \pkgname{xcolor} package is loaded.
+% \begin{macrocode}
+\def\phfnote@requirecolorpackage{%
+ \@ifpackageloaded{color}{%
+ }{%
+ \@ifpackageloaded{xcolor}{%
+ }{%
+ \RequirePackage{xcolor}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Cosmetic Font Definitions}
+%
+% \begin{macro}{\phfnote@do@fontdefs}
+% Minimalist cosmetic definition for fonts: load the |T1| font
+% encoding which is better. Also, use Computer Modern Bright as
+% sans-serif font by default instead of Computer Modern Sans Serif.
+%
+% \begin{macrocode}
+\def\phfnote@do@fontdefs{
+
+ \PassOptionsToPackage{T1}{fontenc}
+ \RequirePackage{fontenc}
+
+ \renewcommand\sfdefault{cmbr}
+
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Bibliography Stuff}
+%
+% Provide some fixes for the bibliography.
+%
+% \begin{macro}{\phfnote@bibstyle}
+% \begin{macro}{\phfnote@bibfont}
+% Our default bibliography style is stored in |\phfnote@bibstyle|.
+% By default, it's our own hacked version of the |naturemag| style.
+% The font in which to typeset the bibliography is stored in
+% |\phfnote@bibfont|. By default, it's a little smaller than the
+% main text.
+% \begin{macrocode}
+\newcommand{\phfnote@bibstyle}{naturemagdoi}
+\newcommand{\phfnote@bibfont}{\fontsize{9}{11}\selectfont}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\phfnote@bibliography}
+% These are a tentative implementation for |\bibliography|. The latter will be set to
+% this implementation according to the user's package options.
+% \begin{macrocode}
+\let\phfnote@old@bibliography\bibliography
+\let\phfnote@old@bibliographystyle\bibliographystyle
+\newcommand{\phfnote@bibliography}[1]{%
+ \begingroup%
+ \phfnote@bibfont%
+ \phfnote@old@bibliographystyle{\phfnote@bibstyle}%
+% \end{macrocode}
+%
+% Our hack: make sure that the next instance of |\section*| will generate a TOC
+% entry. (See |\phfnoteHackSectionStarWithTOC|.)
+% \begin{macrocode}
+ \phfnoteHackSectionStarWithTOC%
+% \end{macrocode}
+%
+% Some special chars may appear in output of some ill-advised bibliography
+% managers. Mostly the |&| symbol, such as in |Taylor & Francis|. We won't be needing a
+% \LaTeX{} alignment operator here, so just make |&| a normal printable character
+% (``other'' catcode).
+% \begin{macrocode}
+ \catcode`\&=12\relax% normal char
+% \end{macrocode}
+%
+% Adjust the appearance of e-prints. We assume e-prints refer to the arXiv; here we
+% generate a hyperlink and format them better.
+%
+% \begin{macrocode}
+ \providecommand\eprint[2][]{\href{http://arxiv.org/abs/##2}{arXiv:##2}}
+% \end{macrocode}
+%
+% Relay the call to the ``old'' |\bibliography| command to actually implement the
+% bibliography.
+% \begin{macrocode}
+ \phfnote@old@bibliography{#1}%
+ \endgroup%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\phfnote@bibliographystyle}
+% Tentative implementation of |\bibliographystyle|. Just register the new style in an
+% internal variable, so that the style is actually loaded in |\phfnote@bibliography|.
+%
+% This will be renamed to replace |\bibliographystyle| later, according to package
+% options.
+% \begin{macrocode}
+\newcommand{\phfnote@bibliographystyle}[1]{%
+ \renewcommand{\phfnote@bibstyle}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\phfnote@do@bibliographydefs}
+% Make our changes live. Will be called later according to package options.
+% \begin{macrocode}
+\def\phfnote@do@bibliographydefs{%
+ \let\bibliographystyle\phfnote@bibliographystyle%
+ \let\bibliography\phfnote@bibliography%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Better Footnote Style}
+%
+% \begin{macro}{\phfnote@do@footnotedefs}
+% Adjust the formatting of footnotes so they look better. Again,
+% this is called later according to the package options.
+% \begin{macrocode}
+\def\phfnote@do@footnotedefs{
+ \let\phfnote@orig@makefnmark\@makefnmark
+%% \def\@makefnmark{\hbox{\@textsuperscript{%
+%% \normalfont\tiny\fontseries{sb}\selectfont\@thefnmark}}}
+ \def\@makefnmark{\hbox{\@textsuperscript{%
+ \normalfont\tiny\bfseries\@thefnmark}}}
+%% \def\@makefnmark{\hbox{\@textsuperscript{%
+%% \normalfont\scriptsize\bfseries\@thefnmark}}}% too large
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Other Stand-Alone Definitions and Helpers}
+% \label{sec:impl-other-stand-alone-defs}
+%
+% \subsubsection{A \phfverb{\notesmaller} command}
+%
+%
+% \begin{macro}{\notesmaller}
+% Relative font size command. Makes the text a fraction smaller
+% than its surroundings. The fraction is either given explicitly as
+% optional argument (1.0=same size) or is by default set by
+% |\notesmallerfrac|.
+%
+% To impalement this, we exploit the fact that \LaTeX{} saves the
+% current font size in the macro |\f@size|.
+% \begin{macrocode}
+\newcommand\notesmaller[1][\notesmallerfrac]{%
+ \fontsize{#1\dimexpr\f@size pt\relax}{#1\dimexpr\f@baselineskip pt\relax}%
+ \selectfont\ignorespaces%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\notesmallerfrac}
+% Default fraction by which |\notesmaller| acts. Redefine to change defaults.
+% \begin{macrocode}
+\def\notesmallerfrac{0.9}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Customized, ``Inline,'' Table of Contents}
+%
+% \begin{macro}{\inlinetoc}
+% Just a customized table of contents. Horizontal rules before and
+% after, and spacing is adjusted, and no ``Contents'' title. The
+% table of contents looks just like at the \hyperref[sec:toc]{top of
+% this document}. The command is described in
+% \autoref{sec:inline-toc}.
+%
+% We call |\@starttoc| directly, bypassing the |\section*| included by
+% |\tableofcontents| (see definition |\tableofcontents| in latex sources).
+% \begin{macrocode}
+\newcommand{\inlinetoc}{%
+ \begingroup%
+ \vspace*{2mm}%
+ \hrule%
+ \vspace*{2mm}%
+ \parskip=1pt\relax%
+ \@starttoc{toc}%
+ \vspace*{4mm}%
+ \hrule%
+ \vspace*{6mm}%
+ \endgroup%
+}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsubsection{URL Styles}
+%
+% \needspace{7\baselineskip}
+% \begin{macro}{\url@notettstyle}
+% \begin{macro}{\url@notesfstyle}
+% \begin{macro}{\url@notesfssstyle}
+% \begin{macro}{\url@noteitsfstyle}
+% \begin{macro}{\url@notermstyle}
+% \begin{macro}{\url@noteitstyle}
+% \begin{macro}{\url@notesmlstyle}
+% We also provide some URL styles. These can directly set with
+% |\urlstyle|\marg{style-name}.
+%
+% \begin{macrocode}
+\def\url@notettstyle{%
+ \def\UrlFont{\ttfamily\notesmaller}%
+ \phfnote@urlstyle@common%
+}
+\def\url@notesfstyle{%
+ \def\UrlFont{\sffamily\notesmaller}%
+ \phfnote@urlstyle@common%
+}
+\def\url@notesfssstyle{%
+ \def\UrlFont{\fontfamily{cmss}\selectfont\notesmaller}%
+ \phfnote@urlstyle@common%
+}
+\def\url@noteitsfstyle{%
+ \def\UrlFont{\sffamily\itshape\notesmaller}%
+ \phfnote@urlstyle@common%
+}
+\def\url@notermstyle{%
+ \def\UrlFont{\rmfamily\notesmaller}%
+ \phfnote@urlstyle@common%
+}
+\def\url@noteitstyle{%
+ \def\UrlFont{\itshape\notesmaller}%
+ \phfnote@urlstyle@common%
+}
+\def\url@notesmlstyle{%
+ \def\UrlFont{\notesmaller}%
+ \phfnote@urlstyle@common%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@urlstyle@common}
+% The following code is common to all our styles. We do an ugly hack
+% in which the tilde character (`\textasciitilde') is fixed to the
+% tilde char in the Adobe Times font (|ptm| code), so that it looks
+% nicer and its alignment is correct.
+% \begin{macrocode}
+\def\phfnote@url@tilde{\hbox{\fontfamily{ptm}\selectfont\textasciitilde}}
+%%\def\phfnote@url@tilde{\raise-0.8ex\hbox{%
+%% \kern-0.2ex\fontfamily{cmbr}\selectfont\textasciitilde}}
+\def\phfnote@urlstyle@common{%
+ \def\UrlTildeSpecial{\do\~{\phfnote@url@tilde}}%
+ \let\Url@force@Tilde\UrlTildeSpecial%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Utility to Add TOC Entry For Starred Section }
+%
+% Here we provide an ugly hack which introduces an entry in the table
+% of contents for |\section*| commands.
+%
+% [Note: An existing way of adding the toc entry in these cases is to issue
+% a |\addcontentsline| command before the relevant command
+% (say |\bibliography|). However this is unreliable, because on page
+% boundaries the |\addcontentsline| will pick up the previous page. This
+% is why |\addcontentsline| should be issued right \emph{after} the
+% |\section*| command.]
+%
+% \begin{pkgwarning}
+% This command is truly a hack, don't apply it globally! It forces
+% (locally) the |\section| command to be followed by a `|*|' ! Do this
+% within a group, just before a command which you are sure is
+% invoking |\section*| (such as |\bibliography| in the \pkgname{article}
+% class).
+% \end{pkgwarning}
+%
+% \begin{macro}{\phfnoteHackSectionStarWithTOC}
+% Locally force |\section| to be followed by |*| and introduce an
+% entry in the table of contents.
+% \begin{macrocode}
+\def\phfnoteHackSectionStarWithTOC{%
+ \let\phfnote@old@section\section%
+ \def\section*##1{\phfnote@old@section*{##1}\addcontentsline{toc}{section}{##1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnoteHackSectionStarWithTOCInCommand}
+% Patches the given command (|#1|), which is known to invoke
+% |\section*|, to locally first invoke
+% |\phfnoteHackSectionStarWithTOC| and thus generate a TOC entry.
+%
+% \begin{macrocode}
+\def\phfnoteHackSectionStarWithTOCInCommand#1{%
+ \expandafter\let\csname phfnote@old@\string#1\endcsname#1%
+ \gdef#1{%
+ \begingroup%
+ \phfnoteHackSectionStarWithTOC%
+ \csname phfnote@old@\string#1\endcsname%
+ \endgroup%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Hack to save \& restore a set of commands}
+%
+% Exactly what it sounds like. You can store a set of commands, specified by
+% their name, by specifying an identifier. The commands corresponding to a
+% given identifier can then later be restored.
+%
+% \begin{macro}{\phfnoteSaveDefs}
+% The command |\phfnoteSaveDefs|\marg{identifier}\marg{list of macro names}
+% saves the current definitions of the given list of macro and associates them
+% to the given identifier.
+% The list of macros is specified as a comma-separated list of macro names.
+% \begin{macrocode}
+\def\phfnoteSaveDefs#1#2{%
+% \end{macrocode}
+%
+% The macro |\phfnote@restoredefs@<identifier>| will store the code necessary to
+% restore the macros.
+% \begin{macrocode}
+ \csgdef{phfnote@restoredefs@#1}{}%
+% \end{macrocode}
+%
+% Iterate over the macros we are supposed to store.
+% \begin{macrocode}
+ \def\@tmpa{#2}%
+ \@for\next:=\@tmpa\do{%
+% \end{macrocode}
+%
+% For each macro we are supposed to store (whose name is given in |\next|), we
+% |\let| |\phfnote@restoredefs@<identifier>@<macro-name>| store the current value
+% of the macro.
+% \begin{macrocode}
+ \global\csletcs{phfnote@restoredefs@#1@\next}{\next}%
+% \end{macrocode}
+%
+% Then, we append to |\phfnote@restoredefs@<identifier>| the code necessary to
+% restore this macro. That code is simply a |\cslet| instruction.
+%
+% Recall that |\xappto| expands its second argument (as |\xdef| does), allowing
+% us to expand the value of |\next|.
+% \begin{macrocode}
+ \expandafter\xappto\csname phfnote@restoredefs@#1\endcsname{%
+ \noexpand\csletcs{\next}{phfnote@restoredefs@#1@\next}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnoteRestoreDefs}
+% Restores the macro saved by |\phfnoteSaveDefs|. We simply execute the macro
+% |\phfnote@restoredefs@<identifier>|, in which we duly stored the code
+% necessary to restore all the saved macros.
+% \begin{macrocode}
+\def\phfnoteRestoreDefs#1{%
+ \ifcsname phfnote@restoredefs@#1\endcsname%
+ \csname phfnote@restoredefs@#1\endcsname%
+ \else%
+ \PackageError{phfnote}{\string\phfnoteRestoreDefs: no such
+ definitions stored (#1)}
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{A utility for verbatim stuff in arguments of other macros}
+%
+% FIXME: DOCUMENT ME!
+%
+% A utility for using verbatim stuff in arguments of other macros---exploit
+% |\detokenize|
+%
+% \begin{macrocode}
+\def\phfverb#1{%
+ \ifx\protect\relax%
+ \phfverbfmt{\detokenize{#1}\unskip}%
+ \else%
+ \noexpand\phfverb{\unexpanded{#1}}%
+ \fi%
+}
+\def\phfverbfmt#1{{\normalfont\texttt{#1}}}
+% \end{macrocode}
+%
+% \subsection{Handle Package Options}
+%
+% \subsubsection{Define and Parse Package Options}
+%
+% Initialization code for \pkgname{kvoptions} for our package options. See \autoref{sec:package-options}.
+%
+% \begin{macrocode}
+\SetupKeyvalOptions{
+ family=phfnote,
+ prefix=phfnote@opt@
+}
+% \end{macrocode}
+%
+%
+% The title style to use. \marginpar{\raggedleft \phfverb{[title=...]}}
+% See \autoref{sec:title-styles}.
+% \begin{macrocode}
+\DeclareStringOption[default]{title}
+% \end{macrocode}
+%
+%
+% Option for abstract attributes \marginpar{\raggedleft
+% \phfverb{[abstract=...]}} (\autoref{sec:abstract-attributes}).
+% \begin{macrocode}
+\DeclareStringOption[]{abstract}
+% \end{macrocode}
+%
+% Option for Package sets \marginpar{\raggedleft \phfverb{[pkgset=...]}}
+% (\autoref{sec:package-sets})
+% \begin{macrocode}
+\DeclareStringOption[rich]{pkgset}
+% \end{macrocode}
+%
+% Define the page geometry. \marginpar{\raggedleft
+% \phfverb{[pagegeomdefs=...]}} \marginpar{\raggedleft \phfverb{[pagegeom=...]}}
+% See \autoref{sec:pagegeomdefs}.
+% \begin{macrocode}
+\DeclareBoolOption[true]{pagegeomdefs}
+\DeclareComplementaryOption{nopagegeomdefs}{pagegeomdefs}
+\DeclareStringOption[default]{pagegeom}
+% \end{macrocode}
+%
+%
+%
+% Styling of section headings. \marginpar{\raggedleft \phfverb{[secfmt=...]}}
+% See \autoref{sec:secfmt}.
+% \begin{macrocode}
+\DeclareStringOption[section]{secfmt}
+% \end{macrocode}
+%
+% How to treat paragraphs. \marginpar{\raggedleft \phfverb{[par=...]}} See
+% \autoref{sec:par-defs}.
+% \begin{macrocode}
+\DeclareStringOption[skip]{par}
+% \end{macrocode}
+%
+% Add definitions to adjust spacing of lines and words. \marginpar{\raggedleft
+% \phfverb{[spacingdefs=...]}} See \autoref{sec:spacingdefs}.
+% \begin{macrocode}
+\DeclareBoolOption[true]{spacingdefs}
+\DeclareComplementaryOption{nospacingdefs}{spacingdefs}
+% \end{macrocode}
+%
+% Do some adjustments to the fonts. \marginpar{\raggedleft
+% \phfverb{[fontdefs=...]}} See \autoref{sec:fontdefs}.
+% \begin{macrocode}
+\DeclareBoolOption[true]{fontdefs}
+\DeclareComplementaryOption{nofontdefs}{fontdefs}
+% \end{macrocode}
+%
+% Adjustments for footnotes. \marginpar{\raggedleft
+% \phfverb{[footnotedefs=...]}} See \autoref{sec:footnotedefs}.
+% \begin{macrocode}
+\DeclareBoolOption[true]{footnotedefs}
+\DeclareComplementaryOption{nofootnotedefs}{footnotedefs}
+% \end{macrocode}
+%
+% Load hyperref and corresponding definitions. \marginpar{\raggedleft
+% \phfverb{[hyperrefdefs=...]}} See \autoref{sec:hyperrefdefs}.
+% \begin{macrocode}
+\DeclareBoolOption[true]{hyperrefdefs}
+\DeclareComplementaryOption{nohyperrefdefs}{hyperrefdefs}
+% \end{macrocode}
+%
+% Adjustments for bibliography, including default style. \marginpar{\raggedleft
+% \phfverb{[bibliographydefs=...]}} See \autoref{sec:bibliographydefs}.
+% \begin{macrocode}
+\DeclareBoolOption[true]{bibliographydefs}
+\DeclareComplementaryOption{nobibliographydefs}{bibliographydefs}
+% \end{macrocode}
+%
+%
+% Preset option. \marginpar{\raggedleft \phfverb{[preset=...]}} See
+% \autoref{sec:presets}.
+% \begin{macrocode}
+\define@key{phfnote}{preset}{%
+ \ifcsname phfnote@preset@#1\endcsname%
+ \csname phfnote@preset@#1\endcsname%
+ \else%
+ \PackageError{phfnote}{Unknown preset: `#1'!}{You specified the
+ option 'preset=...' with an invalid value. Please look up the
+ package documentation corresponding to your version of phfnote
+ for possible values.}
+ \fi%
+}
+% \end{macrocode}
+%
+%
+% Provide the standard error message for unknown options.
+% \begin{macrocode}
+\DeclareDefaultOption{%
+ \@unknownoptionerror
+}
+% \end{macrocode}
+%
+% \subsubsection{Define Global Presets}
+% \label{impl:presets}
+%
+% Define the global presets here. See \autoref{sec:presets} for a description
+% of what these presets do.
+%
+% \begin{macro}{\phfnote@hook@atendload}
+% A hook for presets to do stuff at the end of package load.
+% \begin{macrocode}
+\def\phfnote@hook@atendload{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\phfnote@preset@article}
+% Article preset.
+% \begin{macrocode}
+\def\phfnote@preset@article{
+ \def\phfnote@opt@title{article}
+ \def\phfnote@opt@par{indent}
+ \def\phfnote@opt@pagegeom{default}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@presetcommon@xnote}
+% Specify some common definitions for all our |*note| preset styles. The
+% optional argument is the URL style to set.
+% \begin{macrocode}
+\newcommand\phfnote@presetcommon@xnote[1][noteitsf]{
+ \def\phfnote@opt@title{default}
+ \def\phfnote@opt@par{skip}
+ \phfnote@opt@pagegeomdefstrue
+ \def\phfnote@opt@pagegeom{wide}
+ \setlength{\footnotesep}{5pt}
+ \g@addto@macro\phfnote@hook@atendload{
+ \ifdefined\urlstyle
+ \urlstyle{#1}
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \needspace{5\baselineskip}
+% \begin{macro}{\phfnote@preset@sfnote}
+% \begin{macro}{\phfnote@preset@sfssnote}
+% \begin{macro}{\phfnote@preset@opensansnote}
+% \begin{macro}{\phfnote@preset@utopianote}
+% \begin{macro}{\phfnote@preset@mnmynote}
+% Define the different |*note| styles.
+% \begin{macrocode}
+\def\phfnote@preset@sfnote{
+ \phfnote@presetcommon@xnote
+ \phfnote@opt@footnotedefstrue
+ \phfnote@opt@fontdefstrue
+ \renewcommand\familydefault{\sfdefault}
+ \renewcommand{\notesectionallfontfamily}{\sfdefault}
+}
+\def\phfnote@preset@sfssnote{
+% \end{macrocode}
+% set up all the settings as for |sfnote| \ldots
+% \begin{macrocode}
+ \phfnote@preset@sfnote
+% \end{macrocode}
+% \ldots but override:
+% \begin{macrocode}
+ \phfnote@opt@fontdefsfalse
+ \PassOptionsToPackage{T1}{fontenc}
+ \RequirePackage{fontenc}
+ \renewcommand\sfdefault{cmss}
+}
+\def\phfnote@preset@opensansnote{
+% \end{macrocode}
+% set up all the settings as for |sfnote| \ldots
+% \begin{macrocode}
+ \phfnote@preset@sfnote
+% \end{macrocode}
+% \ldots but override:
+% \begin{macrocode}
+ \phfnote@opt@fontdefsfalse
+ \PassOptionsToPackage{T1}{fontenc}
+ \RequirePackage{fontenc}
+ \PassOptionsToPackage{default,osfigures,scale=0.9}{opensans}
+ \RequirePackage{opensans}
+}
+\def\phfnote@preset@utopianote{
+ \phfnote@presetcommon@xnote[noteit]
+ \phfnote@opt@fontdefsfalse
+ \PassOptionsToPackage{T1}{fontenc}
+ \RequirePackage{fontenc}
+ \RequirePackage{fourier}
+ \renewcommand{\notesectionallfontfamily}{put}
+ \renewcommand{\notetitlefont}{\bfseries}
+ \renewcommand{\sfdefault}{phv}
+}
+\def\phfnote@preset@mnmynote{
+ \phfnote@presetcommon@xnote[noteit]
+ \phfnote@opt@footnotedefsfalse
+ \phfnote@opt@fontdefsfalse
+ \PassOptionsToPackage{T1}{fontenc}
+ \RequirePackage{fontenc}
+ \renewcommand{\notesectionallfontfamily}{\sfdefault}
+% \end{macrocode}
+%
+% Require these packages AFTER the default package set, because some symbols may
+% be defined in package sets, and I've had problems with re-definitions
+% etc\ldots anyway this seems to work this way:
+% \begin{macrocode}
+ \g@addto@macro\phfnote@hook@atendload{
+ \RequirePackage{MnSymbol}
+ \PassOptionsToPackage{medfamily,textosf,mathlf,minionint,footnotefigures}{MinionPro}
+ \RequirePackage{MinionPro}
+ \PassOptionsToPackage{medfamily}{MyriadPro}
+ \RequirePackage{MyriadPro}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\phfnote@preset@pkgdoc}
+% Preset for a package documentation.
+%
+% Start by setting the same settings as for other |Xnote| presets.
+% \begin{macrocode}
+\def\phfnote@preset@pkgdoc{
+ \phfnote@presetcommon@xnote[noteit]
+ \phfnote@opt@fontdefsfalse
+% \end{macrocode}
+%
+% Then set up the font, which is done in a separate macro
+% |\phfnote@pkgdoc@setupfont| in case individual documents would like more
+% specific settings. (For example, some packages may want a different math
+% font.)
+% \begin{macrocode}
+ \phfnote@pkgdoc@setupfont
+% \end{macrocode}
+%
+% Finally, set up general appearance.
+% \begin{macrocode}
+ \def\phfnote@opt@secfmt{section,paragraph,itpar,blockpar,larger,secsquares,secnummargin}
+ \def\phfnote@opt@pagegeom{bigmargin}
+ \def\phfnote@opt@abstract{noname}
+}
+% \end{macrocode}
+%
+% Also provide a helper macro which is to load the font packages we
+% want. By default, we use Utopia fonts via the \pkgname{fourier}
+% package, but some package documentations may want a different math
+% font. Override |\phfnote@pkgdoc@setupfont| to adjust the whole font
+% set-up, or |\phfnote@pkgdoc@setupmainfont| to adjust only the main
+% document font.
+% \begin{macrocode}
+\providecommand\phfnote@pkgdoc@setupfont{
+ \PassOptionsToPackage{T1}{fontenc}
+ \RequirePackage{fontenc}
+ \phfnote@pkgdoc@setupmainfont
+ \renewcommand{\notesectionallfontfamily}{put}
+ \renewcommand{\notetitlefont}{\bfseries}
+ \IfFileExists{opensans.sty}{}{\PackageError{phfnote}{Font OpenSans is not
+ available (need `opensans' package)}{Please install the opensans
+ package, which provides the OpenSans font.}}
+ \def\opensans@scale{s*[0.85]}
+ \renewcommand{\sfdefault}{fosj}
+}
+\providecommand\phfnote@pkgdoc@setupmainfont{\RequirePackage{fourier}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\phfnote@preset@xpkgdoc}
+% Same as |preset=pkgdoc|, but also provide some handy hacks and
+% commands.
+%
+% \begin{macrocode}
+\def\phfnote@preset@xpkgdoc{
+ \phfnote@preset@pkgdoc
+% \end{macrocode}
+%
+% Include the \pkgname{verbdef} package, because it's always useful.
+% \begin{macrocode}
+ \RequirePackage{verbdef}
+% \end{macrocode}
+%
+% \textbf{Some patching first:}
+% Patch up |\PrintChanges| and |\PrintIndex|, if they are defined (for if we are
+% using the \pkgname{ltxdoc} package for latex package documentation). We want
+% these to generate an entry in the table of contents. Also provide the utility
+% |\PrintChangesAndIndex|, which calls both |\PrintChanges| and |\PrintIndex| with
+% some additional spacing.
+% \begin{macrocode}
+ \ifdefined\PrintChanges
+ \phfnoteHackSectionStarWithTOCInCommand\PrintChanges
+ \fi
+ \ifdefined\PrintIndex
+ \phfnoteHackSectionStarWithTOCInCommand\PrintIndex
+ \fi
+ \def\PrintChangesAndIndexSpacing{\vspace{3cm plus 2cm minus 2cm}}
+ \def\PrintChangesAndIndex{\PrintChangesAndIndexSpacing\PrintChanges
+ \PrintChangesAndIndexSpacing\PrintIndex}
+% \end{macrocode}
+%
+% Set the index to TWO columns only (three is too tight).
+% \begin{macrocode}
+ \ifdefined\c@IndexColumns
+ \setcounter{IndexColumns}{2}
+ \fi
+% \end{macrocode}
+%
+% And set the glossary, that is, the list of changes history to single-column. For this,
+% renew the environment completely to remove the |multicols| environment.
+% \begin{macrocode}
+ \let\phfnote@xpkgdoc@old@theglossary\theglossary
+ \let\phfnote@xpkgdoc@old@endtheglossary\endtheglossary
+ \renewenvironment{theglossary}{%
+ \glossary@prologue%
+ \GlossaryParms \let\item\@idxitem \ignorespaces}
+ {}
+% \end{macrocode}
+%
+%
+% \textbf{Hyperref:} No ``default'' \pkgname{hyperref} definitions, we'll use
+% \pkgname{hyperdoc} instead.
+% \begin{macrocode}
+ \phfnote@opt@hyperrefdefsfalse
+ \g@addto@macro\phfnote@hook@atendload{
+ \definecolor{docnotelinkcolor}{rgb}{0,0,0.4}%
+ \RequirePackage{url}%
+ \DeclareUrlCommand\phfnote@format@url{}%
+ \RequirePackage{hypdoc}
+ %
+ \hypersetup{bookmarks=true,backref=false,unicode=true,%
+ bookmarksnumbered=false,bookmarksopen=false,bookmarksopenlevel=1,%
+ breaklinks=true,pdfborder={0 0 0},colorlinks=true}%
+ \hypersetup{%
+ anchorcolor=docnotelinkcolor,citecolor=docnotelinkcolor,%
+ filecolor=docnotelinkcolor,linkcolor=docnotelinkcolor,%
+ menucolor=docnotelinkcolor,runcolor=docnotelinkcolor,%
+ urlcolor=docnotelinkcolor}%
+ \let\email\phfnote@email%
+ \urlstyle{noteit}
+ }
+% \end{macrocode}
+%
+% \textbf{Provide Macro:} |\pkgname|\marg{package name} to format a package
+% name. Also place it in the general index. This command is robust and
+% can be used in section titles etc.
+% \begin{macrocode}
+ \def\pkgname##1{%
+ \pkgnamefmt{##1}%
+ \index{##1=\pkgnamefmt{##1}|hyperpage}%
+ \index{packages:>##1=\pkgnamefmt{##1}|hyperpage}%
+ }
+ \robustify\pkgname
+ \def\pkgnamefmt##1{\textsf{##1}}
+ \robustify\pkgnamefmt
+% \end{macrocode}
+%
+%
+% \textbf{Provide Macros:} |\changed| and |\changedreftext|, with more
+% advanced support for displaying changes in package functionality or API.
+%
+% First, we need a counter for the x-ref system.
+% \begin{macrocode}
+ \newcounter{phfnotechanged}
+% \end{macrocode}
+%
+% Mark changes in the implementation section of the package documentation
+% with the command |\changed|\oarg{label
+% name}\marg{v1.0}\marg{2016/05/22}\marg{description}. This command
+% automatically adds the change to the package's change history list, and
+% allows you to refer to this change anywhere else in the package doc with
+% |\changedreftext|.
+% \begin{macrocode}
+ \newcommand*\changed[4][]{%
+% \end{macrocode}
+%
+% First, if no label is given as optional argument, then just display the
+% change and add it to the package changes list.
+% \begin{macrocode}
+ \if\relax\detokenize{##1}\relax%
+ \changedtextfmt{##2}{##3}{##4}%
+ \changes{##2}{##3}{##4}%
+ \else%
+% \end{macrocode}
+%
+% If a label name is provided as optional argument, then we need to write
+% some stuff to the \texttt{.aux} file to make the change visible in the
+% whole document.
+% \begin{macrocode}
+ \protected@edef\phfnotechanged@tmpa{{##2}{##3}{##4}}%
+ \immediate\write\@auxout{\string\phfnote@changed@set%
+ {##1}{\expandonce\phfnotechanged@tmpa}}%
+ \par\hspace*{0pt}\refstepcounter{phfnotechanged}\label{phfnotechanged:##1}%
+ \begingroup\let\phfnote@changedreftext@par\relax
+ \changedreftext{##1}%
+ \endgroup
+ \changes{##2}{##3}{\hyperref[phfnotechanged:##1]{##4}}%
+ \fi
+ }
+ \def\phfnote@changed@set##1{%
+ \expandafter\gdef\csname phfnote@changed@lbl@##1\endcsname%
+ }
+% \end{macrocode}
+%
+% When you document changes with the help of |\changed|, you may refer to
+% any specific change from anywhere else in the package doc with the help
+% of |\changedreftext|\marg{label name}.
+% \begin{macrocode}
+ \def\phfnote@changedreftext@par{\par}
+ \newcommand*\changedreftext[1]{%
+ \phfnote@changedreftext@par%
+ \ifcsname phfnote@changed@lbl@##1\endcsname
+ \hyperref[phfnotechanged:##1]{%
+ \expandafter\expandafter\expandafter\changedtextfmt%
+ \csname phfnote@changed@lbl@##1\endcsname
+ }
+ \else
+ \hyperref[phfnotechanged:##1]{%
+ \changedtextfmt{???}{???}{[\textbf{missing ref}]}%
+ }%
+ \fi
+ \par
+ }
+% \end{macrocode}
+%
+% The macro |\changedtextfmt|\marg{v1.0}\marg{2016/05/22}\marg{description}
+% takes care of formatting the change on the spot.
+% \begin{macrocode}
+ \newcommand*\changedtextfmt[3]{%
+ \textit{Changed in {##1\kern 0.3ex\relax[##2]}:} ##3.
+ }
+% \end{macrocode}
+%
+% \textbf{Provide environment \phfverb{pkgoptions}:} Set up an elaborate
+% environment (based on a |description| environment) to describe package
+% options.
+% \begin{macrocode}
+ \RequirePackage{enumitem}
+ \newlist{pkgoptions}{description}{1}
+ \setlist[pkgoptions]{font=\pkgoptionfmt[{\vspace*{5pt}}],style=nextline}
+% \end{macrocode}
+%
+% But patch the |pkgoptions|' |\item| command, so that it puts an additional
+% pair of braces around its argument. In this way, the |font=| attribute for
+% the list sees the full label as its next token, and can be used as a macro
+% argument. (This is not needed for newer versions of \pkgname{enumitem}.)
+% \begin{macrocode}
+ \apptocmd\pkgoptions{\let\pkgoptions@old@item\item%
+ \def\item{\@ifnextchar[\pkgoptions@item@\pkgoptions@item@@}%]
+ \def\pkgoptions@item@[##1]{\pkgoptions@old@item[{{##1}}]}%
+ \def\pkgoptions@item@@{\PackageWarning{phfnote}{{pkgoptions}: you must
+ specify label to \string\item as \string\item[label].}%
+ \pkgoptions@old@item}%
+ }{}{\PackageWarning{phfnote}{preset xpkgdoc: Failed to patch command
+ \string\pkgoptions}}
+ \def\pkgoptionscombineitem{\leavevmode\vspace{\dimexpr-\baselineskip-\parskip-\itemsep\relax}}
+% \end{macrocode}
+%
+% For convenience, also provide a |\meta|-like command for boolean arguments
+% (|true| or |false|). `|\metatruefalsearg|' typesets as `\metatruefalsearg'.
+% \begin{macrocode}
+ \def\metatruefalsearg{\meta{\phfverb{true} $\mid$ \phfverb{false}}}
+% \end{macrocode}
+%
+% Include also a command to format a package option. Puts the option in a box
+% in typewriter text style, and indexes it. The optional argument is meant to
+% be internal---it adds commands after the displayed text (use it to add, e.g.\@
+% spacing).
+%
+% When indexing the packages, make sure to remove the protective braces if any.
+% \begin{macrocode}
+ \newcommand\pkgoptionfmt[2][]{%
+ \begingroup\let\meta\pkgoptfmt@meta\fbox{\normalfont\ttfamily ##2}\endgroup%
+ \expandafter\phfnote@pkgdoc@index\expandafter{\@firstofone ##2}%
+ ##1}
+ \let\pkgopt@save@meta\meta
+ \def\pkgoptfmt@meta##1{\begingroup\normalfont\itshape\pkgopt@save@meta{##1}\endgroup}
+% \end{macrocode}
+%
+% Whenever a package option is formatted with |\pkgoptionfmt|, it is placed in
+% the index. Because package options may be of the form |key=val|, we want to
+% split keys from values and put them independently in the index. This is done
+% by entering a \TeX{} group, and using an |\lccode| trick: the code is prepared
+% to iterate over a list of comma-separated stuff, but then the ``lowercase''
+% version of that code is executed instead, where the |=|'s have been replaced
+% by |,|'s.
+% \begin{macrocode}
+ \def\phfnote@pkgdoc@index##1{%
+ \begingroup\lccode`\= = `\,\relax%
+ \def\x{\lowercase{\def\@tmpa{##1}}}%
+ \x%
+ \let\meta\@gobble%
+ \let\marg\@gobble%
+ \let\oarg\@gobble%
+ \let\parg\@gobble%
+ \let\pkgoptattrib\@firstofone%
+ \let\pkgoptattribnodots\@firstofone%
+ \let\pkgoptattribempty\@empty%
+ \def\handleitemindex####1{%
+ \edef\@tmpc{####1}%
+ \if\relax\detokenize\expandafter{\@tmpc}\relax\else%
+ \edef\@tmpb{{\expandonce\@tmpc=\string\verb!*+\expandonce\@tmpc+ (\pkgoptname)|hyperpage}}%
+ \expandafter\index\@tmpb%
+ \edef\@tmpb{{\packageoptionsname:>\expandonce\@tmpc=\string\verb!*+\expandonce\@tmpc+|hyperpage}}%
+ \expandafter\index\@tmpb%
+ \fi%
+ }%
+ \def\@tmpc{\forcsvlist{\handleitemindex}}%
+ \expandafter\@tmpc\expandafter{\@tmpa}%
+ \endgroup%
+ }
+ \def\pkgoptname{pkg. opt.}
+ \def\packageoptionsname{package options}
+% \end{macrocode}
+%
+% \textbf{Provide environment \phfverb{cmdoptions}:} hijack the |pkgoptions|
+% environment to do the same thing, except we place the items in the index under
+% ``command options'' instead of ``package options.''
+% \begin{macrocode}
+ \def\cmdoptions{\begingroup\setcmdnotpkgoptions
+ \pkgoptions}
+ \def\endcmdoptions{\endpkgoptions\endgroup}
+ \newcommand\cmdoptionfmt[2][]{\begingroup\setcmdnotpkgoptions
+ \pkgoptionfmt[{##1}]{##2}\endgroup}
+ \def\cmdoptname{cmd. opt.}
+ \def\commandoptionsname{command options}
+ \def\setcmdnotpkgoptions{\let\pkgoptname\cmdoptname
+ \let\packageoptionsname\commandoptionsname
+ \let\fbox\cmdoptionsfbox}
+ \def\cmdoptionsfbox##1{\ensuremath{\underline{{\text{##1}}}}}
+% \end{macrocode}
+%
+% Provide the |\pkgoptattrib| command, which typesets its argument as
+% |\{arg, ...\}|---useful to typeset attributes such as in
+% \autoref{sec:abstract-attributes}. The variant |\pkgoptattribondots{arg}|
+% typesets |\{arg\}| while |\pkgoptattribempty| expands to |{}|.
+% \begin{macrocode}
+ \def\pkgoptattrib##1{\{##1,...\}}
+ \def\pkgoptattribnodots##1{\{##1\}}
+ \def\pkgoptattribempty{\{\}}
+% \end{macrocode}
+%
+% \textbf{Colorful boxes: environments \phfverb{pkgnote},
+% \phfverb{pkgwarning}, and \phfverb{pkgtip}.} Now, load the
+% \pkgname{tcolorbox} package to provide visual ``Note,'' ``Warning,'' and
+% ``Tip'' boxes. Because \pkgname{tcolorbox} includes the
+% \pkgname{verbatim} package which messes up the |verbatim| environment in
+% latex dtx files (for which source lines all start with a |%| which needs
+% to be stripped), we save the |verbatim|-related commands, and restore
+% them after the interfering packages have been loaded.
+% \begin{macrocode}
+ \phfnoteSaveDefs{verbatimstuff}{%
+ verbatim,@verbatim,@xverbatim,@sxverbatim,endverbatim}
+ \usepackage{tcolorbox}
+ \newtcolorbox{pkgnote}{
+ colback=blue!5!white,
+ colframe=blue!5!white,
+ coltitle=blue!50!black,
+ toptitle=1.5ex,
+ fonttitle=\bfseries,
+ title={NOTE}
+ }
+ \newtcolorbox{pkgwarning}{
+ colback=red!5!white,
+ colframe=red!5!white,
+ coltitle=red!50!black,
+ toptitle=1.5ex,
+ fonttitle=\bfseries,
+ title={WARNING}
+ }
+ \newtcolorbox{pkgtip}{
+ colback=green!5!white,
+ colframe=green!5!white,
+ coltitle=green!50!black,
+ toptitle=1.5ex,
+ fonttitle=\bfseries,
+ title={TIP}
+ }
+ \phfnoteRestoreDefs{verbatimstuff}
+% \end{macrocode}
+%
+% Common title stuff:
+% \begin{macrocode}
+ \def\phfqitltxPkgTitle##1{The \pkgname{##1} package\thanks{\itshape
+ This document corresponds to \pkgname{##1}~\fileversion, dated \filedate. It
+ is part of the
+ \href{https://github.com/phfaist/phfqitltx/}{\pkgname{phfqitltx}} package
+ suite, see \url{https://github.com/phfaist/phfqitltx}.}}
+% \end{macrocode}
+%
+% Utility to parse package file date into ``|\today|''-style date: invoke as
+% |\date{\pkgfmtdate\filedate}|.
+% \begin{macrocode}
+ \def\pkgfmtdate##1{%
+ \edef\pkgfmtdate@thedate{##1}%
+ \expandafter\pkgfmtdate@next\pkgfmtdate@thedate\@nil%
+ }
+ \def\pkgfmtdate@next##1/##2/##3\@nil{% YYYY/MM/DD
+ \ifcase ##2 \or January\or February\or March\or April\or May%
+ \or June\or July\or August\or September\or October\or November\or December\fi\space ##3,%
+ \space ##1}
+ \robustify\pkgfmtdate@next
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\phfnote@preset@reset}
+% Finally, the |reset| preset:
+% \begin{macrocode}
+\def\phfnote@preset@reset{
+ \def\phfnote@opt@pkgset{none}
+ \def\phfnote@opt@title{}
+ \phfnote@opt@pagegeomdefsfalse
+ \phfnote@opt@spacingdefsfalse
+ \def\phfnote@opt@par{original}
+ \def\phfnote@opt@abstract{original}
+ \phfnote@opt@hyperrefdefsfalse
+ \phfnote@opt@fontdefsfalse
+ \def\phfnote@opt@secfmt{}
+ \phfnote@opt@bibliographydefsfalse
+ \phfnote@opt@footnotedefsfalse
+% \end{macrocode}
+%
+% \begin{pkgwarning}
+% SELF-NOTE: DO NOT FORGET TO ADD HERE RESET COMMANDS FOR ANY NEW OPTION THAT
+% WE PROVIDE IN THE FUTURE.
+% \end{pkgwarning}
+%
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsubsection{Finally, Process and Execute the Package Options}
+%
+%
+%
+% Process the options:
+%
+% \begin{macrocode}
+\ProcessKeyvalOptions*
+% \end{macrocode}
+%
+%
+% Take action according to the user options.
+%
+% \begin{macrocode}
+\phfnote@do@pkgset{\phfnote@opt@pkgset}
+
+\phfnote@do@notetitle{\phfnote@opt@title}
+
+\phfnote@do@noteabstract{\phfnote@opt@abstract}
+
+\phfnote@do@secfmt{\phfnote@opt@secfmt}
+
+\ifphfnote@opt@pagegeomdefs
+ \phfnote@do@pagegeomdefs{\phfnote@opt@pagegeom}
+\fi
+
+\ifphfnote@opt@spacingdefs
+ \phfnote@do@spacing
+\fi
+
+\phfnote@do@par{\phfnote@opt@par}
+
+\ifphfnote@opt@hyperrefdefs
+ \phfnote@do@pdfhyperrefdefs
+\fi
+
+\ifphfnote@opt@fontdefs
+ \phfnote@do@fontdefs
+\fi
+
+\ifphfnote@opt@bibliographydefs
+ \phfnote@do@bibliographydefs
+\fi
+
+\ifphfnote@opt@footnotedefs
+ \phfnote@do@footnotedefs
+\fi
+% \end{macrocode}
+%
+% Finally, execute the hook we set up for definitions at the end of the package
+% loading:
+% \begin{macrocode}
+\phfnote@hook@atendload
+% \end{macrocode}
+%
+%\Finale
+\endinput