% !TeX root = selnolig.tex % !TEX TS-program = lualatex % 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) % Part 1: Preliminaries % --------------------- \def\selnoligpackagename{selnolig} \def\selnoligpackageversion{0.302} \def\selnoligpackagedate{2015/10/26} % Announce who we are. \typeout{=== Package \selnoligpackagename, Version \selnoligpackageversion, Date \selnoligpackagedate\space ===} \ProvidesPackage{selnolig}[\selnoligpackagedate] % Issue warning message if not running under LuaLaTeX. \RequirePackage{ifluatex} \ifluatex \RequirePackage{luatexbase} \else \typeout{ ======================================= } \typeout{ WARNING WARNING WARNING } \typeout{ --------------------------------------- } \typeout{ The ligature suppression macros of the } \typeout{ selnolig package *require* LuaLaTeX. } \typeout{ Because you're NOT running this package } \typeout{ under LuaLaTeX, ligature suppression } \typeout{ *can not* be performed. } \typeout{=========================================} \fi % If the 'fontspec' package isn't loaded by the time % the '\begin{document}' directive is encoutered, issue % an error message and exit. \AtBeginDocument{% \ifluatex \@ifpackageloaded{fontspec}{}{% \PackageError{selnolig}{% ========================================== \MessageBreak Error Alert Error Alert \MessageBreak ------------------------------------------ \MessageBreak The selnolig package *requires* the \MessageBreak 'fontspec' package, but it hasn't been \MessageBreak loaded. Exiting now. \MessageBreak ===========================================} } \fi } % Set up some fundamental Boolean variables, their % default values, and define the user options. % The main language options are 'english' and 'german'. % We provide the option 'otherlang' option just in case % a user wants to provide ligature suppression patterns % for languages other than English and German. \newif\if@english\@englishfalse \newif\if@german\@germanfalse \newif\if@otherlang\@otherlangfalse \DeclareOption{english}{\@englishtrue} % synonymous options: \DeclareOption{usenglish}{\@englishtrue} \DeclareOption{ukenglish}{\@englishtrue} \DeclareOption{USenglish}{\@englishtrue} \DeclareOption{UKenglish}{\@englishtrue} \DeclareOption{american}{\@englishtrue} \DeclareOption{british}{\@englishtrue} \DeclareOption{canadian}{\@englishtrue} \DeclareOption{australian}{\@englishtrue} \DeclareOption{newzealand}{\@englishtrue} \DeclareOption{ngerman}{\@germantrue} % synonymous options: \DeclareOption{german}{\@germantrue} \DeclareOption{austrian}{\@germantrue} \DeclareOption{naustrian}{\@germantrue} \DeclareOption{swiss}{\@germantrue} \DeclareOption{swissgerman}{\@germantrue} \DeclareOption{otherlang}{\@otherlangtrue} % synonymous option: \DeclareOption{otherlanguage}{\@otherlangtrue} % For English, the default is to load only a fairly basic % set of non-ligation rules pertaining to f-ligatures. % Among them are the "standard five" (ff, fi, fl, ffi, % and ffl) ligatures as well as the ft ligature. % % Two options to augment the "basic" setting: % - broadf More non-ligation rules for f-ligatures % - hdlig Additional ligature suppression rules for % 'historic' and/or 'discretionary' ligatures, % e.g., ct, sp, st, sk, th, as, is, us, fr, % ll, et, at, and ta \newif\if@broadfset\@broadfsetfalse \DeclareOption{broadf}{\@broadfsettrue} \newif\if@hdligset\@hdligsetfalse \DeclareOption{hdlig}{\@hdligsettrue} % The 'basic' option automatically sets the preceding % Booleans to 'false'. \DeclareOption{basic}{\@broadfsetfalse\@hdligsetfalse} % The package also provides hyphenation exception % patterns for English and German language words. % Loading these patterns is enabled by default. This % can be disabled by providing the option % 'noadditionalhyphenationpatterns'. \newif\if@addlhyph\@addlhyphtrue \DeclareOption{noadditionalhyphenationpatterns}{\@addlhyphfalse} % The option 'noftligs' serves to suppress ft and fft % ligatures *globally*. Default value: 'false'. \newif\if@noftligs\@noftligsfalse \DeclareOption{noftligs}{\@noftligstrue} % Finally, an option to set most language-related % Boolean variables (other than '@addlhyph') to % 'true' simultaneously. \DeclareOption{all}{% \@englishtrue \@broadfsettrue \@hdligsettrue \@germantrue \@otherlangtrue} % Finally, process all options \ProcessOptions\relax % Part 2: Load the lua code and set up the user macros % ---------------------------------------------------- \ifluatex % Load the lua code contained in 'selnolig.lua'. \directlua{ require("selnolig.lua") } % Commands to switch selnolig's routines on and off \newcommand\selnoligon{% \directlua{ enableselnolig() }% } \newcommand\selnoligoff{% \directlua{ disableselnolig() }% } % By default, selnolig's macros are switched on \selnoligon % Recording operations of selnolig package to the log % file is enabled via the '\debugon' command. % Note: the default value of 'debug' (set in % 'selnolig.lua') is 'false'. To turn off logging % of selnolig's activity, use the command \debugoff. \newcommand\debugon{% \directlua{ debug=true } } \newcommand\debugoff{% \directlua{ debug=false } } % The first main user macro is called '\nolig': \newcommand\nolig[2]{ \directlua{ suppress_liga( "\luatexluaescapestring{#1}", "\luatexluaescapestring{#2}" ) } } % A second user macro allows global overriding of % rules set by \nolig instructions: \newcommand\keeplig[1]{ \directlua{ always_keep_liga( "\luatexluaescapestring{#1}" ) } } % A third user macro turns ligature suppression off % temporarily: \newcommand\uselig[1]{% \directlua{ enable_suppression(false) }% \mbox{#1}% \directlua{ enable_suppression(true) }% } % A fourth user macro: '\breaklig'. This is % hopefully easier to remember than having to % type "\-\hspace{0pt}". \newcommand{\breaklig}{\-{\hspace{0pt}}} \else % If *not* running under LuaLaTeX, provide dummy % definitions for package's four main user macros % as well as for the auxilliary macros \selnoligon, % \selnoligoff, \debugon, and \debugoff. \newcommand{\nolig}[2]{} \newcommand{\keeplig}[1]{} \newcommand{\uselig}[1]{\mbox{#1}} \newcommand{\breaklig}{\-{\hspace{0pt}}} \let\selnoligon\relax \let\selnoligoff\relax \let\debugon\relax \let\debugoff\relax \fi % Part 3: What to do if the 'english' option is set % ------------------------------------------------- \if@english \ifluatex % English ligature suppression rules \RequirePackage{selnolig-english-patterns} \fi \if@addlhyph \RequirePackage{selnolig-english-hyphex} \fi \fi % Part 4: What to do if the 'ngerman' option is set % ------------------------------------------------- \if@german \ifluatex % German ligature suppression rules \RequirePackage{selnolig-german-patterns} \fi \if@addlhyph \RequirePackage{selnolig-german-hyphex} \fi \fi % Part 5: What to do if the 'otherlang' option is set % --------------------------------------------------- \if@otherlang % currently nothing included \fi