% !TEX TS-program = lualatex
% arara: lualatex
% arara: lualatex
\documentclass[11pt]{article}

% This entire package is placed under the terms of the
% LaTeX Project Public License, version 1.3 or later
% (http://www.latex-project.org/lppl.txt).
% It has the status "maintained".
%
% Author: Mico Loretan (loretan dot mico at gmail dot com)
% Date: 2013/05/25

% Check first that we're running lua(la)tex.
\usepackage{ifluatex}
\ifluatex\else
  \typeout{ =========================================}
  \typeout{ The file selnolig.tex must be compiled   }
  \typeout{ using LuaLaTeX. Exiting immediately.     }
  \typeout{ =========================================}
  \endinput
\fi

% Load fontspec and some font families
\usepackage{fontspec}

\setmainfont[ FeatureFile= gpp-ft.fea,
              Numbers    = OldStyle,
              Ligatures  = {TeX, Common, Rare},
              BoldFont   = {Garamond Premier Pro},
              ItalicFont = {Garamond Premier Pro Italic} ]
             {Garamond Premier Pro}

\setsansfont[Scale=MatchLowercase,
             Ligatures = NoCommon]
            {Myriad Pro}
\setmonofont[Scale=0.81,
             Ligatures = NoCommon]
            {Consolas}

\newfontfamily\ebg[ Numbers = OldStyle,
     Ligatures  = {TeX, Common, Discretionary, Historic},
     ItalicFeatures = {Scale = MatchLowercase},
     ItalicFont = {EB Garamond 12 Italic}]
     {EB Garamond 12 Regular}
\newfontfamily\sabon[Ligatures={Common,Rare,TeX},
    Scale=MatchLowercase]
   {Sabon Next LT Pro}
\newfontfamily\blackletterfont[Ligatures=NoCommon]
     {UnifrakturMaguntia}


% Load some more packages
\usepackage{geometry}
\usepackage[english=american]{csquotes}
\usepackage[ngerman,english]{babel}

\usepackage[ngerman,english,hdlig,broadf]{selnolig}
\debugon

\hyphenation{ver-werf-lich kunst-stoff-lei-tung}

% Suppress st-ligature in some German words
%    that occur in this document
\nolig{Kunststo}{Kuns|ts|to} % Kunststoff
\nolig{Bausto}{Baus|to}      % Baustoff
\nolig{streif}{s|treif}      % streifte
\nolig{instru}{ins|tru}      % Zupfinstrument
\nolig{justiz}{jus|tiz}      % Strafjustiz
\nolig{Konstanz}{Kons|tanz}	
\nolig{Institut}{Ins|titut}
\nolig{Wasserstoff}{Wassers|toff}
\nolig{stiefl}{s|tiefl} % stiefle
\nolig{straff}{s|traff}


% Load still more packages...
\usepackage{microtype}
  \LoadMicrotypeFile{pad}
\usepackage{multicol}
\usepackage[bottom,splitrule]{footmisc}

\usepackage{sectsty}
\allsectionsfont{\mdseries}

\usepackage{tocloft}
\cftsetindents{sec}{0em}{1.75em}
\cftsetindents{subsec}{1.75em}{2em}
\cftsetindents{subsubsec}{3.75em}{3em}
\setlength\cftbeforesecskip{1ex}
\renewcommand{\cfttoctitlefont}{\large}
\renewcommand{\cftsecfont}{\mdseries}
\renewcommand{\cftsubsecfont}{\mdseries}
\renewcommand{\cftsecpagefont}{\mdseries}
\renewcommand{\cftsubsecpagefont}{\mdseries}
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}}

\usepackage{fancyvrb}
\DefineShortVerb{\|}

% Set up logos for LuaLaTeX and XeLaTeX 
\usepackage{metalogo} 
  \makeatletter
  \def\xl@drop@TeX@e{0.34ex}    % default:  0.5ex
  \def\xl@drop@Xe@e{0.34ex}     % default:  0.5ex
  \def\xl@kern@La@La{-.33em}    % default: -0.36ex
  \def\xl@kern@LaTeX@aT{-.16em} % default: -0.15ex
  \makeatother

% some frequently-used commands
\newcommand{\pkg}[1]{\textsf{#1}}
\newcommand{\opt}[1]{\texttt{#1}}
\newcommand{\cmmd}[1]{\texttt{\textbackslash #1}}

\newcommand\utf{\textsc{utf-8}}

% Redefine the \appendix command
\let\oldappendix\appendix
\renewcommand\appendix{%
   %\clearpage
   \addtocontents{toc}{\protect{\vspace{1\baselineskip}}}
   \addtocontents{toc}{\protect{\mdseries Appendices\par}}
   \noindent
   {\Large Appendices}
   \oldappendix}

\frenchspacing
\clubpenalty10000
\widowpenalty10000

\usepackage[svgnames]{xcolor}
\usepackage[colorlinks=true,linktocpage,
   allcolors=DarkBlue]{hyperref}
\usepackage[capitalize,nameinlink,noabbrev]{cleveref}


% The macros \selnoligpackagename, 
% \selnoligpackageversion, and \selnoligpackagedate 
% used below are defined in 'selnolig.sty'.

\title{The \selnoligpackagename\ package: \\
Selective suppression of typographic ligatures\thanks{
Current version: \selnoligpackageversion. Features of the \pkg{selnolig} package are subject to change without prior notice. 
\newline\hspace*{\parindent}
The main text font used in this document is \enquote{Garamond Premier Pro}. \enquote{\ebg EB Garamond} is used for words that involve the \emph{\mbox{\ebg sk}}, {\ebg \mbox{fb}, \mbox{fh}, \mbox{fj}, \mbox{fk}, \mbox{ffb}, \mbox{ffh}, \mbox{ffj}, and \mbox{ffk}} glyphs. Both \enquote{common} and \enquote{discretionary} typographic ligatures are enabled for these fonts\textemdash \emph{and} are suppressed selectively using \pkg{selnolig}'s macros.}}

\author{Mico Loretan\thanks{
\href{mailto:loretan.mico@gmail.com}{loretan dot mico at gmail dot com}.}}

\date{\selnoligpackagedate}

\begin{document}

\VerbatimFootnotes
\pagenumbering{roman}
\maketitle


\begin{abstract}

The \pkg{selnolig} package suppresses typographic ligatures selectively, i.e., based on predefined search patterns. The search patterns focus on ligatures deemed inappropriate because they span morpheme boundaries. For example, the word \opt{shelfful}, which is mentioned in the \TeX book as a word for which the \enquote{ff} ligature might be inappropriate, is automatically typeset as shelfful rather than as shel\mbox{ff}ul.
\newline\hspace*{\parindent}
For English and German language documents, the \pkg{selnolig} package provides extensive rules for the selective suppression of so-called \enquote{common} ligatures. These comprise the ff, fi, fl, ffi, and~ffl ligatures as well as the ft and~fft ligatures. Other f-ligatures, such as {\ebg\mbox{fb}, \mbox{fh}, \mbox{fj}} and {\ebg\mbox{fk}}, are suppressed globally, while making exceptions for names and words of non-English/German origin, such as {\ebg Kafka} and {\ebg fjord}.
\newline\hspace*{\parindent}
For English language documents, the package further provides ligature suppression macros for a number of so-called \enquote{discretionary} or \enquote{rare} ligatures such as~ct, st, and~sp.
\newline\hspace*{\parindent}
The \pkg{selnolig} package requires use of the \LuaLaTeX\ format provided by a recent \TeX\ distribution such as \TeX Live\,2012 or~2013 and MiK\TeX\,2.9.
\end{abstract}

\tocloftpagestyle{empty}
\tableofcontents

\clearpage
\pagenumbering{arabic}

\section{Introduction}

The ability of \TeX\ and Friends to use typographic ligatures has long been cherished by its users. Indeed, the automated and transparent use of typographic ligatures by \TeX\ and Friends is often offered up as one of the reasons for using these programs to obtain high-quality typeset output.

However, even though the automatic use of typographic ligatures is highly desirable in general, there are words for which the use of certain typographic ligatures may not be appropriate. The \TeX book observes, on page~19, that the word |shelfful| may look better if it is typeset as \enquote{shelfful}, i.e., \emph{without} the ff-ligature, rather than as \enquote{\mbox{shelfful}}. Some other English-language words that would generally be considered to be good candidates for non-use of ligatures are \mbox{cufflink} and \mbox{offload}; compare their appearance with that of cufflink and offload. Observe that all three of these words are composed of two \emph{morphemes}: the first morpheme ends in an~\enquote{f\,} or~\enquote{ff\,} while the second morpheme starts with either an~\enquote{f\,} (in the case of shelfful) or an~\enquote{l} (in the cases of cufflink and offload). A \href{http://en.wikipedia.org/wiki/Morpheme}{morpheme}, briefly stated, is the smallest linguistic unit within a word that bears distinct meaning; all words\textemdash other than nonsense words, I suppose\textemdash contain at least one morpheme. The words apple and orange contain one morpheme each, and the words apples, oranges, shelfful, cufflink, and offload each contain \emph{two} morphemes. Stated formally, the main purpose of the \pkg{selnolig} package is to provide methods and rules for automated yet selective (rather than global) suppression of typographic ligatures that span morpheme boundaries.

For English language documents, the need to suppress typographic ligatures that span morpheme boundaries does not appear to be a hugely pressing typographic concern, possibly because English doesn't feature composite words that frequently. However, in other languages, such as German, composite words are much more common. In these languages, there is naturally a much greater potential for composite words to feature instances of |ff|, |fi|, |fl| etc.\ across morpheme boundaries. In German typography, a ligature that spans a morpheme boundary appears to be something that should be avoided at (nearly) all cost, presumably because these ligatures have the potential to impair seriously the intelligibility of composite words.\footnote{For German texts, I believe that the \emph{Duden} provides authoritative backing for questions related to selective ligature suppression. For English texts, I'm not aware of the existence of a document issued by an official or quasi-official body that prescribes whether ligatures that span morpheme boundaries should be suppressed. If anybody can provide such a reference, I would be happy to list it.}

\TeX\ and Friends offer several methods for suppressing ligatures on a case-by-case basis.\footnote{In \LaTeX, there are three basic methods for suppressing ligature within a character pair: (i)~insertion of an \enquote{empty atom}, |{}| between the characters, (ii)~insertion of an explicit italic correction, |\/|, and (iii)~insertion of an explicit \enquote{kern}, e.g., |\kern0pt| or \Verb/\hspace{0pt}/. The \pkg{babel} package, when used with the \opt{ngerman} option, offers the \enquote{shortcut} macro \Verb/"|/ for this purpose. Note, though, that the first ligature suppression method, \Verb/{}/, does \emph{not} work if the document is compiled with \LuaLaTeX.} However, these methods must be applied separately to each and every occurrence of all words that contain unwanted ligatures. As such, these case-by-case methods are both time-intensive and tedious. Moreover, there's always a residual risk that some words for which certain ligatures should be suppressed will be overlooked in the editing process. 

What has \emph{not} been available so far is a \LaTeX\ package that (a) provides a list of word patterns and entire words for which ligatures should be suppressed and (b) systematically discovers all instances of these patterns in a document and applies the non-ligation rules automatically to all words for which one or more pattern matches obtain. The \pkg{selnolig} package is meant to address this need. The package is currently set up to handle non-ligation issues for English and German language documents by providing extensive lists of ligature suppression rules tailored to the respective languages. Of course, I make no claim as to the completeness of either list. The package therefore makes it straightforward for users to provide their own supplemental ligature suppression rules to treat words not already covered by the package.\footnote{If you come up with such words, please email them to me so that I can augment and update the package's ligature suppression rules. A suggested template for reporting such cases is provided in \cref{sec:template}.} 

For both English and German language documents, the \pkg{selnolig} package provides macros to suppress \emph{selectively} the following f-ligatures: ff, fi, fl, ffi, and ffl\textemdash the \enquote{standard} f-ligatures that should be familiar to most users of Computer Modern fonts\textemdash as well as the~ft and~fft ligatures. The latter two ligatures, while not provided by the Computer Modern and Latin Modern font families, are frequently available in \href{http://en.wikipedia.org/wiki/Serif#Old_Style}{oldstyle} (also known as \enquote{Garalde}) font families.\footnote{In some oldstyle font families, the \enquote{ft} and \enquote{fft} ligatures are rendered as \enquote{\sabon ft} and \enquote{\sabon fft}, respectively.} Oldstyle-type font families generally feature a great variety of typographic ligatures. Given the popularity of these font families for typesetting documents, it seems useful on the \pkg{selnolig} package to provide ligature suppression rules for the ligatures provided by these font families.

For both English and German language documents, the {\ebg \mbox{fb}, \mbox{fh}, \mbox{fj}, and \mbox{fk}} ligatures are suppressed \emph{globally}; see also \cref{sec:global-nolig}. However, exceptions are provided in order not to suppress these ligatures for selected words of \emph{non-English\slash German} origin, such as {\ebg fjord, fjell, Prokofjew, and Kafka}.

For English language documents, the \pkg{selnolig} package recognizes an option called \opt{broadf}; if it is set, additional f-ligatures will be suppressed selectively. The package also features an option called \opt{hdlig} to provide selective ligature suppression for discretionary (aka rare) ligatures such as~ct, st, sp, {\ebg\emph{sk}}, \emph{th}, \emph{at}, \emph{et}, \emph{ll}, \emph{as}, \emph{is}, and~\emph{us}. No rules are currently provided to suppress historic\slash discretionary ligatures for German documents.\footnote{A remark on the classification of various forms of typographic ligatures in OpenType fonts: There appears to little terminological standardization as to which typographic ligatures are labelled \enquote{historic} and which ones are labelled \enquote{discretionary}. To wit, the fonts Latin Modern Roman, Garamond Premier Pro, and Hoefler Text report having \enquote{only} discretionary ligatures, whereas Junicode, Cardo, EB Garamond, and Palatino Linotype report having both historic and discretionary ligatures. Interestingly, none of these fonts report having ligatures classified as either \enquote{contextual} or \enquote{required}. }

The \pkg{selnolig} package also provides supplemental hyphenation exception lists for both English and German language words. The words in these lists are generally composite and contain one or more typographic ligatures that should be suppressed.



\section{I'm in a hurry! How do I start using this package?}

\subsection[How do I load the selnolig package?]{How do I load the \pkg{selnolig} package?}

%\enlargethispage{0.5\baselineskip}

\begin{itemize}
\item If your document is in English and you want to enable a \enquote{basic} set of rules to suppress f-ligatures selectively, load the package by issuing the following instruction in the preamble of your document:
\begin{Verbatim}
     \usepackage[english]{selnolig}
\end{Verbatim}
Synonymous options are \opt{UKenglish}, \opt{british}, \opt{USenglish}, \opt{american}, \opt{cana\-dian}, \opt{australian}, and \opt{new\-zea\-land}.

If you want to load a broader set of f-ligature suppression rules than the set that's enabled by default, be sure to also specify the option \opt{broadf}; see \cref{sec:eng-opt}.
If you enable \enquote{historic} and/or \enquote{discretionary} ligatures (e.g., ct, st, sp, \emph{th}, \emph{as}, \emph{is}, and~\emph{us}) for your document's text font(s), be sure to specify the option~\opt{hdlig} as well. The options \opt{hdlig} and \opt{broadf} may be specified independently.

\item If your document is written in German, load the package as follows:
\begin{Verbatim}
     \usepackage[ngerman]{selnolig}
\end{Verbatim}
Synonymous options: \opt{german}, \opt{austrian}, \opt{naustrian}, \opt{swissgerman}, and \opt{swiss}.

\item If you load the package \emph{without} an explicit language option, i.e., as
\begin{Verbatim}
     \usepackage{selnolig}
\end{Verbatim}
but if one or more of the language options noted above are specified as options in the \cmmd{documentclass} instruction, \LaTeX\ will pass these options on to the \pkg{selnolig} package.

\item If no language options are set, either when the package is loaded or as options in the \cmmd{documentclass} instruction, you will need to specify various \cmmd{nolig} macros yourself in order to suppress typographic ligatures. This approach may be called for if you write in a language other than German or English.

\end{itemize}


\subsection{Any hints on how to get started with \LuaLaTeX?}

\begingroup
\renewcommand\theenumi{(\roman{enumi})}
\renewcommand\labelenumi\theenumi

The ligature suppression macros of the \pkg{selnolig} package \emph{require} the use of \LuaLaTeX; they will not work under either pdf\LaTeX\ or \XeLaTeX.\footnote{If the \pkg{selnolig} package is not run under \LuaLaTeX, a warning message will be issued and only the package's supplemental hyphenation rules will be available to the user.}
If you've been using pdf\LaTeX\ until now, the requirement to use \LuaLaTeX\ will likely force you to make some changes to your existing documents. Fortunately, these changes should be minor and straightforward to implement, because \LuaLaTeX\ is (for the most part) a strict superset of pdf\LaTeX. Almost all documents that compile correctly under pdf\LaTeX\ should also compile correctly under \LuaLaTeX. Two required changes are: 
\begin{enumerate}
\item Do not load the |inputenc| and |fontenc| packages. \item Insert the instruction |\usepackage{fontspec}|
in the preamble.\footnote{If the \pkg{selnolig} package is run under \LuaLaTeX\ but the \pkg{fontspec} package isn't loaded by the time the \Verb+\begin{document}+ statement is encountered, \pkg{selnolig} will terminate with an error message.} Then, use commands such as \cmmd{setmainfont} and \cmmd{setsansfont} to load the fonts you wish to use.
\end{enumerate}
\endgroup


Depending on your \TeX\ distribution, the default font family used by \LuaLaTeX\ will be either Computer Modern or Latin Modern. If you wish to use a different font family, further font-related instructions will be required. \emph{How} to specify fonts and font families and set up various font-related options in \LuaLaTeX\ are topics that go far beyond the scope of this user guide. I urge you to become familiar with the very well-written
 \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fontspec/fontspec.pdf}{user guide} of the \pkg{fontspec} package.

You will also need to use a \TeX\ distribution that features a fairly recent version of \LuaLaTeX. \TeX Live 2013, \TeX Live\,2012, and MiK\TeX\,2.9 satisfy this requirement; versions of \TeX Live before 2011 probably do not. If you use a command-line interface to compile a document named, say, |myfile.tex|, type 
\begin{Verbatim}
     lualatex myfile
\end{Verbatim}
rather than either |latex myfile| or |pdflatex myfile|. If you use a text editing program with pull-down menus or buttons to invoke a suitable compiler, be sure to select |LuaLaTeX|. 

The first time one runs \LuaLaTeX\ on a document with a new set of fonts, the compilation speed will likely be quite slow, because \LuaLaTeX\ has to create various cache files to store font-related information. Subsequent compilation runs should be much faster. 

The answers to the questions \href{http://tex.stackexchange.com/q/28642/5001}{Frequently loaded packages: Differences between pdf\LaTeX\ and \LuaLaTeX?} and \href{http://tex.stackexchange.com/q/32295/5001}{Using Lua\TeX\ as a replacement for pdf\TeX}, both posted to \href{http://tex.stackexchange.com/}{tex.stackexchange.com}, provide very useful information for people who are new to \LuaLaTeX\ and at least somewhat familiar with pdf\LaTeX\'s ways of getting things done. Another great resource for people who wish to become more more familiar with \LuaLaTeX\ is \href{http://mirror.ctan.org/info/luatex/lualatex-doc/lualatex-doc.pdf}{A Guide to \LuaLaTeX} by Manuel Pégourié-Gonnard.


\subsection{Anything else I need to do or know?} \label{sec:anythingelse}

For multilingual support, \LuaLaTeX\ and the \pkg{selnolig} package work well with the \href{http://www.ctan.org/pkg/babel}{\pkg{babel}} package. If your document loads the \pkg{babel} package, be sure to load the \pkg{selnolig} package \emph{after} the \pkg{babel} package, so that the supplemental hyphenation patterns provided by the \pkg{selnolig} package won't get clobbered by \pkg{babel}'s hyphenation settings.\footnote{The \pkg{selnolig} package is also compatible with the \href{http://www.ctan.org/pkg/hyphsubst}{\pkg{hyphsubst}} package (which, if used, should be loaded with a \Verb+\RequirePackage+ statement \emph{before} the \Verb+\documentclass+ instruction). With \TeX Live2013, it may also be possible to use the \pkg{polyglossia} package with \LuaLaTeX\ and hence with \pkg{selnolig}, but I haven't verified that this is the case.}

\LuaLaTeX\ natively supports the so-called \utf\ input encoding scheme; in fact, it is also the \emph{only} input encoding scheme that \LuaLaTeX\ knows about. The \pkg{selnolig} package assumes that that the \TeX\ files it operates on conform to this input encoding method. Nowadays, many modern \TeX-aware editors support \utf\ directly; \pkg{selnolig} should have no problems with \TeX\ files produced by these editors. Legacy files, however, may use other input encoding systems. If your input files currently use a different input encoding scheme, such as \textsc{latin1}, you must first convert them to \utf. Several methods exist for changing a file's input encoding scheme; see the question \href{http://tex.stackexchange.com/q/87406/5001}{How to change a .tex file's input encoding system (preferably to \utf)?} and the associated answers on \url{tex.stackexchage.com} for some possibilities.

If your document is written in German, it is assumed that all vowels with diereses (Umlaute) are entered as \Verb|ä|, \Verb|ö|, \Verb|ü|, etc.\ rather than, say, as \Verb|\"{a}|, \Verb|\"{o}|, and~\Verb|\"{u}| or (if you tend to use the \pkg{babel} \enquote{shortcuts}) as \Verb|"a|, \Verb|"o|, and~\Verb|"u|. Likewise, it's assumed that you enter the \enquote{eszett} (\enquote{scharfes~s}) character as~|ß| rather than as~|\ss|.
It is also assumed that you use the triple-f (modern) spelling of words such as \texttt{Schifffahrt}, \texttt{Stofffarbe}, and \texttt{grifffest} as well as the double-t (modern) spelling of words such as |Mannschafttest|.

Finally, all \pkg{babel}-style ``\Verb+"|+'' ligature-suppressing shortcuts should either be removed entirely or be replaced with |\breaklig| instructions; the \pkg{selnolig} package's |\breaklig| macro is explained in \cref{sec:breaklig} below.\footnote{On my \LuaLaTeX\ system, whenever a \Verb+"|+ command is encountered, I either get a bad crash that requires a reboot of the computer (under Mac\TeX\,2012) or I get a stern error message about \enquote{Forbidden control sequence found while scanning use of \cmmd{FancyVerbGetVerb}} (under Mac\TeX\,2013).}





\section[The selnolig package's approach to breaking up ligatures]{The \pkg{selnolig} package's approach to breaking up ligatures}

\subsection[Free, derivational, and inflectional morphemes]{Free, derivational, and inflectional morphemes: What's their relationship to ligature suppression?!}


Good typography supports and enhances the readability of the typeset text. There are, obviously, a great many facets to what constitutes good readability. One of them is the ease with which readers can discern the \emph{meaning} of words, including composite words that contain two or more morphemes. Typographic ligatures serve to \enquote{group} characters into composite glyphs, and they are generally thought to contribute to the text's readability \emph{if} they do not span morpheme boundaries. Ligatures that do span morpheme boundaries within a word \emph{may} impair its readability, in part because the reader's brain often uses the grouping performed by these composite glyphs to help detect the morphemes within each word.

What exactly are morphemes? Briefly put, morphemes are the smallest linguistic units within a word that carry \emph{meaning}. Because words are, by definition, standalone units of text, each word contains at least one morpheme.\footnote{Please don't try to get me involved in a discussion of what it may mean to have words without meaning\dots} Morphemes are classified as \emph{free} morphemes if they can stand alone as words (e.g., cat, dog, sea, see), and as \emph{bound} morphemes if they can not. E.g., the letter~|s| in the words cats, dogs, and rivers indicates the plural forms of the associated nouns, but the |s| particle cannot stand alone as a (meaningful) word. A bound morpheme must therefore be associated with a free morpheme.

Bound morphemes can be divided further into derivational and inflectional morphemes. A \emph{derivational} morpheme changes the meaning of the associated free morpheme in a fundamental way. E.g., the \enquote{un} in \enquote{untrue} reverses the meaning of the associated free morpheme \enquote{true}, and the \enquote{ful} in \enquote{shelfful} changes the word's meaning from a noun to a quantity measure (two shelffuls of books on typography). An \emph{inflectional} morpheme, in contrast, signifies a less fundamental change in meaning: in nouns (and, depending on the language, adjectives as well), inflectional morphemes indicate plural forms (child vs. children, cat vs. cats) and other forms of declination.\footnote{In English, the virtually sole type of declension is to indicate plural status. In other languages, declination can occur to indicate nominative, genitive, dative, accusative, etc. forms\textemdash of nouns \emph{and} adjectives. E.g., in German one says das schöne Kind, des schönen Kindes, dem schönen Kinde, etc. the particles |en|/|es| and |en|/|e| represent inflectional morphemes associated with the genitive and accusative forms.} In verbs, inflectional morphemes indicate conjugation, such as a change in tense or of the subject performing the action implied by the verb. E.g., call vs. called, walk vs. walked, but also \enquote{I~swim} vs. \enquote{she swims}, etc. 

Words containing more than one morpheme can contain either \enquote{just} free morphemes\textemdash rooftop, newspaper, etc.\textemdash or free and bound morphemes joined together\textemdash untrue, shelfful, sel\mbox{fi}sh, etc. The bound morphemes in a word generally occur either as a prefix or a suffix to the word's \enquote{main part} or \enquote{stem} (the free morpheme). Prefixes almost invariably represent derivational morphemes (e.g., true vs. untrue; do vs. redo and undo). Suffixes, in contrast, can represent either derivational or inflectional morphemes. For instance, the suffixes |like| and |less| in dwarflike and leafless are derivational morphemes, whereas the suffix |ed| in hounded and bounded is an inflectional morpheme. 

It is important to realize that not all ligatures that span morpheme boundaries are equally inimical to good readability. Consider, say, the word \emph{umbrellas}, which contains the ligature~\emph{as}. Note that this ligature crosses a morpheme boundary, between the free morpheme \emph{umbrella} and the suffix~\emph{s}. Nevertheless, I'm quite confident that few will claim that the presence of the \emph{as} ligature detracts from the readability of the word \emph{umbrellas}. I believe there are two reasons why the word's readability is not impaired by the presence of a ligature that spans a morpheme boundary. First, the suffix~\emph{s} is an inflectional morpheme: it \emph{merely} serves to change the noun's state from singular to plural. Hence, \enquote{most} of the composite word's meaning is conveyed by the free morpheme \emph{umbrella}. Second, the ligature occurs at the very \emph{end} of the word rather than, say, closer to the beginning or middle of the word.

The \pkg{selnolig} package adopts the following broad principles: First, ligatures that cross the boundaries of two free morphemes are suppressed. Second, ligatures that that cross the boundary between a free morpheme and a derivational morpheme are also suppressed\textemdash with certain exceptions. Third, ligatures that span the boundary between a free morpheme and an inflectional morpheme are not suppressed. As will be shown below, this distinction is particularly relevant for decisions related to the suppression (and non-suppression) of ft and fft ligatures in German texts.

Finally, observe that morphemes (which convey meaning) need not coincide with \emph{syllables} (which convey pronunciation and sound). Indeed, a word can contain several syllables but consist of only one morpheme (e.g., apple, orange, banana), or it can consist of only one syllable but contain more than one morpheme (e.g., cats, dogs, reads, reeds, seas, and sees). The fact that a ligature may span a syllable boundary within a word (and, possibly, a hyphenation point as well) does not, by itself, imply that this ligature should be suppressed. To wit, consider the German adjective \enquote{straff} and its associated forms straffe, straffer, straffen, etc.: the free morpheme in all of these words is |straff|, while the suffixes |e|, |er|, and |en| represent inflectional morphemes. Even though there's a syllable boundary between the two |f|s for all modified forms of the adjective straff, the ff-ligature is used for all forms because it doesn't span a \emph{morpheme} boundary. If TeX's hyphenation algorithm decides it needs to hyphenate the word straffen as s\kern0pt traf-fen to get a good line break, it can do so\textemdash and break up the ligature in the process. There's no need, though, to break up a ligature pre-emptively just because it might get hyphenated.



\subsection{Ligature suppression rules: English language case}


Typographic ligatures are suppressed selectively in the following cases:
\begin{itemize}
\item if two free morphemes are joined: \mbox{halfline} $\to$ halfline, \mbox{shelflife} $\to$ shelflife, \mbox{rooftop}~$\to$ rooftop, \mbox{halftone} $\to$ halftone, \mbox{wolftrap} $\to$ wolftrap, \mbox{houndstooth} $\to$ houndstooth, \mbox{arctan}\-gent~$\to$ arctangent, \mbox{newspaper}~$\to$ newspaper, \mbox{clothespin} $\to$ clothespin, \emph{se\mbox{as}trand} $\to$ \emph{seastrand}, etc.

\item if a prefix (usually either a free or a derivational morpheme) and main word are joined: \mbox{offload} $\to$ offload, mi\mbox{st}rust~$\to$ mistrust, di\mbox{sp}lay~$\to$ display, etc. 

\item if a main word and a suffix are joined, \emph{if} the suffix is a derivational morpheme that begins with an~f or an~l (other than \enquote{ly}): \mbox{shelfful}~$\to$ shelfful, \mbox{leafless} $\to$ leafless, \mbox{dwarflike}~$\to$ dwarflike, etc. 

\item The ft ligature is also suppressed in words that end in |fth|: \mbox{fifth}~$\to$ fifth, \mbox{twelfth}~$\to$ twelfth. Note that the particle |th| is a derivational morpheme. Moreover, in English the~|th| character pair is pronounced in a distinctive way. It thus seems inadvisable to obscure its presence with an ft ligature.
\end{itemize}

In addition, if the \opt{broadf} option is set, the \pkg{selnolig} package will suppress ligatures that arise if the main word ends in~f and the suffix starts with an~i, regardless of whether the suffix is a derivational or an inflectional morpheme: elfin, selfish, golfing, surfing, beefier, fluffily, goofiness, standoffish, jiffies, buffiest. Setting the \opt{broadf} option also instructs \pkg{selnolig} to split up ffi ligatures in words such as fluffiness and fluffily. Note that the option \opt{broadf} is \emph{not} enabled by default. This is because I believe that any slight gain in readability that could result from breaking up the fi and ffi ligatures between word stems and suffixes of this type would be more than outweighed by the visual clashes created between the unligated~f (ff) and~i glyphs. Finally, setting the \opt{broadf} option also instructs \pkg{selnolig} to suppress fl ligatures in words such as chiefly, briefly, and gruffly and ft ligatures in words such as fifty and fiftieth.



\subsection{Ligature suppression rules: German language case}

For German words, the following principles (with various exceptions and adjustments) apply when it comes to decide which ligatures to break up and which ones to allow. These rules are built mainly from statements found in the \emph{Duden} and various websites that have taken an interest in this subject, with adaptations for the ft and fft ligatures.
\begin{itemize}
\item Case 1: Joining of two free morphemes. Ligatures are suppressed if they span two \emph{free} morphemes. Examples: Schil\mbox{fi}nsel $\to$ Schilfinsel, Zup\mbox{fi}nstrument $\to$ Zupfinstrument, Bausto\mbox{ffi}ngenieur $\to$ Baustoffingenieur, Wassersto\mbox{ffi}onen $\to$ Wasserstoffionen; Imp\mbox{ff}urcht $\to$ Impffurcht, Sen\mbox{ff}abrik $\to$ Senffabrik, Schor\mbox{ffl}ecken $\to$ Schorfflecken; Ablau\mbox{fl}ogik $\to$ Ablauflogik,  fün\mbox{ffi}ngrig $\to$ fünf\mbox{fi}ngrig; Brie\mbox{ft}aube $\to$ Brieftaube, Sto\mbox{fft}eil $\to$ Stoffteil, el\mbox{ft}eilig $\to$ elfteilig, etc.

% in preceding item, we need to use an \mbox in 
% fünf\mbox{fi}ngrig 
% to suppress application of the English-language 
% rule \nolig{ffing}{ff|ing}

\item Case 2: Joining of a prefix (whether a free or a derivational morpheme) ending in~|f| and a main word (free morpheme). Ligatures are suppressed in this case as well. In German, by far the most common prefix that gives rise to the need to suppress various f-ligatures is the word \enquote{auf}, as in aufbrechen, auffassen, Aufführung, auffliegen, auffischen, auf\breaklig iss\breaklig t, aufjaulen, aufklingen, Auflage, Auftrag, auftreten, etc.

\item Case 3: Joining of a main word (free morpheme) ending in \enquote{f} or \enquote{ff} and a suffix (either a derivational or an inflectional morpheme) starting with \enquote{f}, \enquote{i}, \enquote{l}, or~\enquote{t}.

\begin{itemize}
\item Case 3a: Suffixes that start with an \enquote{f}, e.g., |-fach| and |-faltig|; these are generally derivational morphemes. Examples: fünffach and zwölffaltig. The ff-ligature should be suppressed. 

\item Case 3b: Suffixes that start with an \enquote{i}, such |-ig|, |-in|, and |-isch|; these suffixes can be either derivational or inflectional morphemes. Examples: streifig, äffisch, Chefin, Chefinnen. The fi and ffi ligatures should \emph{not} be suppressed. 

I haven't found a clear justification for this rule so far. I assume it is there because unligated f\breaklig i pairs may be sufficiently unsightly as to constitute an infraction against good typography that's even more grievous than having fi and ffi ligatures span the boundary between a main word and a suffix.


\item Case 3c: Suffixes (bound morphemes) that start with an \enquote{l}, e.g., |-lich|, |-ling|, |-lein| and |-los|. Example words: trefflich, höflich, Prüfling, Köpflein, and s\breaklig traflos. The fl-ligature is suppressed in all of these instances. 

\item Interlude I: In ambiguous cases that could give rise to fl-ligatures that involve certain suffixes, preference should be given\textemdash according to  \emph{Duden}\textemdash to \enquote{how the syllables are pronounced and how a word would be hyphenated}, leading to a suppression of the fl-ligature. For instance, the fl-ligature is suppressed in Verzweif\-lung, Bezweifler, schweflig, and würflig; note that the \enquote{true} suffixes in these words are |-ung|, |-er|, and |-ig|, respectively, rather than |-lung|, |-ler|, and |-lig|.\footnote{%
In my opinion, the rationale given for the suppression of the fl-ligature in these cases\textemdash relyiance on how the syllables are divided and how the composite words are hyphenated\textemdash is not entirely satisfactory because, morphologically speaking, the words Schwefel, Würfel, Zweifel, etc.\ contain two morphemes: a stem and the \emph{derivational} morpheme~|el|: \Verb+Schwef|el+, \Verb+Würf|el+, and \Verb+Zweif|el+, etc. It is therefore not necessary, in my opinion, to create a separate rule to justify the (non-)use of the fl-ligature in these cases. One could, instead, rely on the presence of two morphemes to motivate the suppression of the fl-ligature for words such as schweflig, teuflisch, würfle, and Verzweiflung, as their components are \Verb+schwef|[e]l|ig+, etc. However, I believe it's fair to say that most modern German speakers would barely be aware of the fact that the |el| particle constitutes a separate morpheme in words such as Würfel and Griffel, and that they would be entirely unaware of its presence in words such as Schwefel and Zweifel. At any rate, the typographical convention \emph{not} to use the fl-ligature for words such as schweflig, Verzweiflung, and würflig does \emph{not} appear to be based on the fact that letters~f and~l in these words belong to different morphemes.}

This convention may also be applied to justify the non-use of the fl-ligature in words such as knifflig and mufflig as well as in the present-tense/first-person-singular forms of verbs such as büffeln, löffeln, schaufeln, stiefeln, verteufeln, and zweifeln: they are typeset \emph{without} the fl-ligature, i.e., as büffle, löffle, schaufle, stiefle, verteufle, and zweifle, respectively.

\item Interlude II: If a word \emph{ends} with an |fl| character pair because an abbreviation is in effect, \emph{Duden} says it's OK to use the fl ligature even if the~f and~l characters belong to different morphemes. E.g., in the abbreviation \enquote{Aufl.}, the fl-ligature \emph{is} employed even though the ligature should not be used for the full, unabbreviated form of the word (\emph{viz.}, Auflage).

Although not mentioned explicitly by \emph{Duden}, I believe this convention may be extended to justify the use of the ff-ligature at the end of the abbreviation \enquote{Auff.} (full form: Aufführung\textemdash no ff ligature) and of the ft-ligature at the end of the abbreviated form \enquote{Auft.} (full form: Auftrag\textemdash no ft ligature either).

This convention further suggests (implies?!) that it's permissible (a) to use the ff ligature in surnames that end in ff, such as Orff and Hausdorff, and (b) to use the ffi- and ffl-ligatures in abbreviated names such as Steffi and Steffl. 

\item Case 3d: Word stem (free morpheme) ending in~|f| and derivational or inflectional morphemes starting with~|t|. Unfortunately, not much official wisdom seems to exist to guide this case, possibly because in German ft and~fft ligatures are not (yet?) used as widely as are the other f-ligatures. The following rules should thus be understood to be somewhat provisional.

\begin{itemize}
\item The convention mentioned in \enquote{Interlude II} above, about not breaking up an fl-ligature if it occurs at the very end of a word, may be adapted to the case of~ft and~fft ligatures: these ligatures are allowed \emph{if} they occur at the very ends of words (and at the ends syllables), as in verschärft, gestreift, gerafft, Dahingerafftsein, unbedarft, and Unbedarftheit. Note that in these cases, the ft and fft ligatures do span a morpheme boundary: the letter~|t| is an \emph{inflectional} morpheme that indicates a form of conjugation of the associated verb (viz., past tense and/or past particple).

\item Should ft and fft ligatures be broken up in the past-tense and past-participle forms of verbs that do not end in~ft but, rather, in -fte, -ften, -ftes, -ftest, etc? Example words: |streifte|, |schlürftest|, and |rafften|. Because these suffixes are merely \emph{inflectional} rather than derivational morphemes, the \pkg{selnolig} package takes the approach of \emph{not} breaking up the~ft and~fft ligatures in these cases; thus, the words will be typset as streifte, schlürftes\kern0pt t, and rafften rather than as streif\breaklig te, schlürf\breaklig tes\kern0pt t, and raff\breaklig ten.\footnote{I will concede, again, that I haven't yet come across any kind of authoritative discussion of this issue. Should someone be able to furnish a good counterargument to the setting proposed here, I would be happy to change it.}

\item It would also seem OK to use the ft-ligature in expressions such as \enquote{zu fünft} and \enquote{die zwölftschnells\kern0pt te Sprinterin Bayerns}: even though the |t| character now represents a derivational morpheme, the ligature occurs at end of the word or word fragment. In the case of the word \enquote{zwölftschnells\breaklig te}, the argument for keeping the ft ligature is based on the observation that the fragment \enquote{zwölft} serves a prefix to \enquote{schnells\kern0pt te}. 

In contrast, the ft-ligature should \emph{not} be used in \enquote{Beethoven's Fünfte Synphonie} and \enquote{zum elften Mal}. Observe that the argument in favor of breaking up the ft-ligature in the words \enquote{Fünfte} and \enquote{elften} is \emph{not} related to the fact that the words happen to have two syllables and that the syllables are divided between the letters~\enquote{f} and~\enquote{t}.

\end{itemize}

\item Case 4: A free morpheme ends in~\enquote{ft} (e.g., Saft, Duft, Luft, Kraft, Haft, and Vernunft) and is joined either to another free morpheme or to a suffix (representing either a derivational or an inflectional morpheme). Example words: \opt{Saftladen}, \opt{duftend}, \opt{luftig}, \opt{Kraftfahrzeug}, \opt{verkraften}, \opt{bekräftigen}, \opt{Haftung}, and \opt{ver\-nünftig}. The \pkg{selnolig} package does \emph{not} break up the ft-ligatures in these cases as they don't cross morpheme boundaries. Thus, these words are typeset as Saftladen, duftend, luftig, Kraftfahrzeug, verkraften, bekräftigen, Haftung, and ver\-nünftig, respectively. Given that no morpheme boundary crossings occur, the fact that there's a syllable boundary between |f| and~|t| in some cases should be irrelevant to the question of whether not to employ the ft and fft ligatures.

\end{itemize}
\end{itemize}


\section[Structure of the selnolig package]{Structure of the \pkg{selnolig} package}

\subsection{Components of the package}

The \pkg{selnolig} package has the following components:
\begin{itemize}
\item The main \enquote{driver} file is called \pkg{selnolig.sty}. It loads several other files and sets up the the package's main user macros, \cmmd{nolig}, \cmmd{keeplig}, and \cmmd{breaklig}. These macros are explained in more detail in the following subsection.
\item The package's user macros rely on lua code contained in the file \pkg{selnolig.lua}. 
\item The ligature suppression rules for English and German language documents are contained in the files \pkg{selnolig-english-patterns.sty} and \pkg{selnolig-english-patterns.sty}. 
\item Supplemental hyphenation exception patterns, mostly for composite words that involve one or more ligatures that are to be suppressed, are contained in the files \pkg{selnolig-english-hyphex.sty} and \pkg{selnolig-english-hyphex.sty}.
\item A user guide (the document you're reading right now); the source code of the user guide is available in the file \pkg{selnolig.tex}. 

\item Ancillary files: the files \pkg{selnolig-english-test.tex} and \pkg{selnolig-german-test.tex} load the \pkg{selnolig} package as well as either \pkg{selnolig-english-wordlist.tex} or \pkg{selnolig-german-wordlist.tex}. They serve to demonstrate the output of the \pkg{selnolig} package when run on lists of English or German words that are candidates for non-use of ligatures. The files \pkg{selnolig-english-test.pdf} and \pkg{selnolig-german-test.pdf} contain the results of compiling the test programs.\footnote{The two \enquote{test} files also load the package \pkg{showhyphens} to indicate automatically all instances where \LuaLaTeX\ might insert hyphenation points.}

\end{itemize}


\subsection{The package's user commands} \label{sec:syntax}

The file \pkg{selnolig.sty} should be loaded with a \cmmd{usepackage} statement, generally with one or more options; see \cref{sec:options} for a discussion of the available options. 

After setting up several Boolean switches to structure the processing of options, the package next loads the file \pkg{selnolig.lua}, which contains the package's lua code. The package then sets up several user macros. The three main user macros are \cmmd{nolig}, \cmmd{keeplig}, and \cmmd{breaklig}.



\subsubsection{The \cmmd{nolig} macro}
\label{sec:nolig}

\enlargethispage{0.3\baselineskip}

The package's main user macro is called \cmmd{nolig}. Each \cmmd{nolig} instruction takes two arguments: a search string and a string that indicates the insertion point for the non-ligation \enquote{whatsit}. For example, the macro
\begin{Verbatim}
              \nolig{lfful}{lf|ful}
\end{Verbatim}
instructs \LuaLaTeX\ to suppress automatically the ff-ligature in words such as \enquote{shelfful}, \enquote{bookshelfful}, and \enquote{selffulfilling}. 

More than one ligature suppression point may be provided in the second argument of a \cmmd{nolig} instruction. For instance, one \emph{could} specify \Verb+\nolig{Auflaufform}{Auf|lauf|form}+ to suppress both the fl- and the ff-ligatures in the words Auflaufform and Auflaufformen. For added flexibility, the \pkg{selnolig} package actually uses two separate \cmmd{nolig} commands to suppress the two ligatures in this word; see also \cref{sec:debugon}.


It is possible to use Lua-style wildcard characters in the search string, as long as these characters occur \emph{after} the non-ligation point. For example, the file \pkg{selnolig-german-patterns.sty} employs the rules 
\begin{Verbatim}
              \nolig{Dorff[aäeiloöruü]}{Dorf|f}
              \nolig{dorff[aäeiloöruü]}{dorf|f}
\end{Verbatim}
to search for words that contain the strings \opt{Dorff} and \opt{dorff} followed by a letter in the set |aäeiloöruü|.\footnote{These particular search strings are used so as not to suppress the ff-ligatures in words that \emph{end} in either \opt{Dorff} or \opt{dorff}, such as is the case with the surnames Dorff and Hausdorff.} Incidentally, it is not absolutely necessary, in the second argument of the \cmmd{nolig} command, to provide any material \emph{after} the vertical bar that indicates the non-ligation point. However, the readability of your \cmmd{nolig} instructions may suffer if you suppress that material.

If you examine the \cmmd{nolig} instructions provided in the files \pkg{selnolig-german-patterns.sty} and \pkg{selnolig-english-patterns.sty}, you'll notice quickly that there's some redundancy built into the package's ligature suppression rules. For instance, the need to suppress the ff-ligature in the word \enquote{auffallen} is catered to both by \Verb+\nolig{auff}{auf|f}+ and by \Verb+\nolig{ffall}{f|fall}+. This redundancy is there by design, because not all words that might fit one pattern will also fit the other. Providing some redundancy of this type seems like a reasonable way to proceed.

The arguments of the \cmmd{nolig} and \cmmd{keeplig} command are case-sensitive. 

\subsubsection{The \cmmd{keeplig} macro} 
\label{sec:keeplig}


The instruction |\keeplig{<string>}| lets users override \cmmd{nolig} instructions selectively, i.e., words that contain fragment |<string>| will not see the corresponding \cmmd{nolig} instruction enforced. For a \cmmd{keeplig} macro to work properly, its argument must be a string that includes \emph{as a subset} a string treated by one or more \cmmd{nolig} instructions.

Having the \cmmd{keeplig} macro is very useful because it permits the specification of simpler, i.e., less restrictive, \cmmd{nolig} instructions; any Type-II errors that may arise from having \cmmd{nolig} macros whose scope may be insufficiently restrictive can be fixed by providing judiciously chosen \cmmd{keeplig} macros.\footnote{In the present context, a Type-II error is the suppression of a ligature that is, in fact, valid for the word at hand.}

Consider the following example: If the \opt{ngerman} option is set, the package uses the macro 
\begin{Verbatim}
              \nolig{flich}{f|lich}
\end{Verbatim}
to break up the fl-ligature in words such as begrifflich, beruflich, brieflich, glimpflich, hilflich, höflich, käuflich, sträflich, tariflich, trefflich, unerschöpflich, and verwerflich (and quite a few more such words), which all contain the suffix |-lich| (a derivational morpheme). This particular \cmmd{nolig} instruction also catches the word \enquote{Lauflicht}, which contains the free morphemes |Lauf| and |licht|. 

It turns out that the scope of this \cmmd{nolig} rule is a bit too broad since it also catches certain words, such as \opt{Pflicht} and \opt{verpflichten}, for which the fl-ligature should \emph{not} be suppressed. However, rather than provide a large number of slightly more restrictive \cmmd{nolig} macros just to avoid including the Pflicht- and pflicht-words, the package provides the command
\begin{Verbatim}
              \keeplig{flicht}
\end{Verbatim}
This instruction tells \pkg{selnolig} to override the action of the \Verb+\nolig{flich}{f|lich}+ instruction for all words that contain the string \opt{flicht}. Most words affected by this \cmmd{keeplig} instruction happen to contain the strings \enquote{Pflicht} and \enquote{pflicht}. Interestingly, this instruction also serves to preserve the fl-ligature in words such as \enquote{flicht} and \enquote{anflicht} (the third-person-singular forms of the verbs flechten and anflechten). 

Probably somewhat surprisingly, at least at first glance, it is \emph{not necessarily} the case that ligatures contained in the argument of a \cmmd{keeplig} instruction will, in fact, be used in words that contain this search string. Why? It is because, as was noted above, \emph{more than one} \cmmd{nolig} instruction can apply to a given word. Consider, for instance, the aforementioned word \opt{Lauflicht}; it turns out to be the case that this word is caught by two \cmmd{nolig} rules and one \cmmd{keeplig} rule provided in the file \pkg{selnolig-german-patterns.sty}:
\begin{Verbatim}
              \nolig{aufl}{auf|l}
              \nolig{flich}{f|lich}
              \keeplig{flicht}
\end{Verbatim}
Observe that because the string |aufl| is \emph{not} a subset of the string |flicht|, the instruction |\keeplig{flicht}| does not undo the action of \Verb+\nolig{aufl}{auf|l}+. Hence, the word |Lauflicht| happily ends up being typeset as Lauflicht, i.e., \emph{without} an fl-ligature. 

Interestingly, the rule  |\keeplig{flicht}| is itself a bit too broad since it also catches the word \opt{Sumpf\-licht}, for which the fl-ligature \emph{should} in fact be suppressed. To address this situation, the file \pkg{selnolig-german-patterns.sty} also provides the rule 
\Verb+\nolig{Sumpfl}{Sumpf|l}+. This rule suppresses the fl-ligature for Sumpflicht as well as for Sumpflabkraut and Sumpfleiche (and the plural forms of these nouns).



\subsubsection{The \cmmd{breaklig} macro} 
\label{sec:breaklig}

The macro \cmmd{breaklig}, which doesn't take an argument, is provided as a hopefully easy-to-remember version of the lower-level \LaTeX\ command \Verb+\-\hspace{0pt}+. As its name suggests, you should insert this macro in places where you want to break up a ligature on an ad-hoc basis (and also wish to permit hyphenation to occur). For instance, to suppress the {\ebg\emph{sk}} ligature in the word \Verb+groundskeeper+ on a one-off basis, one might enter it as \enquote{\Verb+grounds\textbackslash breaklig keeper+} to get \emph{\ebg groundskeeper} instead of \emph{\ebg ground\mbox{sk}eeper}.\footnote{To suppress the {\ebg \emph{sk}} ligature for this word, as well as for words such as \emph{\ebg greenskeeper} and \emph{\ebg miskeep}, everywhere in the document, one could issue the directive \Verb+\nolig{skeep}{s|keep}+. The \pkg{selnolig} package provides just such a rule.}


The \pkg{selnolig} package does not provide a dedicated macro to override the action of a \cmmd{nolig} instruction on an ad~hoc basis, i.e., to \emph{require} the use of a typographic ligature on a one-off basis. The \LaTeX\ kernel command \Verb+\mbox{<string>}+ already provides this capability.


\subsection{Further steps in the package's startup process}

After the user commands of the \pkg{selnolig} have been set up, the remaining steps in the package's startup process depend on which language-related options are set:
\begin{itemize}
\item If \emph{no} language-specific options are in effect, the setup process terminates. Users may, of course, still provide their own \cmmd{nolig} and \cmmd{keeplig} rules and insert \cmmd{breaklig} instructions as they deem to be necessary.

\item If the \opt{english} option (or one of its synonymous options) is set, the files \pkg{selnolig-english-patterns.sty} and \pkg{selnolig-english-hyphex.sty} are loaded. The former file contains a detailed list of \cmmd{nolig} and \cmmd{keeplig} rules adapted to English language typographic usage; \Cref{sec:eng-listing} provides a complete listing of these rules. The latter file contains a list of hyphenation exceptions, mainly for words that contain one or more potential non-ligation points and for which \TeX's hypenation algorithm either misses valid hyphenation points or selects invalid hyphenation points; see \cref{sec:addlhyph} below.

\item If the \opt{ngerman} option (or one of its synonymous options) is set, the files \pkg{selnolig-german-patterns.sty} and \pkg{selnolig-german-hyphex.sty} are loaded. The former file contains ligature suppression rules appropriate for German typographic usage; \cref{sec:germ-listing} lists its contents. The latter file provides additional hyphenation rules for German-language words.

\item If the user specifies both the \opt{english} and \opt{ngerman} options (or some of their synonymous options), \emph{both} language-specific style files will be loaded. Under normal circumstances, a user will probably want to load only one or the other set of language-specific files, but not both sets.
\end{itemize}



\section{Additional ligature-related matters}
\label{sec:options}


\subsection{The package's main language options}

The \pkg{selnolig} package currently offers two main language-specific options: 
\begin{itemize}
\item \opt{english}; synonyms: \opt{british}, \opt{ukenglish}, \opt{UKenglish}, \opt{amer\-ican}, \opt{usenglish}, \opt{USenglish}, \opt{cana\-dian}, \opt{australian}, and \opt{new\-zealand}.
\item \opt{ngerman}; synonyms: \opt{german}, \opt{austrian}, \opt{naustrian}, \opt{swiss}, and \opt{swiss\-german}.
\end{itemize}
These language options may be used either individually or jointly. Indeed, this user guide was compiled with both the \opt{english} and \opt{ngerman} options set.

The ligature suppression rules associated with English and German are listed in \cref{sec:eng-listing,sec:germ-listing}, respectively.\footnote{To give an admittedly imperfect impression of just how much more complex the task is to create ligature suppression rules for German rather than it is for English: As of the mid-May 2013 version of the package, the \enquote{basic} English f-ligature suppression rules consist of 32 \cmmd{nolig} and 17 \cmmd{keeplig} instructions. (Including the rules that are activated if the |broadf| and |hdlig| options are both activated, the tally rises to about 420 \cmmd{nolig} and 52 \cmmd{keeplig} instructions.) The file \pkg{selnolig-german-patterns.sty}, in contrast, contains about 700 \cmmd{nolig} and 335 \cmmd{keeplig} directives. Recall that the package currently provides rules only for a set of \enquote{basic} f-ligatures for German words.}



\subsection[English language case: The broadf and hdlig options]{English language case: The \opt{broadf} and \opt{hdlig} options} \label{sec:eng-opt}

The ligature suppression patterns for English language words, contained in the file \pkg{selnolig-english-patterns.sty} and listed in \cref{sec:eng-listing} below, are grouped into four parts. The first two parts concern the suppression of f-ligatures. Part~1 provides a fairly limited, or \enquote{basic}, set of patterns that will always be executed, and Part~2 contains a broader set of ligation suppression rules that will be executed if the \opt{broadf} option is specified. 

For English-language documents, only a fairly limited number of f-ligature suppression rules is enabled by default, i.e., if the \opt{broadf} option is not enabled. Eliminating \emph{all} f-ligatures that cross morpheme boundaries simply does not appear to be a major concern in English-language typography. Whereas many (maybe most?) people would agree that it's advisable not to use the ffi-ligature in words such as chaffinch and wolffish, and not to use the ffl-ligature in words such as scofflaw and offload, there appears to be far less of a perceived need to suppress the~fi (ffi) ligature in the far more commonly occurring words that end in~f (ff\,) followed by the particles -ing, -ish, -ier, -iest, -ily, and -iness.\footnote{Examples of such words are sur\mbox{fi}ng, oa\mbox{fi}sh, lea\mbox{fi}er, goo\mbox{fi}est, flu\mbox{ffi}ly, and goo\mbox{fi}ness.} The same goes for the~fl (ffl) ligature in words that end in~f (ff) followed by~-ly.\footnote{Examples are \mbox{aloofly} and \mbox{gruffly}.} That is why only a few f-ligature suppression macros are enabled by default if the \opt{english} option is set. To enable the broader set of f-ligature suppression rules, users must set the \opt{broadf} option explicitly.

My choices regarding which f-ligature suppression rules belong to the \enquote{basic} and \enquote{broadf} groups are almost entirely pragmatic. They are certainly not based on any overriding English-language typographic principles (which, possibly, don't even exist). However, if anyone happens to have a strong view on whether either \emph{fewer} or \emph{more} f-ligature suppression macros should be included in the \enquote{basic} group\textemdash especially if you can provide references to such discussions in learned circles\textemdash I would love to hear from you.


Part 3 of the file \pkg{selnolig-english-patterns.sty}, which is enabled if the \opt{hdlig} option is set, provides ligature suppression patterns involving the \mbox{ct}, \mbox{st}, and \mbox{sp} ligatures. Examples are words such as arctangent (rather than ar\mbox{ct}angent), painstaking (rather than pain\mbox{st}aking), and trespass (worse: tre\mbox{sp}ass). Furthermore, the~st and~sp ligatures are suppressed automatically for words of Greek roots that contain the \opt{sth} and \opt{sph} character triples, such as anaesthesia, isthmus, atmosphere and hemisphere. In such cases, I'd argue that using the distinctive-looking st and sp ligatures unnecessarily obscures the \opt{th} and \opt{ph} character pairs (which derive from the single Greek letters~$\theta$/$\vartheta$ and $\phi$/$\varphi$, respectively). Given that the \opt{ph} character pair is usually pronounced as~\enquote{\opt{f}}, the readability of the words that contain the character triple \opt{sph} would likely suffer if they were typeset \emph{with} an sp ligature, e.g., as atmo\mbox{sp}here and \mbox{sp}herical, say.

Setting the \opt{hdlig} option also enables ligature suppression rules for additional discretionary ligatures such as \emph{th}, \emph{at}, and~\emph{et}. These ligatures might be deemed inappropriate for use in words such as \emph{ligh\mbox{th}ouse}, \emph{po\mbox{th}ole}, \emph{arom\mbox{at}herapy}, \emph{alb\mbox{at}ross}, \emph{nin\mbox{et}y}, and \emph{non\mbox{et}heless}; with the \opt{hdlig} option set, these words will be typeset as \emph{lighthouse}, \emph{pothole}, \emph{aromatherapy}, \emph{albatross}, \emph{ninety}, and \emph{nonetheless}. Ligature suppression rules are provided for the following discretionary ligatures, which occur only in the \emph{italic} font shape of the font family used in this document: \emph{th}, \emph{at}, \emph{et}, \emph{as}, \emph{is}, \emph{us}, {\ebg \emph{sk}}, \emph{ll}, and~\emph{fr}. Part~3 of \cref{sec:eng-listing} lists these rules.

Part 4 of the file \pkg{selnolig-english-patterns.sty}, which is also processed if the \opt{hdlig} option is set, deals with cases where one discretionary typographic literature, say \emph{as}, might pre-empt the use of a more appropriate but trailing typographic ligature, say \emph{st} or~\emph{sp}, in words such as \emph{f\mbox{as}t}~$\to$ \emph{fa\mbox{st}} and \emph{cl\mbox{as}p}~$\to$ \emph{cla\mbox{sp}}. Note that the issue being addressed in this part is not that of a ligature improperly spanning a morpheme boundary; instead, it is the possibility that \TeX\ might pre-empt one typographic ligature with another ligature within one and the same morpheme. This issue is discussed in more detail in \cref{sec:preempt} below.

\subsection{Composite words with ambiguous morphology}

There may be pairs of composite words which look alike but are made up of two different pairs of morphemes. For instance, the German words \opt{Saufladen} and \opt{Wachstube} may be constructed as \opt{Sauf-laden}\slash \opt{Sau-fladen} and as \opt{Wachs-tube}\slash \opt{Wach-stube}, respectively. In one case, using the fl and st ligatures would be wrong; in the other, using the ligatures would help greatly in indicating the intended meaning of the composite words. 
For words such as these, software isn't smart enough to \enquote{discern} which possible meaning is intended.\footnote{It turns out that if the \opt{ngerman} option is set and the \pkg{babel} package is loaded as well, the \opt{selnolig} package will break up the fl ligature in \opt{Saufladen} but not the st ligature in \opt{Wachstube}, i.e., the words will be typeset as \enquote{Saufladen} and \enquote{Wachstube}, respectively. If that's \emph{not} what you want, you'll need to mark up the words explicitly, say as follows: \Verb+Sau\mbox{fl}aden+ and \Verb+Wachs\breaklig tube+. } Writers, of course, could (and should?) choose to insert explicit hyphen characters to indicate the intended meaning.

The preceding two examples involve pairs of free morphemes in both cases. Here's a composite word where one case involves a free morpheme and an inflectional morpheme, whereas the other involves two free morphemes: \opt{Surftest}. Consider the questions, \enquote{Surftes\kern0pt t Du vergangene Woche in Hawaii?}, and \enquote{Hat die Athletin den Surf\breaklig tes\kern0pt t bes\kern0pt tanden?} Only in the second case is it clearly wrong to use the ft-ligature; in the first case, one could argue that the use of the ft-ligature actually helps establish the composite word's intended meaning\dots

An even more complicated example is the word \opt{Chefinnenleben}, which contains three morphemes. This word can be deconstructed either as \opt{Chefinnen-leben} (\enquote{lives of female bosses}) \emph{or} as \opt{Chef-innenleben} (\enquote{inner life, or lives, of a boss}). Thus, the word's middle particle\textemdash\enquote{innen}\textemdash can function both as a suffix (in this case, an inflectional morpheme) to \enquote{Chef} and as a free morpheme that modifies the third morpheme, \enquote{Leben}. Software isn't smart enough yet to discern on its own which usage is intended.

The macros of the \pkg{selnolig} package are set \emph{not} break up the fi-ligature in the shorter words Chefin and Chefinnen, in keeping with the principle that the fi-ligature is permitted for suffixes that start with an~\enquote{i}. In contrast, \pkg{selnolig} will break up the fi-ligature in the longer words Chefinnenleben and Chefinnenräume, because in these cases the working assumption is that \opt{innen} acts as a prefix of sorts to the third morpheme (Leben or Räume). If this is \emph{not} what you want, i.e., if you really do mean to refer to lives or spaces of female bosses, be sure to use \Verb+\mbox{fi}+ instructions to preserve the fi-ligatures. Better yet: write the words in question using explicit hyphens, i.e., as Chefinnen-Leben and Chefinnen-Räume. And, while you're at it, do consider writing the other forms as Chef-Innenleben and Chef-Innenräume. Your readers will thank you.

Summing up: There are words for which it's not possible to decide without knowledge of the context within which the word is used whether or not a given ligature should be enabled or suppressed. The best advice I can give is to stay on the lookout for such words and to take corrective action if you believe \pkg{selnolig}'s choice is the wrong one.



\subsection{How to provide additional ligature suppression patterns}

As already noted, it's not possible to claim that the non-ligation search-and-insert patterns set up in \pkg{selnolig-english-patterns.sty} and \pkg{selnolig-german-patterns.sty} are complete or, for that matter, will \emph{ever} be complete. If you come across words containing ligatures that ought to be suppressed but aren't caught (yet) by the \pkg{selnolig} package, you could insert \cmmd{breaklig} instructions to suppress the ligatures on a case-by-case basis; conversely, if you discover an instance for which \pkg{selnolig} improperly breaks up a ligature, you could override that action by encasing the character pair (or triple) in an \cmmd{mbox} statement. Alternatively, you could create your owb \cmmd{nolig} and \cmmd{keeplig} rules to deal with the cases you've discovered on a document-wide basis.\footnote{A third option, naturally, is to bring this case to the attention of the maintainer of the \pkg{selnolig} package and ask him/her to update the package\dots}

Suppose, say, that you've been tasked with preparing a special edition of Thomas Mann's novel \enquote{Der Tod in Venedig}. Suppose further that you have chosen to use an \enquote{Antiqua} (Roman) font to typeset the new edition, as fewer and fewer people nowadays can manage to read with ease text set in a {\blackletterfont period-appropriate blackletter font}. Moreover, the font you've chosen features a ligature for the ffl character triple. During these preparations, you happen to notice (i)~that the novel contains the word \opt{inbegriffleitend}\footnote{This word really does occur in the aforementioned novel! This novel may also be pretty much the \emph{only} place where the word inbegriffleitend is used. I performed a Google search for this word; the only occurrences of this word, apart from online editions of Thomas Mann's novel, are on sites of a couple of French bloggers who agonize over how this word might possibly be translated from German to French\dots} and (ii)~that the \pkg{selnolig} package does not (yet) appear to include a rule that suppresses the ffl-ligature for this word. To address this problem\textemdash while simultaneously creating a search pattern that also catches inappropriate ffl-ligatures in the (hopefully quite a bit more common!) words \opt{Jugendtreffleiter} and \opt{Kunststoffleitung}\textemdash you could add the following \Verb+\nolig+ rule to your document's preamble:
\begin{Verbatim}
              \nolig{ffleit}{ff|leit}
\end{Verbatim}
With this rule in place, the words will be typeset as inbegriffleitend, Jugendtreffleiter, and Kunststoffleitung, respectively. Just in case this discussion has made you curious: the file \pkg{selnolig-german-patterns.sty} actually provides the even more general (i.e., less restrictive) rule \Verb+\nolig{fleit}{f|leit}+.

When designing your own \cmmd{nolig} and \cmmd{keeplig} rules, you would ideally create them in such a way that they're neither too specific and hence only apply to a very small set of words, nor too general and hence end up applying to words for which the rule isn't meant to apply at all. Consider, say, what would happen if you had come up with the rule
\begin{Verbatim}
              \nolig{flei}{f|lei}
\end{Verbatim}
This rule would certainly succeed in (correctly) breaking up the fl ligature in the words inbegriffleitend, Jugendtreffleiter, and Kunststoffleitung as well as in Laufleis\breaklig tung, Häuflein, Kreislaufleiden, Scherflein, and many more. However, this rule would also incorrectly break up the fl ligature in many other words as well, including f\kern0pt leissig\slash f\kern0pt leißig, f\kern0pt leischig, Hackf\kern0pt leisch, and Diplomf\kern0pt leißarbeit. When in doubt, try to err on the side of making the rules a bit too restrictive.



\subsection[How to use the selnolig package to suppress certain ligatures globally]{How to use the \pkg{selnolig} package to suppress certain ligatures \emph{globally}}
\label{sec:global-nolig}


The main purpose of the \pkg{selnolig} package is, obviously, to disable certain ligatures selectively. However, it can also be used to suppress ligation globally for selected character pairs.\footnote{I first became aware of the potential need for such a feature from reading Frank Mittelbach's posting, \href{http://tex.stackexchange.com/q/61042/5001}{Suppress certain ligatures generally}, on \url{tex.stackexchange.com}. } 

For instance, suppose that you are typesetting a Turkish text. The Turkish alphabet features both a dotted~i and a dotless~\char"0131\ character. I understand that in Turkish typesetting practice, the fi and ffi ligatures should \emph{never} be employed, so as to avoid creating any doubts as to whether it's an~i or an~\char"0131\ character that follows the~\enquote{f} character. To satisfy the need of Turkish typography for global suppression of the fi and ffi ligatures, one could issue the command
\begin{Verbatim}
              \nolig{fi}{f|i}+
\end{Verbatim}
in the document's preamble.


Or, suppose that you have a font that provides ligatures for the {\ebg \mbox{fb}, \mbox{fh}, \mbox{fj},} and {\ebg\mbox{fk}} character pairs (as well as, possibly, the {\ebg \mbox{ffb}, \mbox{ffh}, \mbox{ffj},} and {\ebg\mbox{ffk}} character triples). If you wanted to suppress the four former f-ligatures globally (and also break up the latter ligatures into ff\kern0pt b, ff\kern0pt h, ff\kern0pt j, and~ff\kern0pt k, respectively), you could do so by issuing the following commands: 
\begin{Verbatim}
              \nolig{fb}{f|b}
              \nolig{fh}{f|h}
              \nolig{fj}{f|j}
              \nolig{fk}{f|k}
\end{Verbatim}
In fact, these commands are activated automatically if the package's \opt{ngerman} or \opt{english} options are set. This is done because I was unable to come up with a single instance of a \emph{German} or \emph{English} language word involving these character combinations that doesn't also involve a morpheme boundary collision.

Of course, your document may contain words \emph{not} of German or English origin that contain some of these character pairs and do not involve a morpheme boundary crossing. For such words, it is not desirable to suppress the corresponding ligatures. One such word is \opt{Kafka}: one may not wish to suppress the {\ebg\mbox{fk}}-ligature for this specific word. The \pkg{selnolig} package provides \cmmd{keeplig} macros to preserve the {\ebg\mbox{fk}}-ligature in names such as {\ebg Kafka, Safka, Piefke, Potrafke, Sprafke, Shirafkan,} and {\ebg Tirafkan}.\footnote{Aside: It was Felix Lehmann's desire to preserve the {\ebg\mbox{fk}} ligature when typesetting \enquote{{\ebg Kafka}} that stimulated the creation of the package's \cmmd{keeplig} macro. Of course, once the \cmmd{keeplig} macro was created, all kinds of further great uses for this macro were quickly discovered.} 

Your documents may also words of \emph{Nordic} origin that contain the \opt{fj} character pair, such as \opt{Sognefjord} and \opt{Dovrefjell}. Because the \opt{fj} character pair in these words does not span a morpheme boundary, the {\ebg\mbox{fj}}-ligature should not be broken up; i.e., the words should be typeset as {\ebg Sognefjord and Dovrefjell}, respectively. The package therefore provides \cmmd{keeplig} rules to take care of (a)~words that contain the particles {\ebg fjord, fjör, fjell, and fjäll} and (b)~names such as {\ebg Eefje, Sufjan, Prokofjew, and Astafjew}.

A \enquote{rare} typographic ligature that may warrant global suppression, at least for English language documents, is~\mbox{\emph{ij}}.\footnote{In many fonts I'm familiar with, including the one used for this user guide, the |ij| character pair is available in the upright font shape as a \emph{digraph} rather than as a true, i.e., joined-up, ligature.} To the best of my knowledge, a morpheme boundary crossing occurs for all English language words that contain the~\opt{ij} character pair: \emph{antijam}, \emph{bijection}, \emph{demijohns}, and \emph{hijack}. By the logic set forth above, this ligature should therefore be suppressed for all of these words.\footnote{If this ligature weren't suppressed, the preceding words would be typeset as \emph{ant\mbox{ij}am}, \emph{b\mbox{ij}ection}, \emph{dem\mbox{ij}ohns}, and \emph{h\mbox{ij}ack}.} The \mbox{\emph{ij}} ligature also seems inappropriate for most words that came into English from languages such as French, Japanese, and Spanish, including \emph{bijou} (jewel), \emph{gaijin} (foreigner), \emph{jipijapa} (Panama hat), and \emph{marijuana} (Maryjane). (What?! Were you maybe thinking of a different meaning of this word? Why would you?!) The \mbox{\emph{ij}} ligature is therefore suppressed \emph{globally} by the \pkg{selnolig} package if the options \opt{english} and \opt{hdlig} are set.
However, this ligature \emph{does} get used a lot in Dutch. Thus, the \pkg{selnolig} package issues various \cmmd{keeplig} directives so that this ligature isn't suppressed for some names and words of Dutch origin, such as \emph{de~Bruijn} and \emph{rijsttafel}.\footnote{The word \emph{rijsttafel}, incidentally, features three consecutive \enquote{rare} ligatures. Another word that contains three rare ligatures, though not consecutive ones, is \emph{\mbox{is}thmus}. }



\subsection{What if one ligature pre-empts a trailing, more appropriate ligature?} \label{sec:preempt}

If a font provides many discretionary ligatures, the likelihood is high that words will occur for whichthe use of a ligature for the first two characters of a character \emph{triple} might pre-empt the use of a more appropriate ligature for the last two characters of that triple. To be sure, the issue of ligature pre-emption is not limited to \enquote{discretionary} ligatures; it can also occur with \enquote{common} f-ligatures.\footnote{Suppose that a certain font provides ff, fi, and fl ligatures but no ffi and ffl ligatures, and consider how \TeX\ would typeset words containing \opt{ffi} and \opt{ffl} character triples. Left to its own devices, \TeX\ would let the leading ff-ligature pre-empt the trailing fi- and fl-ligatures, resulting in typographically incorrect outcomes for words such as wol\mbox{ff}ish (better: wolf\mbox{fi}sh), sa\mbox{ff}lower (safflower), au\mbox{ff}inden (auffinden), and Scha\mbox{ff}leisch (Schaffleisch). \label{fn:triple}} 

In this section, we examine the use of \cmmd{nolig} instructions to address this contingency, focusing on cases of~\emph{st}, \emph{sp}, \emph{th}, and~\emph{ta} character pairs being preceded by character pairs (for which the font provides ligatures) that end in~\emph{s} or~\emph{t}, respectively. This focus is dictated largely by the discretionary ligatures provided by the main text font used for this user guide (Garamond Premier Pro). Other ligature-rich fonts may provide further possibilities for one ligature inappropriately pre-empting that for a trailing character pair.\footnote{For the font Garamond Premier Pro, I've discovered the following preculiar exception to the general rule that \TeX\ always gives precedence to a ligature for the first two characters of a character triple: for the character triple \opt{fis} (as in \opt{fist} and \opt{fish}), \TeX\ gives preference to the trailing \emph{is} ligature over the preceding \emph{fi} ligature, causing these words to be typeset as \emph{f\mbox{is}h} and \emph{f\mbox{is}t}, respectively. I can't tell if this outcome is a conscious design feature or a bug. For now, \pkg{selnolig} is set to override this behavior, i.e., to always give preference to the leading \emph{fi} ligature over the trailing \emph{is} ligature for words that contain the strings \opt{fist} and \opt{fish}; hence, they'll be rendered as \emph{fist} and \emph{fish}, respectively. 

Note that if the \opt{broadf} option is set (as is the case for the document you're reading), this setting implies that words such as \emph{deafish, dwarfish, elfish, oafish, selfish, unselfish, wolfish, draffish, giraffish, gruffish, offish, raffish, sniffish, standoffish, stiffish, \emph{and} toffish}, as well as the associated adverbs ending in \emph{-ly}, will not feature an \emph{is} ligature.}



\subsubsection*{Ligatures for \emph{as}, \emph{is}, and \emph{us} that pre-empt an \emph{st} ligature}

Suppose that the text font in use provides ligatures for the \emph{as}, \emph{is}, and \emph{us} character pairs as well as for the \emph{st} character pair. By \TeX's rules for forming typographic ligatures, words that contain the character \emph{triples} \opt{ast}, \opt{ist}, or \opt{ust} will see the first two characters ligated, pre-empting the use of a typographic ligature for the trailing \emph{st} character pair. There are at least three distinct reasons why this outcome is not desirable.

First, given the rather distinctive look of the \emph{st}~ligature, the word \opt{stochastic} may look a bit odd if the \emph{st} ligature is used only once\textemdash\emph{stoch\mbox{as}tic}\textemdash simply because the \emph{as} ligature pre-empts the second \emph{st} ligature; readers may prefer the look of \emph{stocha\mbox{st}ic}. Second, non-use of the st/\emph{st} ligature may be undesirable if the same word occurs twice and in close visual proximity, once set in the upright font shape\textemdash for which there are no ligatures for the \opt{as}, \opt{is}, and \opt{us} character pairs, and hence for which the issue of ligature pre-emption doesn't arise\textemdash and once in italics: must and \emph{m\mbox{us}t}; readers may prefer the look of must and \emph{mu\mbox{st}}. Or, consider the words \enquote{historian} and \enquote{history} when typesetting them in italics: I'd say it's much better to typeset them as \emph{historian} and \emph{history} rather than as \emph{h\mbox{is}torian} and \emph{h\mbox{is}tory}. Moreover, I suspect that Austrians\textemdash at least the ones who care about discretionary typographic ligatures\dots\textemdash may prefer to see the name of their country typeset as \emph{Austria} rather than as \emph{A\mbox{us}tria}. Finally, do you prefer the look of \emph{Do f\mbox{as}t festive f\mbox{is}ts foster f\mbox{us}tiness?} or that of \emph{Do fast festive fists foster fustiness?} You prefer the latter look too? Great! 

Third, there may be cases where an \emph{as} ligature not only pre-empts a subsequent \emph{st} ligature but also spans a morpheme boundary, as in the words \emph{infr\mbox{as}tructure} and \emph{se\mbox{as}trand}.\footnote{This case was already noted in \cref{fn:triple}. There, two words (\opt{wolffish} and \opt{Schaffleisch}) are mentioned for which the ff-ligature would improperly pre-empt fi- and fl-ligatures \emph{and} happen to span a morpheme boundary.} For such words, the \emph{as} ligature should probably be suppressed in any case to increase the words' legibility: \emph{infra\mbox{st}ructure} and \emph{sea\mbox{st}rand}.

The \pkg{selnolig} package is set to give preference to the distinctive-looking \emph{st} ligature over \emph{as}, \emph{is}, and \emph{us} ligatures. To this end, the following \cmmd{nolig} rules are provided:\footnote{The second of these three commands, while correct for most words that contain the string \opt{ist}, unnecessarily suppresses the \emph{is} ligature for words for which the \emph{st} character pair crosses a morpheme boundary, e.g., words that start with \emph{dis-t\ldots}\textemdash e.g., \emph{distend, distribute, distrust, disturb}\textemdash or with \emph{mis-t\ldots}\textemdash e.g., \emph{mistake, mistranslate, mistype}. (Note that separate \cmmd{nolig} rules already suppress the st/\emph{st} ligature for these words.) At this time there are no plans to address this (overall hopefully minor?) issue.}
\begin{Verbatim}
              \nolig{ast}{a|st}
              \nolig{ist}{i|st}
              \nolig{ust}{u|st}
\end{Verbatim}



\subsubsection*{Ligatures for \emph{as}, \emph{is}, and \emph{us} that pre-empt an \emph{sp} ligature}

The same three reasons for not letting \emph{as}, \emph{is}, and \emph{us} ligatures pre-empt an \emph{st} ligature also apply to the case of the equally distinctive-looking \emph{sp} ligature. The \pkg{selnolig} package therefore provides rules to ensure that the \emph{sp} ligature is used in words such as \emph{clasp}, \emph{hasp}, \emph{hispanic}, \emph{raspberry}, \emph{teaspoon}, \emph{wasp}, \emph{crisp}, \emph{lisp}, \emph{whisper}, and \emph{cusp}. 



\subsubsection*{Ligatures for \emph{at} and \emph{et} that pre-empt a \emph{th} ligature}

Suppose that a font provides ligatures for the \emph{at}, \emph{et}, and \emph{th} character pairs. By \TeX's rules for forming ligatures, without special intervention the word \opt{mathematics} will be typeset as \emph{m\mbox{at}hematics} rather than as \emph{mathematics} because the first \emph{at} ligature pre-empts the \emph{th} ligature. The same happens for words such as \emph{b\mbox{at}h}, \emph{K\mbox{at}hryn}, and \emph{p\mbox{at}hology}.
Given the commonness and the distinctive pronuciation of the \opt{th} character pair in the English language, as well as the high frequency of this character pair in words of Greek origin (for which the Latin-alphabet \opt{th} character pair derives from the single Greek character $\theta$/$\vartheta$), it seems undesirable to let the \emph{at}-ligature pre-empt the \emph{th} ligature for these words. 

Fixing the \emph{at}--\emph{th} ligature pre-emption issue globally\textemdash e.g., via \Verb+\nolig{ath}{a|th}+\textemdash is not completely innocuous, though, because doing so will also suppress the \emph{at} ligature for words such as \opt{boathook}, for which the \emph{th} ligature would span a morpheme boundary and thus shouldn't be employed anyway. For such words, then, there's no need to suppress the \emph{at} ligature. These cases are dealt with by providing specific \cmmd{keeplig} rules to re-enable the use of the \emph{at} ligature.

Suppressing an \emph{et} ligature in favor of a subsequent \emph{th} ligature via \Verb+\nolig{eth}{e|th}+ is almost universally correct, either because the \emph{th} ligature \emph{should} take precedence\textemdash as in the words \emph{ethics}, \emph{methane}, and \emph{teeth}\textemdash or because the \emph{et} ligature would cross a morpheme boundary and hence shouldn't be used anyway, as in the words \emph{forethought} and \emph{rethink}. 
I say that it's \emph{almost} universally correct to do so; however, there are some words, such as \opt{Beethoven}, \opt{prophethood}, and \opt{sweetheart}, for which the \emph{th} ligature would be inappropriate anyway and for which the use of the \emph{et} ligature would hence be unproblematic. To address this issue, \cmmd{keeplig} rules are provided to override the rule \Verb+\nolig{eth}{e|th}+ for words such as \emph{Beethoven}, \emph{prophethood}, and \emph{sweetheart}.\footnote{Note that this method works if the font being used provides both \emph{et} and \emph{th} ligatures. If the text font you employ provides only the \emph{th} ligature but no \emph{et} ligature, these \cmmd{keeplig} rules should be disabled.}


%\enlargethispage{1\baselineskip}

\subsubsection*{Ligatures for \emph{at} and \emph{et} that pre-empt a \emph{ta} ligature}

There seem to be very few English words for which an \emph{at} ligature might inappropriately pre-empt a \emph{ta} ligature. One such word is \opt{atap}, whose readability is enhanced if it's typeset as~\emph{atap} rather than as~\emph{\mbox{at}ap}.

Virtually all words for which an \emph{et} ligature might inappropriately pre-empt the use of a trailing \emph{ta} ligature appear to be words for which the \emph{et} ligature crosses a morpheme boundary and should be suppressed. Examples are \emph{betake, betatter, bristletail, caretaker, detach, dovetail, foretaste, pretax, retable, retack, retard, retarget, timetable, \emph{and} wiretap}. The \emph{et}-related ligature suppression rules already put in place to deal with morpheme boundary crossing cases should therefore suffice to catch these cases as well. There may also be cases of persons' names which include the string |eta| for which the \emph{ta} ligature should not be pre-empted. For instance, the author of this package prefers to see his surname typeset as \emph{Loretan} rather than as \emph{Lor\mbox{et}an}\dots




\section{Further issues}

\subsection{Known bugs}

\begin{enumerate}
\item The \cmmd{nolig} directives don't work properly on the final word in the argument of certain \TeX\ macros, such as |\section{}|. For instance, the ff ligature in |Shelfful| isn't broken up if it's encountered in the instruction |\section{Shelfful}|.

The proposed remedy is to insert either one or more space characters or the instruction \cmmd{kern0pt} between the final word of the command's argument and its closing curly brace. To wit, ligature suppression works as expected if the command given in the preceding paragraph is modified to |\section{Shelfful }|\textemdash observe the presence of whitespace.\footnote{In versions of \pkg{selnolig} prior to version 0.216, this bug also occurred at the end of the argument of \cmmd{footnote} instructions. That bug has fortunately been fixed; i.e., it's no longer necessary to insert a \cmmd{kern0pt} directive after the final word of the footnote and the command's closing curly brace.}

\item The \cmmd{nolig} macros also don't operate correctly on words (including, if present, any trailing punctuation marks) that are followed \emph{immediately} by a |%| (comment) character. 

The best workaround in this case is to insert the instruction \cmmd{kern0pt} between the final word and the comment character.

\item In \opt{itemize} or \opt{enumerate} environments, if the content of an \cmmd{item} directive \emph{ends} with a word (including an associated punctuation mark) that contains a ligature that should be suppressed \textemdash i.e., if it is followed immediately by either another \cmmd{item} directive or an \Verb+\end{itemize}+ or \Verb+\end{enumerate}+ statement\textemdash ligature, suppression fails yet again. 

The remedy I propose for these cases is to leave a blank line between the end of one \cmmd{item}'s content and the next \cmmd{item} instruction or the \Verb+\end{itemize}+ or \Verb+\end{enumerate}+ instruction. Inserting the instruction \cmmd{kern0pt} works too.

\item If the final word (again, possibly, with an associated punctuation character) of a sentence which is followed immediately by an \opt{enumerate}, \opt{itemize}, or other such environment contains a ligature that should be suppressed, ligature suppression again will not work properly. 

I recommend leaving a blank line between that sentence and the start of the \opt{enumerate} or \opt{itemize} environment. Inserting the instruction \cmmd{kern0pt} also works.

\end{enumerate}

I'm not sure if the following matter constitutes a bug or \enquote{merely} a case of incompatibility between two \LaTeX\ packages. The \pkg{selnolig} package does not appear to interact well with the \LaTeX\ package \pkg{ngerman}. However, as was noted earlier, \pkg{selnolig} interacts nicely with the \pkg{babel} package with one of the options \opt{ngerman}, \opt{german}, \opt{austrian}, and \opt{naustrian} set. Unless someone can convince me that using the \pkg{ngerman} package is truly preferable to using the \pkg{babel} package along with one of the available German language options, I probably won't bother addressing this incompatibility.



\subsection{Supplementary hyphenation exception patterns} \label{sec:addlhyph}

\TeX's hyphenation algorithms are widely acknowledged to be very good. However, for the English language case at least, it tends to miss quite a few permissible hyphenation points when dealing with words that end in |-f-ing|, |-f-ier|, |-f-iest|, |-f-less|, |-f-like|, etc. Hyphenation exception lists are provided in the files \pkg{selnolig-english-hyphex.sty} and \pkg{selnolig-german-hyphex.sty}, respectively, for English and German words.

The German-language hyphenation exception list is currently still the shorter of the two; however, this may change in the future. The German word list is shorter in part because it is assumed that writers of German-language documents use the \pkg{babel} package and select the option \opt{ngerman} (or one of the related options); doing so also loads specialized hyphenation patterns suitable for German text.\footnote{As was already noted earlier, the \pkg{selnolig} package is also compatible with the \pkg{hyphsubst} package.} 

It is possible to instruct \pkg{selnolig} \emph{not} to load the package's hyphenation exception lists. You may want to do so, say, if you must use UK-English hyphenation patterns and therefore mustn't make use of the US-English hyphenation patterns provided by the package. (To the best of my knowledge, though, most of the hyphenation patterns indicated in \pkg{selnolig-english-hyphex.sty} are common to UK and US English.) To skip loading the additional hyphenation patterns when invoking the \pkg{selnolig} package, you should specify the option \opt{noadditional\-hyphen\-a\-tion\-patterns}. (I am obviously not trying to make it too easy to invoke this option~\dots)

As was already noted in \cref{sec:anythingelse}, if you use the \pkg{babel} package with, say, the \opt{ngerman} option, be sure to load \pkg{selnolig} package \emph{after} the \pkg{babel} package. That way, the \pkg{selnolig} package's additional hyphenation exception patterns won't be overridden by \pkg{babel}'s settings.

Incidentally, if the files \pkg{selnolig-english-hyphex.sty} and \pkg{selnolig-german-hyphex.sty} are located in a directory that's in the search path of your TeX distribution, these packages may be loaded via the usual \cmmd{usepackage} statements without having to load the entire \pkg{selnolig} package.



\subsection{Ancillary information about the package's activity} \label{sec:debugon}

If you execute the command \cmmd{debugon}, detailed information about each \cmmd{nolig} and \cmmd{keeplig} pattern match that is encountered is written to the \opt{.log} file. (The package's default setting is \cmmd{debugoff}.)

Because of the potential redundancy in some of the package's \cmmd{nolig} commands, it is possible that more than one pattern match will occur for a given word. E.g., for the verb \enquote{auffahren}, two separate \cmmd{nolig} commands apply simultaneously, \emph{viz.}, \Verb+\nolig{auff[aeiloruyäöü]}{auf|f}+ and \Verb+\nolig{ffahr}{f|fahr}+. For this word, the following information is written to the \opt{.log} file:
\begin{Verbatim}
              pattern match: auffahren - auff[aeiloruyäöü]
              pattern match: auffahren - ffahr
              Do ligature suppression for: auffahren
              Inserting nolig whatsit before glyph: f
              Last char: n
\end{Verbatim}

It is also possible that words are found with more than one ligature suppression point. For example, if the word \enquote{Auflaufform}\textemdash which happens to have both an fl- and an ff-ligature that should be suppressed\textemdash is encountered, the following lines are written to the \opt{.log} file; note that in this case, two separate \cmmd{nolig} commands \enquote{catch} the fl and ff ligatures:
\begin{Verbatim}
              pattern match: Auflaufform - flauf
              pattern match: Auflaufform - Aufl[aeiouyäöü]
              pattern match: Auflaufform - auff[aeiloruyäöü]
              pattern match: Auflaufform - fform
              Do ligature suppression for: Auflaufform
              Inserting nolig whatsit before glyph: l
              Inserting nolig whatsit before glyph: f
              Last char: m
\end{Verbatim}

If \emph{both} a \cmmd{nolig} and a \cmmd{keeplig} command apply to a word\textemdash as is the case for \opt{fjord}, to which both \Verb+\nolig{fj}{f|j}+ and \Verb+\keeplig{fjord}+ apply\textemdash the following (mercifully short) bit of information is written to the \opt{.log} file:
\begin{Verbatim}
              pattern match nolig and keeplig: fjord - fj - fjord
p\end{Verbatim}

If more than one \cmmd{nolig} directive \emph{as well as} a \cmmd{keeplig} instruction apply to a given word, as is the case for the word \enquote{Streiflicht}, the following information is written to the \opt{.log} file:
\begin{Verbatim}
              pattern match nolig and keeplig: Streiflicht - flich - flicht
              pattern match: Streiflicht - reifl
              Do ligature suppression for: Streiflicht
              Inserting nolig whatsit before glyph: l
              Last char: t
              \end{Verbatim}
Observe that the first nolig rule's pattern, |flich|, is overridden by the keeplig rule's pattern |flicht|. The second nolig rule's pattern, |reifl|, is \emph{not} overridden, and it is the debugging-related information associated with the second \cmmd{nolig} pattern that ends up being written to the |.log| file. 

To terminate or suspend the writing of the debugging-related information to the \opt{.log} file, one may execute the command \cmmd{debugoff}. To restart the logging of this information, issue the command \cmmd{debugon}.



\subsection[Suspending and restarting the operation of selnolig's macros]{Suspending and restarting the operation of \pkg{selnolig}'s macros}

By default, \pkg{selnolig}'s macros are switched on (assuming, of course, that your document is compiled under \LuaLaTeX). If you want to suspend their operation, you should issue the command
\begin{Verbatim}
              \selnoligoff
\end{Verbatim}
at the desired point in your document. Conversely, if \pkg{selnolig}'s macros need to be switched back on, just issue the command
\begin{Verbatim}
              \selnoligon
\end{Verbatim}


\subsection{Lists of words that fit German and English non-ligation patterns}

Extensive lists of German and English language words for which one or more ligatures should be suppressed are provided in the supplemental files \pkg{selnolig-german-test.pdf} and \pkg{selnolig-english-test.pdf}. I started the list of German language words with the examples provided by the \pkg{rmligs} script; I've added quite a few more words to that list in the meantime. Thanks to the great work of Felix Lehmann and Steffen Hildebrand, explained in more detail in \cref{sec:thanks}, the package's German language search patterns actually apply to a much larger number of words than those listed in \pkg{selnolig-german-test.pdf}. Naturally, suggestions for still more words to be de-ligated are always welcome.

The files \pkg{selnolig-german-test.tex} and \pkg{selnolig-english-text.tex} are \enquote{driver programs} that load the \pkg{selnolig} package and then run it on the respective lists of German- and English-language words. To compile the driver programs, be sure to use \LuaLaTeX.

\section{License and acknowledgments} \label{sec:thanks}

The entire \pkg{selnolig} package is placed under the terms of the \LaTeX\ Project Public License, version~1.3 or later (\url{http://www.latex-project.org/lppl.txt}).
It has the status \enquote{maintained}.

I owe a huge intellectual and programming debt to Patrick Gundlach and Taco Hoekwater, who responded kindly and generously with detailed computer code to various queries I posted to \href{http://tex.stackexchange.com}{\texttt{tex.stackexchange.com}}.\footnote{See especially the questions \href{http://tex.stackexchange.com/q/37443/5001}{Any suggestions/requests for features for a new package that allows disabling ligatures for (pre)selected words?}, \href{http://tex.stackexchange.com/q/48516/5001}{How to suppress the operation of a luatex-defined macro on a string if the string is part of macro or a label}, and \href{http://tex.stackexchange.com/q/63005/5001}{Ligature suppression algorithm fails if the word in question contains an Umlaut (dieresis) before the ligature}.} Without their expertise in programming in Lua and interfacing the lua code with \LaTeX, this package would not exist. They certainly deserve most of the credit for the lua code used by the \pkg{selnolig} package.

Felix Lehmann (a linguist and expert in morphology, i.e., the study of morphemes) and Steffen Hildebrandt (computer scientist extraordinaire) served as patient and careful testers of several early beta versions of this package, uncovering and fixing bugs, pointing out unclear passages in the user guide, writing scripts to automate the discovery of redundancies and syntax errors in the package's \cmmd{nolig} and \cmmd{keeplig} instructions, and providing many excellent suggestions for enhancements and other improvements. Steffen also provided crucial modifications to the package's lua code to make possible the \cmmd{keeplig} macro.

Even more importantly, Felix and Steffen created scripts to test systematically and comprehensively the package's German \cmmd{nolig} and \cmmd{keeplig} search patterns for linguistic adequacy and (relative) completeness.
They began with a corpus of almost 850 million [!] words, which they marked up with information on the morphological constituents of each word. From this huge word list, they extracted a set of 462,000 unique word forms containing potential f-ligatures.
According to their analysis, an early version (ca.\ late October 2012) of the \pkg{selnolig} package already dealt correctly with 85 percent (394,000) of those word forms, while still generating 21,000 Type~I errors and 48,000 Type~II errors!\footnote{In the context of the \pkg{selnolig} package, a Type~I error is the failure to suppress a typographically inappropriate ligature, and a Type~II error is the improper suppression of a typographically valid ligature.}\textsuperscript{,}\footnote{1,000 words contained more than one potential f-ligature, hence the difference.} 
Fortunately (for me at least), they also discovered that a non-negligible part of the 69,000 errors wasn't real but, rather, the result of typos in the words included in the corpus and/or of incorrect morphological analysis. The detailed Type~I and~II error lists they generated were critical in helping me refine\textemdash and occasionally revise completely\textemdash the package's \cmmd{nolig} and \cmmd{keeplig} rules, rapidly bringing down the number of Type~I and~II errors.\footnote{For instance, after Steffen wrote the lua code that made possible the \cmmd{keeplig} macro, I was able to eliminate, in one fell swoop, more than 10,000~[!!] Type~II errors generated by the package's earlier, incorrect suppression of the fl-ligature in words that contain the morpheme \opt{pflicht}. } All major changes to the German language ligature suppression patterns are still being subjected to their testing algorithms to streamline the tasks of detecting what's left to improve and catching any newly introduced errors.

Felix and Steffen started the automated testing of the package's |\nolig| and |\keeplig| rules as their finals project for the course \emph{Introduction to Computational Linguistics} at the University of Massachusetts at Amherst in the fall of 2012.\footnote{Their \href{https://github.com/SHildebrandt/selnolig-check}{code} and \href{https://github.com/SHildebrandt/selnolig-check/blob/master/selnolig-check-documentation.pdf?raw=true}{finals paper} is available online.} They wish to thank the Institut für Maschinelle Sprachverarbeitung at the Universität Stuttgart for granting them a license for the morphological analysis tool SMOR\footnote{Schmid, H., A. Fitschen, and U. Heid, 2004, \enquote{SMOR: A German Computational Morphology Covering Derivation, Composition, and Inflection}, \emph{Proceedings of the IVth International Conference on Language Resources and Evaluation (LREC)}, pp.~1263--1266, Lisbon, Portugal.} and, in particular, Helmut Schmid for his guidance. They also express their gratitude to the \emph{Web-as-Corpus kool ynitiative} (\emph{WaCky}) for letting them use the SDeWaC corpus,%
\footnote{Baroni, M., S.~Bernardini, A.~Ferraresi, and E.~Zanchetta, 2009, \enquote{The WaCky Wide Web: A Collection of Very Large Linguistically Processed Web-Crawled Corpora}, \emph{Language Resources and Evaluation}, 43~(3), pp. 209--226.} as well as to Rajesh Bhatt (University of Massachusetts at Amherst), Miriam Butt (Universität Konstanz), and Sabine Schulte im~Walde (Universität Stuttgart) for helping them find the right resources for their project.

The \href{http://www.ctan.org/tex-archive/support/rmligs}{\pkg{rmligs}} script lists hundreds of German language words for which various f\nobreak-liga\-tures should be suppressed. I created many of the initial German language ligature suppression rules of the \pkg{selnolig} package to treat the words listed in the \pkg{rmligs} package.\footnote{All versions of the \pkg{rmligs} package are archived at \url{http://www.j3e.de/ispell/igerman98/dict/}.} 

Matthias Vogel very kindly shared with me a set of regular-expression based ligature suppressing macros, named \href{http://www.winedt.org/Macros/LaTeX/Ligatures-German.php}{Ligatures-German}, he wrote for the WinEdt programmer's editor. Matthias' macros work by inserting \pkg{babel}-style (\Verb+"|+) ligature suppressing shortcut directives in the appropriate spots in the |.tex| file (which can then be compiled with pdf\LaTeX). These macros, and a file he sent me containing an extensive list of German words for which one or more f-ligatures should be suppressed, led me to thoroughly refine and extend the scope of the \pkg{selnolig} package's German language ligature suppressing rules.

Barbara Beeton provided careful and incisive comments on an early version of the package's user guide and English language ligature suppression macros. (She also pointed out to me that my surname looks better if it's typeset as \emph{Loretan} rather than as \emph{Lor\mbox{et}an}!) A suggestion received from David Bellows led me to extend some of the \cmmd{nolig} rules in Part~2 (activated by setting the option |broadf|) of the file \pkg{selnolig-english-patterns.sty}. Other contributors to \url{tex.stackexchange.com} and \url{comp.text.tex}, too numerous to name individually, also helped guide and influence the genesis of this package. To all of you, I express my sincere thanks.

The website \url{http://www.morewords.com} provides very convenient methods for searching English language words that may contain cases of ligature collisions across morpheme boundaries. For German words, the site \url{http://corpora.informatik.uni-leipzig.de/?dict=de} provides a similar resource. 



\clearpage
\appendix
\selnoligoff  % turn off selnolig's macros

\clubpenalty100
\widowpenalty100

\small % reduce font size by 1pt


\section[English-language ligature suppression rules: selnolig-english-patterns.sty]{English-language ligature suppression rules: \\ 
\pkg{selnolig-english-patterns.sty}}
\label{sec:eng-listing}

\begin{multicols}{2}
\VerbatimInput{selnolig-english-patterns.sty}
\end{multicols}

\clearpage
\section[German-language ligature suppression rules:
selnolig-german-patterns.sty]{German-language ligature suppression rules: \\ 
\pkg{selnolig-german-patterns.sty}}
\label{sec:germ-listing}

Introductory note: To accommodate the practice of Swiss-German writers of not using the \enquote{ß} character at akk (and using \enquote{ss} in its place), all search-and-insert strings that contain an \enquote{ß} character are duplicated with equivalent search-and-insert strings containing \enquote{ss}.

\bigskip

\begin{multicols}{2}
\VerbatimInput{selnolig-german-patterns.sty}
\end{multicols}

\clearpage
\section[The package's main style file: selnolig.sty]
{The package's main style file: \pkg{selnolig.sty}}

\VerbatimInput{selnolig.sty}

\clearpage
\section[The package's lua code: selnolig.lua]{The package's lua code: \pkg{selnolig.lua}}
\label{sec:luacode}

\VerbatimInput{selnolig.lua}


\clearpage
\section[Reporting bugs and other issues with the selnolig package: A suggested template]{Reporting bugs and other issues with the \pkg{selnolig} package:\\A suggested template} \label{sec:template}

\VerbatimInput{selnolig-bugreport.tex}


\end{document}
