diff options
Diffstat (limited to 'macros')
38 files changed, 3135 insertions, 2367 deletions
diff --git a/macros/latex/contrib/denisbdoc/README.md b/macros/latex/contrib/denisbdoc/README.md index 6bce9c15cb..6b000ba4e5 100644 --- a/macros/latex/contrib/denisbdoc/README.md +++ b/macros/latex/contrib/denisbdoc/README.md @@ -1,10 +1,10 @@ -denisbdoc - A personal package for documenting classes and packages, v. 0.9.2 +denisbdoc - A personal package for documenting classes and packages, v. 0.9.4 ============================================================================= **The sole purpose of this (quick 'n dirty) `denisbdoc` package is for documenting the classes written by their author (Denis Bitouzé).** -The class is supplied in `.dtx` format. If you want to unpack the `.dtx` +The package is supplied in `.dtx` format. If you want to unpack the `.dtx` yourself, running: tex denisbdoc.dtx diff --git a/macros/latex/contrib/denisbdoc/denisbdoc.dtx b/macros/latex/contrib/denisbdoc/denisbdoc.dtx index 36172e6df8..2a6d7d057b 100644 --- a/macros/latex/contrib/denisbdoc/denisbdoc.dtx +++ b/macros/latex/contrib/denisbdoc/denisbdoc.dtx @@ -3,13 +3,13 @@ \iffalse %</internal> %<*readme> -denisbdoc - A personal package for documenting classes and packages, v. 0.9.2 +denisbdoc - A personal package for documenting classes and packages, v. 0.9.4 ============================================================================= **The sole purpose of this (quick 'n dirty) `denisbdoc` package is for documenting the classes written by their author (Denis Bitouzé).** -The class is supplied in `.dtx` format. If you want to unpack the `.dtx` +The package is supplied in `.dtx` format. If you want to unpack the `.dtx` yourself, running: tex denisbdoc.dtx @@ -18,6 +18,131 @@ will extract the package. This package is currently not documented. %</readme> +%<*ctanomat> +% This is a description file for ctan-o-mat. +% It manages uploads of a package to +% CTAN -- the Comprehensive TeX Archive Network. +% +% The syntax is roughly oriented towards (La)TeX. +% Two form of the macros are used. The simple macros take one argument +% in braces. Here the argument may not contain embedded macros. +% +% The second form uses an environment enclosed in \begin{}/\end{}. +% In the long text fields logo macros can be used. +% +% You should enter your values between the begin and the end of the +% named type. +% ------------------------------------------------------------------------- +% This field contains the CTAN id of the package. +% The value is optional. +% The value is restricted to 32 characters. +\pkg{denisbdoc} +% ------------------------------------------------------------------------- +% This field contains the version of the package. +% The value is optional. +% The value is restricted to 32 characters. +\version{0.9.4 2022-06-13} +% ------------------------------------------------------------------------- +% This field contains the name of the author(s). +% The value is optional. +% The value is restricted to 128 characters. +\author{Denis Bitouzé} +% ------------------------------------------------------------------------- +% This field contains the email address of the uploader. +% The value is an email address. +% The value is restricted to 255 characters. +\email{denis.bitouze@univ-littoral.fr} +% ------------------------------------------------------------------------- +% This field contains the name of the uploader. +% The value is restricted to 255 characters. +\uploader{Denis Bitouzé} +% ------------------------------------------------------------------------- +% This field contains the directory on CTAN. +% The value is optional. +% The value is restricted to 255 characters. +\ctanPath{/macros/latex/contrib/denisbdoc} +% ------------------------------------------------------------------------- +% This field contains the license. +% The value is optional. +% The value is restricted to 2048 characters. +% Multiple values are allowed. +\license{lppl1.3c} +% ------------------------------------------------------------------------- +% This field contains the URL of the home page. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\home{} +% ------------------------------------------------------------------------- +% This field contains the URL of the bug tracker. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\bugtracker{} +% ------------------------------------------------------------------------- +% This field contains the support channel. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\support{} +% ------------------------------------------------------------------------- +% This field contains the version management. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\repository{} +% ------------------------------------------------------------------------- +% This field contains the developer's channel. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\development{} +% ------------------------------------------------------------------------- +% This field contains the update indicator; true for update. +% The value is optional. +% The value is restricted to 8 characters. +\update{true} +% ------------------------------------------------------------------------- +% This field contains the topics id. +% The value is optional. +% The value is restricted to 1024 characters. +% Multiple values are allowed. +\topic{} +% ------------------------------------------------------------------------- +% This field contains the text for the mail announcement. +% The value is optional. +% The value is restricted to 8192 characters. +\begin{announcement} +\end{announcement} +% ------------------------------------------------------------------------- +% This field contains the one-liner for the package. +% The value is optional. +% The value is restricted to 128 characters. +\summary{A personal dirty package for documenting packages} +% ------------------------------------------------------------------------- +% This field contains the descriptive abstract for the package. +% The value is optional. +% The value is restricted to 4096 characters. +\begin{description} +A personal dirty package for documenting packages. +\end{description} +% ------------------------------------------------------------------------- +% This field contains the note to the CTAN upload managers. +% The value is optional. +% The value is restricted to 2048 characters. +\begin{note} +\end{note} +% ------------------------------------------------------------------------- +% This field contains the archive file. +% The value is the file name of the archive to be uploaded. +% It may have a relative or absolute directory. +\file{../dtx-forge/denisbdoc.zip} +%</ctanomat> %<*internal> \fi \def\nameofplainTeX{plain} @@ -31,7 +156,7 @@ This package is currently not documented. \preamble ----------------------------------------------------------------------------- denisbdoc --- A personal dirty package for documenting personal classes, - version 0.9.3 + version 0.9.4 Maintained by Denis Bitouzé E-mail: denis.bitouze@univ-littoral.fr @@ -69,6 +194,11 @@ This work consists of the file denisbdoc.dtx %</install> %<install>\endbatchfile %<*internal> +\usedir{.} +\generate{ + \nopreamble\nopostamble + \file{\jobname.pkg}{\from{\jobname.dtx}{ctanomat}} +}% \usedir{source/latex/denisbdoc} \generate{ \file{\jobname.ins}{\from{\jobname.dtx}{install}} @@ -128,6 +258,7 @@ This work consists of the file denisbdoc.dtx %\changes{v0.9.1}{2020/10/14}{Further CTAN version} %\changes{v0.9.2}{2021-10-13}{Further CTAN version} %\changes{v0.9.3}{2021-12-01}{Further CTAN version} +%\changes{v0.9.4}{2022-06-13}{Further CTAN version} % %\begin{abstract} % ... @@ -198,7 +329,7 @@ This work consists of the file denisbdoc.dtx % % The usual preliminaries. % \begin{macrocode} -\ProvidesExplPackage {denisbdoc} {2021-12-01} {0.9.3} +\ProvidesExplPackage {denisbdoc} {2022-06-13} {0.9.4} {A personal package for documenting packages} % \end{macrocode} % @@ -249,7 +380,6 @@ This work consists of the file denisbdoc.dtx % % to be copied and pasted as they are, and not replaced % % by "h" and "i" \RequirePackage[T1]{fontenc} - \RequirePackage[utf8]{inputenc} % \end{macrocode} % % In order to get rid of the warning "PDF inclusion: multiple pdfs with page @@ -1403,14 +1533,14 @@ This work consists of the file denisbdoc.dtx % \renewcommand{\generalname}{Général}% % \if@DBD@beamer@not@loaded@ -\ifcsdef{@chapter}{ - \xapptocmd{\@chapter}{% +\ifcsdef{@chapter}{% + \AddToHook{cmd/@chapter/before}{% \addtocontents{dbwarninglist}{\protect\addvspace{10\p@}}% \addtocontents{dbremarklist}{\protect\addvspace{10\p@}}% \addtocontents{dbexamplelist}{\protect\addvspace{10\p@}}% \addtocontents{dbfaqlist}{\protect\addvspace{10\p@}}% \addtocontents{dbtablist}{\protect\addvspace{10\p@}}% - }{}{} + }% }{} \fi% % @@ -1734,9 +1864,15 @@ This work consists of the file denisbdoc.dtx \texttt{#1} % \egroup } -\ProvideDocumentCommand{\file}{ m } +\ProvideDocumentCommand{\file}{ s m } {% - \_@@_file:n {#1} + \IfBooleanT {#1} { + \IfLanguageName{french}{fichier~}{}% + } + \_@@_file:n {#2} + \IfBooleanT {#1} { + \IfLanguageName{english}{~file}{}% + } } \NewDocumentCommand{\File}{ m } {% @@ -1784,6 +1920,10 @@ This work consists of the file denisbdoc.dtx { \_@@_file:n {#1}% } +\NewDocumentCommand{\software}{ m } +{ + \_@@_file:n {#1}% +} \NewDocumentCommand{\texstudio}{ } { \program{TeXstudio} @@ -2095,14 +2235,30 @@ This work consists of the file denisbdoc.dtx \newunicodechar{⟩}{$\rangle$} % \end{macrocode} % +% Borrowed from the \package{tcolorbox} package: % \begin{macrocode} \cs_new_protected:Nn \_@@_meta:nn { + % \bgroup% + % \normalfont + % \ttfamily% + % \itshape% + % \textcolor{#1}{$\langle$#2$\rangle$}% + % \egroup% \bgroup% - \normalfont - \ttfamily% - \itshape% - \textcolor{#1}{$\langle$#2$\rangle$}% + \color{#1}% + \ensuremath\langle + \ifmmode \expandafter \nfss@text \fi + {% + \meta@font@select + \edef\meta@hyphen@restore + {\hyphenchar\the\font\the\hyphenchar\font}% + \hyphenchar\font\m@ne + \language\l@nohyphenation + \ttfamily% + #2% + \meta@hyphen@restore + }\ensuremath\rangle \egroup% } \AtBeginDocument{% @@ -2186,17 +2342,26 @@ This work consists of the file denisbdoc.dtx % \end{macrocode} % % \begin{macrocode} -\newtcbtheorem[list~inside=dbwarninglist,number~within=\g_@@_number_within_tl,crefname={avertissement}{avertissements}]{dbwarning}{Avertissement}{% +\IfLanguageName{french}{\tl_const:Nn \c_@@_warning_title_tl {avertissement}}{ + \IfLanguageName{english}{\tl_const:Nn \c_@@_warning_title_tl {warning}}{}% +}% +\newtcbtheorem[list~inside=dbwarninglist,number~within=\g_@@_number_within_tl,crefname={\c_@@_warning_title_tl}{\c_@@_warning_title_tl s}]{dbwarning}{\text_titlecase:n\c_@@_warning_title_tl}{% colback=red!5!white, colframe=red!75!black, dbtcb }{wa} -\newtcbtheorem[list~inside=dbexamplelist,number~within=\g_@@_number_within_tl,crefname={exemple}{exemples}]{dbexample}{Exemple}{% +\IfLanguageName{french}{\tl_const:Nn \c_@@_example_title_tl {exemple}}{ + \IfLanguageName{english}{\tl_const:Nn \c_@@_example_title_tl {example}}{}% +}% +\newtcbtheorem[list~inside=dbexamplelist,number~within=\g_@@_number_within_tl,crefname={\c_@@_example_title_tl}{\c_@@_example_title_tl s}]{dbexample}{\text_titlecase:n\c_@@_example_title_tl}{% colback=lime!5!white, colframe=lime!75!black, dbtcb, }{ex} -\newtcbtheorem[list~inside=dbremarklist,number~within=\g_@@_number_within_tl,crefname={remarque}{remarques}]{dbremark}{Remarque}{% +\IfLanguageName{french}{\tl_const:Nn \c_@@_remark_title_tl {remarque}}{ + \IfLanguageName{english}{\tl_const:Nn \c_@@_remark_title_tl {remark}}{}% +}% +\newtcbtheorem[list~inside=dbremarklist,number~within=\g_@@_number_within_tl,crefname={\c_@@_remark_title_tl}{\c_@@_remark_title_tl s}]{dbremark}{\text_titlecase:n\c_@@_remark_title_tl}{% colback=cyan!5!white, colframe=cyan!75!black, dbtcb @@ -2207,7 +2372,13 @@ This work consists of the file denisbdoc.dtx % fontupper=\itshape, dbtcb }{faq} -\newtcbtheorem[list~inside=dbtabularlist,number~within=\g_@@_number_within_tl,crefname={tableau}{tableaux}]{dbtab}{Tableau}{% +\IfLanguageName{french}{\tl_const:Nn \c_@@_table_title_tl {tableau}}{ + \IfLanguageName{english}{\tl_const:Nn \c_@@_table_title_tl {table}}{}% +}% +\IfLanguageName{french}{\tl_const:Nn \c_@@_tables_title_tl {tableaux}}{ + \IfLanguageName{english}{\tl_const:Nn \c_@@_tables_title_tl {tables}}{}% +}% +\newtcbtheorem[list~inside=dbtabularlist,number~within=\g_@@_number_within_tl,crefname={\c_@@_table_title_tl}{\c_@@_tables_title_tl}]{dbtab}{\text_titlecase:n\c_@@_table_title_tl}{% colback=purple!5!white, colframe=purple!75!black, fontupper=\itshape, @@ -2590,10 +2761,22 @@ This work consists of the file denisbdoc.dtx % listing~options={rangebeginprefix=\\,rangeendsuffix=\}} }% }% -\renewcommand*{\tcbdocnew}[1]{\scriptsize\sffamily\textcolor{green!50!black}{\bfseries -Nouv.~:}~#1} -\renewcommand*{\tcbdocupdated}[1]{\scriptsize\sffamily\textcolor{blue!75!black}{\bfseries -\textsc{m.-à-j.}~:}~#1} +\tl_const:Nn \c_@@_updated_style_tl {\scriptsize\sffamily\color{green!50!black}\bfseries} +\tl_const:Nn \c_@@_new_style_tl {\scriptsize\sffamily\color{blue!75!black}\bfseries} +\IfLanguageName{french}{ + \tcbset{doclang/updated={\c_@@_updated_style_tl M.~ à~ j.}\normalcolor\normalfont} +}{ + \tcbset{doclang/updated=\c_@@_updated_style_tl Updated\normalcolor\normalfont} +}% +\IfLanguageName{french}{ + \tcbset{doclang/new=\c_@@_new_style_tl Nouv.\normalcolor\normalfont} +}{ + \tcbset{doclang/new=\c_@@_new_style_tl New\normalcolor\normalfont} +}% +% \IfLanguageName{french}{}{ +% \renewcommand*{\tcbdocupdated}[1]{\scriptsize\sffamily\textcolor{blue!75!black}{\bfseries% +% \textsc{m.-à-j.}~:}~#1} +% }% % \lstset{style=dbtex} \sys_if_engine_pdftex:TF diff --git a/macros/latex/contrib/denisbdoc/denisbdoc.pdf b/macros/latex/contrib/denisbdoc/denisbdoc.pdf Binary files differnew file mode 100644 index 0000000000..63db279379 --- /dev/null +++ b/macros/latex/contrib/denisbdoc/denisbdoc.pdf diff --git a/macros/latex/contrib/gzt/doc/french/gzt-fr.pdf b/macros/latex/contrib/gzt/doc/french/gzt-fr.pdf Binary files differindex 3b85f1192e..0309184cb8 100644 --- a/macros/latex/contrib/gzt/doc/french/gzt-fr.pdf +++ b/macros/latex/contrib/gzt/doc/french/gzt-fr.pdf diff --git a/macros/latex/contrib/gzt/doc/french/gzt-fr.tex b/macros/latex/contrib/gzt/doc/french/gzt-fr.tex index 52839b4fec..f61459fbdd 100644 --- a/macros/latex/contrib/gzt/doc/french/gzt-fr.tex +++ b/macros/latex/contrib/gzt/doc/french/gzt-fr.tex @@ -4,7 +4,7 @@ \usepackage[firstpage]{draftwatermark} % \lstset{% - alsolanguage=[varioref]TeX,% + moretexcs=vref,% } % \indexsetup{level=\section*,toclevel=section,noclearpage,firstpagestyle=__gzt_mainmatter_ps} diff --git a/macros/latex/contrib/gzt/source/gzt.dtx b/macros/latex/contrib/gzt/source/gzt.dtx index 7cad88ccd7..cea642f47b 100644 --- a/macros/latex/contrib/gzt/source/gzt.dtx +++ b/macros/latex/contrib/gzt/source/gzt.dtx @@ -94,7 +94,7 @@ $quote_filenames = 0; % This field contains the version of the package. % The value is optional. % The value is restricted to 32 characters. -\version{1.1.2 2022-03-18} +\version{1.1.3 2022-06-13} % ------------------------------------------------------------------------- % This field contains the name of the author(s). % The value is optional. @@ -214,6 +214,11 @@ France”](https://smf.emath.fr/les-publications/la-gazette): % \end{macrocode} # [Unreleased] +# [1.1.3] - 2022-06-13 + +## Added +New options for special special (!) editions + # [1.1.2] - 2022-03-18 ## Changed @@ -330,8 +335,8 @@ Gazette de la Société Mathématique de France”](https://smf.emath.fr/les-pub \fi %</internal> %<*class|class-article|install> -\def\gztfileversion{1.1.2} -\def\gztfiledate{2022-03-18} +\def\gztfileversion{1.1.3} +\def\gztfiledate{2022-06-13} %</class|class-article|install> %<*install> \input l3docstrip.tex @@ -1009,6 +1014,8 @@ Running "make install" installs the files in the local TeX tree. \bool_new:N \g_@@_cover_bool \bool_new:N \g_@@_coverpage_bool \bool_new:N \g_@@_inside_pages_bool +\bool_new:N \g_@@_invisible_titles_bool +\bool_new:N \g_@@_rubrics_in_toc_bool % \bool_new:N \g_@@_no_inside_backcover_bool %<class-article>\bool_gset_true:N \g_@@_for_authors_bool @@ -1097,6 +1104,8 @@ Running "make install" installs the files in the local TeX tree. specialedition / color .code:n = { \tl_gset:Nn \g_@@_special_edition_color_tl {#1} }, + specialedition / invisible~ titles .bool_gset:N = \g_@@_invisible_titles_bool, + specialedition / rubrics~ in~ toc .bool_gset:N = \g_@@_rubrics_in_toc_bool, specialedition / minitoc .code:n = { \bool_gset_false:N \g_@@_frontcover_without_minitoc_bool }, @@ -4157,7 +4166,7 @@ Running "make install" installs the files in the local TeX tree. \int_zero:N \g_@@_item_in_rubric_int \phantomsection \par - \bool_if:NF {\g_@@_special_edition_bool} { + \bool_if:nF {\g_@@_special_edition_bool && !\g_@@_rubrics_in_toc_bool} { \addcontentsline{toc}{part}{\g_@@_rubric_title_tl} } \thispagestyle{@@_rubric_ps} @@ -4522,57 +4531,61 @@ Running "make install" installs the files in the local TeX tree. \tl_set:Nn \l_@@_title_box_tl { \noindent - \hspace*{18mm} - \begin{adjustbox}{minipage=\linewidth-18mm,valign=t} - \raggedright - \color{@@_article_title_color} - \fontsize{20}{25}\selectfont - \bfseries - \g_@@_title_tl - \tl_if_empty:NF \g_@@_subtitle_tl { + \bool_if:NF {\g_@@_invisible_titles_bool} { + \hspace*{18mm} + \begin{adjustbox}{minipage=\linewidth-18mm,valign=t} + \raggedright + \color{@@_article_title_color} + \fontsize{20}{25}\selectfont + \bfseries + \g_@@_title_tl + \tl_if_empty:NF \g_@@_subtitle_tl { + \par + \g_@@_subtitle_tl + } + \phantomsection \par - \g_@@_subtitle_tl } - \phantomsection - \par - \bool_if:NTF {\g_@@_title_not_in_toc_bool} { - \bookmark[page=\thepage,level=chapter]{\g_@@_short_title_tl} - }{ - \addcontentsline{toc}{chapter}{ - \tl_if_empty:NTF \g_@@_short_title_tl { - \g_@@_title_tl - }{ - \g_@@_short_title_tl - } - \bool_if:NF {\g_@@_subtitle_not_in_toc_bool} { + \bool_if:NTF {\g_@@_title_not_in_toc_bool} { + \bookmark[page=\thepage,level=chapter]{\g_@@_short_title_tl} + }{ + \addcontentsline{toc}{chapter}{ + \tl_if_empty:NTF \g_@@_short_title_tl { + \g_@@_title_tl + }{ + \g_@@_short_title_tl + } + \bool_if:NF {\g_@@_subtitle_not_in_toc_bool} { + \bool_if:nF { + \tl_if_empty_p:N \g_@@_short_subtitle_tl || + \g_@@_interview_rubric_bool || + \g_@@_rearviewmirror_rubric_bool + }{ + \c_space_tl\textendash{}\c_space_tl\g_@@_short_subtitle_tl + } + } \bool_if:nF { - \tl_if_empty_p:N \g_@@_short_subtitle_tl || + \tl_if_empty_p:N \l_@@_people_first_last_names_tl || \g_@@_interview_rubric_bool || \g_@@_rearviewmirror_rubric_bool }{ - \c_space_tl\textendash{}\c_space_tl\g_@@_short_subtitle_tl - } - } - \bool_if:nF { - \tl_if_empty_p:N \l_@@_people_first_last_names_tl || - \g_@@_interview_rubric_bool || - \g_@@_rearviewmirror_rubric_bool - }{ - \textsl{ - \cs_if_exist:cTF {texorpdfstring} - { - \texorpdfstring{ + \textsl{ + \cs_if_exist:cTF {texorpdfstring} + { + \texorpdfstring{ + \c_space_tl\textendash{}\c_space_tl\citeauthor{\g_@@_article_bib_key_tl} + }{} + }{ \c_space_tl\textendash{}\c_space_tl\citeauthor{\g_@@_article_bib_key_tl} - }{} - }{ - \c_space_tl\textendash{}\c_space_tl\citeauthor{\g_@@_article_bib_key_tl} + } } } } } + \bool_if:NF {\g_@@_invisible_titles_bool} { + \end{adjustbox} + } } - \end{adjustbox} -} \dim_gset:Nn \g_@@_abstract_box_width_dim {0.75\linewidth} % \bool_if:nT { \tl_if_empty_p:N \l_@@_people_first_last_names_tl } % { @@ -4593,17 +4606,26 @@ Running "make install" installs the files in the local TeX tree. } \tl_set:Nn \l_@@_authors_box_tl { - \begin{adjustbox}{minipage=0.3\linewidth,min~ width=0.3\linewidth,valign=t} + \bool_if:NF {\g_@@_invisible_titles_bool} { + \begin{adjustbox}{minipage=0.3\linewidth,min~ + width=0.3\linewidth,valign=t} + } \bool_if:nTF { \tl_if_empty_p:N \l_@@_people_first_last_names_tl || \g_@@_interview_rubric_bool } { \mbox{} } { \color{@@_people_color} - \_@@_itemized_citeauthor:n {\g_@@_article_bib_key_tl} + \bool_if:NTF {\g_@@_invisible_titles_bool} { + \nocite {\g__gzt_article_bib_key_tl} + }{ + \_@@_itemized_citeauthor:n {\g_@@_article_bib_key_tl} + } } - \end{adjustbox} - } + \bool_if:NF {\g_@@_invisible_titles_bool} { + \end{adjustbox} + } + } \bool_if:nTF { \int_compare_p:nNn { \g_@@_item_in_rubric_int } = { 1 } } diff --git a/macros/latex/contrib/realhats/README.md b/macros/latex/contrib/realhats/README.md index adab1056b6..b30d25a9cb 100644 --- a/macros/latex/contrib/realhats/README.md +++ b/macros/latex/contrib/realhats/README.md @@ -13,6 +13,11 @@ Regretfully brought into the world by [Matthew Scroggs](https://github.com/mscro ![Letters with hats on](readme_images/hats.png) ## Changelog +### Version 6.0 (2022-06-13) +* Added Scottish hat +* Added police hat +* Added birthday hat +* Added mortarboard ### Version 5.0 (2019-11-19) * Added Ash's hat ### Version 4.0 (2019-11-02) @@ -29,6 +34,5 @@ Regretfully brought into the world by [Matthew Scroggs](https://github.com/mscro * Added five hats * Added documentation - ## Licensing This work may be distributed and/or modified under the conditions of the [MIT license](LICENSE.txt). diff --git a/macros/latex/contrib/realhats/hats/realhats-birthday.pdf b/macros/latex/contrib/realhats/hats/realhats-birthday.pdf Binary files differnew file mode 100644 index 0000000000..4f38a8a4df --- /dev/null +++ b/macros/latex/contrib/realhats/hats/realhats-birthday.pdf diff --git a/macros/latex/contrib/realhats/hats/realhats-mortarboard.pdf b/macros/latex/contrib/realhats/hats/realhats-mortarboard.pdf Binary files differnew file mode 100644 index 0000000000..4a1a9ae5ef --- /dev/null +++ b/macros/latex/contrib/realhats/hats/realhats-mortarboard.pdf diff --git a/macros/latex/contrib/realhats/hats/realhats-policeman.pdf b/macros/latex/contrib/realhats/hats/realhats-policeman.pdf Binary files differnew file mode 100644 index 0000000000..f986ad5a3a --- /dev/null +++ b/macros/latex/contrib/realhats/hats/realhats-policeman.pdf diff --git a/macros/latex/contrib/realhats/hats/realhats-scottish.pdf b/macros/latex/contrib/realhats/hats/realhats-scottish.pdf Binary files differnew file mode 100644 index 0000000000..4e25c19630 --- /dev/null +++ b/macros/latex/contrib/realhats/hats/realhats-scottish.pdf diff --git a/macros/latex/contrib/realhats/readme_images/hats.png b/macros/latex/contrib/realhats/readme_images/hats.png Binary files differindex cbf6780524..e3eeb1422c 100644 --- a/macros/latex/contrib/realhats/readme_images/hats.png +++ b/macros/latex/contrib/realhats/readme_images/hats.png diff --git a/macros/latex/contrib/realhats/realhats.dtx b/macros/latex/contrib/realhats/realhats.dtx index 077c12cb30..4a2ef49058 100644 --- a/macros/latex/contrib/realhats/realhats.dtx +++ b/macros/latex/contrib/realhats/realhats.dtx @@ -27,37 +27,50 @@ %To make a vector with a hat, the input \lstinline@\hat{\mathbf{a}}@ produces: %\[\hat{\mathbf{a}}\] % -%The command \lstinline{\hat} will choose a hat randomly from ten hats: -%\begin{itemize} -%\item \(\hatn{a}{beret}\) - A beret -%\item \(\hatn{a}{santa}\) - A Santa hat -%\item \(\hatn{a}{sombrero}\) - A sombrero -%\item \(\hatn{a}{witch}\) - A witch's hat -%\item \(\hatn{a}{tophat}\) - A top hat -%\item \(\hatn{a}{ash}\) - Ash's hat -%\item \(\hatn{a}{fez}\) - A fez -%\item \(\hatn{a}{cowboy}\) - A cowboy hat -%\item \(\hatn{a}{crown}\) - A crown -%\item \(\hatn{a}{dunce}\) - A dunce's cap -%\end{itemize} +%The command \lstinline{\hat} will choose a hat randomly from thirteen hats: +%\begin{center} +%\begin{tabular}{cp{4cm}cl} +%\(\hatn{a}{beret}\) & beret & +%\(\hatn{a}{santa}\) & Santa hat \\ +%\(\hatn{a}{sombrero}\) & sombrero & +%\(\hatn{a}{witch}\)& witch's hat \\ +%\(\hatn{a}{tophat}\) & top hat & +%\(\hatn{a}{ash}\) & Ash's hat \\ +%\(\hatn{a}{fez}\) & fez & +%\(\hatn{a}{cowboy}\) & cowboy hat \\ +%\(\hatn{a}{crown}\) & crown & +%\(\hatn{a}{dunce}\) & dunce's cap \\ +%\(\hatn{a}{policeman}\) & policeman's hat \qquad& +%\(\hatn{a}{scottish}\) & Scottish hat \\ +%\(\hatn{a}{birthday}\) & birthday hat & +%\(\hatn{a}{mortarboard}\) & mortarboard +%\end{tabular} +%\end{center} % %Variables can be given a non-random hat, using the command \lstinline{\hat} with an optional parameter: -%\begin{itemize} -%\item \lstinline@\hat[beret]{a}@ produces \(\hat[beret]{a}\) -%\item \lstinline@\hat[santa]{a}@ produces \(\hat[santa]{a}\) -%\item \lstinline@\hat[sombrero]{a}@ produces \(\hat[sombrero]{a}\) -%\item \lstinline@\hat[witch]{a}@ produces \(\hat[witch]{a}\) -%\item \lstinline@\hat[tophat]{a}@ produces \(\hat[tophat]{a}\) -%\item \lstinline@\hat[ash]{a}@ produces \(\hat[ash]{a}\) -%\item \lstinline@\hat[fez]{a}@ produces \(\hat[fez]{a}\) -%\item \lstinline@\hat[cowboy]{a}@ produces \(\hat[cowboy]{a}\) -%\item \lstinline@\hat[crown]{a}@ produces \(\hat[crown]{a}\) -%\item \lstinline@\hat[dunce]{a}@ produces \(\hat[dunce]{a}\) -%\end{itemize} +%\begin{center} +%\begin{tabular}{lp{2cm}ll} +% \textbf{command} & \textbf{produces} & % \textbf{command} & \textbf{produces} \\ +% \lstinline@\hat[beret]{a}@ & \(\hat[beret]{a}\) & +% \lstinline@\hat[santa]{a}@ & \(\hat[santa]{a}\) \\ +% \lstinline@\hat[sombrero]{a}@ & \(\hat[sombrero]{a}\) & +% \lstinline@\hat[witch]{a}@ & \(\hat[witch]{a}\) \\ +% \lstinline@\hat[tophat]{a}@ & \(\hat[tophat]{a}\) & +% \lstinline@\hat[ash]{a}@ & \(\hat[ash]{a}\) \\ +% \lstinline@\hat[fez]{a}@ & \(\hat[fez]{a}\) & +% \lstinline@\hat[cowboy]{a}@ & \(\hat[cowboy]{a}\) \\ +% \lstinline@\hat[crown]{a}@ & \(\hat[crown]{a}\) & +% \lstinline@\hat[dunce]{a}@ & \(\hat[dunce]{a}\) \\ +% \lstinline@\hat[policeman]{a}@ & \(\hat[policeman]{a}\) & +% \lstinline@\hat[scottish]{a}@ & \(\hat[scottish]{a}\) \\ +% \lstinline@\hat[birthday]{a}@ & \(\hat[birthday]{a}\) & +% \lstinline@\hat[mortarboard]{a}@ & \(\hat[mortarboard]{a}\) +%\end{tabular} +%\end{center} % %You can also pass these same options when loading the package. -%For example, \verb@\usepackage[ash]{realhats}@ will cause the package to use make {\LaTeX} great again hats -%everywhere (unless an different hat is given to the \verb@\hat@ command). +%For example, \verb@\usepackage[cowboy]{realhats}@ will cause the package to use cowboy hats +%everywhere (unless a different hat is given to the \verb@\hat@ command). %\iffalse %<*documentation> \documentclass{article} @@ -67,6 +80,7 @@ \lstset{basicstyle=\ttfamily\footnotesize,commentstyle=\color{white},language=TeX} \title{realhats v\input{VERSION}} \author{Matthew W.~Scroggs \& Adam K.~Townsend} +\setlength\parindent{0pt} \begin{document} \maketitle \DocInput{realhats.dtx} @@ -77,12 +91,12 @@ %\iffalse %<*realhats> \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{realhats}[2019/04/14 realhats 3.0] +\ProvidesPackage{realhats}[2022/06/13 realhats 6.0] \RequirePackage{amsmath} \RequirePackage{graphicx} \RequirePackage{ifthen} -\RequirePackage[first=0, last=9, counter=hat]{lcg} +\RequirePackage[first=0, last=11, counter=hat]{lcg} \RequirePackage{calc} \RequirePackage{stackengine} @@ -102,6 +116,10 @@ \DeclareOption{cowboy}{\global\def\hatused{cowboy}} \DeclareOption{crown}{\global\def\hatused{crown}} \DeclareOption{dunce}{\global\def\hatused{dunce}} +\DeclareOption{policeman}{\global\def\hatused{policeman}} +\DeclareOption{scottish}{\global\def\hatused{scottish}} +\DeclareOption{birthday}{\global\def\hatused{birthday}} +\DeclareOption{mortarboard}{\global\def\hatused{mortarboard}} \ProcessOptions\relax \newcommand{\gethat}{% @@ -115,6 +133,10 @@ \or cowboy% \or crown% \or dunce% + \or policeman% + \or scottish% + \or birthday% + \or mortarboard% \fi } @@ -134,6 +156,10 @@ \ifthenelse{\equal{#1}{cowboy}}{\hatn{#2}{cowboy}}{}% \ifthenelse{\equal{#1}{crown}}{\hatn{#2}{crown}}{}% \ifthenelse{\equal{#1}{dunce}}{\hatn{#2}{dunce}}{}% + \ifthenelse{\equal{#1}{policeman}}{\hatn{#2}{policeman}}{}% + \ifthenelse{\equal{#1}{scottish}}{\hatn{#2}{scottish}}{}% + \ifthenelse{\equal{#1}{birthday}}{\hatn{#2}{birthday}}{}% + \ifthenelse{\equal{#1}{mortarboard}}{\hatn{#2}{mortarboard}}{}% }% } @@ -152,6 +178,10 @@ \ifthenelse{\equal{#2}{cowboy}}{\renewcommand\myhat{hats/realhats-cowboy}\setlength{\vshif}{-0.3ex} \setlength{\hshif}{0.2ex}}{}% \ifthenelse{\equal{#2}{crown}}{\renewcommand\myhat{hats/realhats-crown}\setlength{\vshif}{-0.3ex} \setlength{\hshif}{0.2ex}}{}% \ifthenelse{\equal{#2}{dunce}}{\renewcommand\myhat{hats/realhats-dunce}\setlength{\vshif}{-0.3ex} \setlength{\hatwidth}{1.4ex}}{}% +\ifthenelse{\equal{#2}{policeman}}{\renewcommand\myhat{hats/realhats-policeman}\setlength{\vshif}{-0.4ex} \setlength{\hatwidth}{1.8ex} \addtolength{\hshif}{-1pt}}{}% +\ifthenelse{\equal{#2}{scottish}}{\renewcommand\myhat{hats/realhats-scottish}\setlength{\vshif}{-0.6ex} \setlength{\hshif}{0.5ex} }{}% +\ifthenelse{\equal{#2}{birthday}}{\renewcommand\myhat{hats/realhats-birthday}\setlength{\vshif}{-0.2ex} \setlength{\hshif}{-0.1ex} }{}% +\ifthenelse{\equal{#2}{mortarboard}}{\renewcommand\myhat{hats/realhats-mortarboard}\setlength{\vshif}{-0.15ex} \setlength{\hshif}{0ex} }{}% \addtolength{\hshif}{#3}% \addtolength{\vshif}{#4}% \stackMath % diff --git a/macros/latex/contrib/realhats/realhats.pdf b/macros/latex/contrib/realhats/realhats.pdf Binary files differindex 0afc334ec6..086bce845f 100644 --- a/macros/latex/contrib/realhats/realhats.pdf +++ b/macros/latex/contrib/realhats/realhats.pdf diff --git a/macros/latex/contrib/textcase/README b/macros/latex/contrib/textcase/README index 8ac3dc4e3b..85376320da 100644 --- a/macros/latex/contrib/textcase/README +++ b/macros/latex/contrib/textcase/README @@ -6,3 +6,7 @@ The textcase package Improvements from Donald Arseneau mean that \label, \ref and \cite also work within the argument of these commands, without the symbolic `key name' being incorrectly uppercased. + + In current LaTeX this package is obsolete. You can use the standard + \MakeUppercase and \MakeLowercase, but it defines legacy names + \MakeTextUppercase and \MakeTextLowercase. diff --git a/macros/latex/contrib/textcase/textcase.dtx b/macros/latex/contrib/textcase/textcase.dtx index 35d8c1f46a..3fd04e0af9 100644 --- a/macros/latex/contrib/textcase/textcase.dtx +++ b/macros/latex/contrib/textcase/textcase.dtx @@ -1,6 +1,6 @@ % \iffalse %% Source File: textcase.dtx -%% Copyright 1997 1998 2019 David Carlisle +%% Copyright 1997 1998 2019 2022 David Carlisle %% %% This file may be distributed under the terms of the LPPL. %% See 00readme.txt for details. @@ -13,7 +13,7 @@ %<driver> \ProvidesFile{textcase.drv} % \fi % \ProvidesFile{textcase.dtx} - [2019/09/14 v1.00 Text only upper/lower case changing (DPC)] + [2022/06/12 v1.02 Text only upper/lower case changing (DPC)] % % \iffalse %<*driver> @@ -58,6 +58,18 @@ % \maketitle % % \section{Introduction}\label{intro} +% +% \subsection*{This package is obsolete with the June 2022 \LaTeX\ release.} +% \begin{sloppypar} +% With new formats |\MakeUppercase| supports the extensions provided +% here, with improved support for UTF-8 input. So now the package just defines +% |\MakeTextUppercase| and |\MakeTextLowercase| as aliases for the +% standard |\MakeUppercase| and |\MakeLowercase|. +% \end{sloppypar} +% +% +% \subsection*{Old Introduction} +% % |\MakeTextUppercase| and |\MakeTextLowercase| are versions of the % standard |\MakeUppercase| and |\MakeLowercase| that do not change % the case of any math sections in their arguments. @@ -216,6 +228,18 @@ %<*package> % \end{macrocode} % +% In current \LaTeX\ just define legacy names. +% \begin{macrocode} +\ifx\@expl@text@uppercase@@n\@undefined\else + \DeclareOption{overload}{} + \ProcessOptions + \PackageInfo{textcase}{Defining Legacy names} + \let\MakeTextUppercase\MakeUppercase + \let\MakeTextLowercase\MakeLowercase + \expandafter\endinput +\fi +% \end{macrocode} +% % \begin{macro}{\@uclcnotmath} % This is the main macro of this package. It is basically % a copy of |\MakeTextUppercase| and |\MakeTextLowercase| @@ -246,10 +270,15 @@ \def\({$}\let\)\(% % \end{macrocode} % -% \changes{v1.0}{2019/09/14} +% \changes{v1.00}{2019/09/14} % {UTF-8 support for 2019 LaTeX format} % Allow UTF-8 characters to expand in the |\protected@edef| so that % they become for example |\IeC{\'{e}}| and uppercase correctly. +% \changes{v1.01}{2022/02/14} +% {UTF-8 support for 2022 LaTeX format (unreleased)} +% \changes{v1.02}{2022/06/12} +% {Obsolete this package in newer formats} +% Allow UTF-8 characters are e-\TeX\ |\protected| in newer \LaTeX\ formats. % % \begin{macrocode} \let\UTF@two@octets@noexpand\@empty diff --git a/macros/latex/contrib/textcase/textcase.pdf b/macros/latex/contrib/textcase/textcase.pdf Binary files differindex 9bb2ac85b8..0d698752a3 100644 --- a/macros/latex/contrib/textcase/textcase.pdf +++ b/macros/latex/contrib/textcase/textcase.pdf diff --git a/macros/latex/contrib/yathesis/doc/yathesis-fr.pdf b/macros/latex/contrib/yathesis/doc/yathesis-fr.pdf Binary files differindex 3a215c07a1..1adc720f50 100644 --- a/macros/latex/contrib/yathesis/doc/yathesis-fr.pdf +++ b/macros/latex/contrib/yathesis/doc/yathesis-fr.pdf diff --git a/macros/latex/contrib/yathesis/exemples/specimen/these.pdf b/macros/latex/contrib/yathesis/exemples/specimen/these.pdf Binary files differindex 170f7af558..7aa154a8a7 100644 --- a/macros/latex/contrib/yathesis/exemples/specimen/these.pdf +++ b/macros/latex/contrib/yathesis/exemples/specimen/these.pdf diff --git a/macros/latex/contrib/yathesis/source/yathesis.dtx b/macros/latex/contrib/yathesis/source/yathesis.dtx index c5aa7706a5..ea2c9e4ea6 100644 --- a/macros/latex/contrib/yathesis/source/yathesis.dtx +++ b/macros/latex/contrib/yathesis/source/yathesis.dtx @@ -62,10 +62,144 @@ Typesetting the documentation of the class requires: latexmk -norc -r ./latexmkrc yathesis-fr %</readme> +%<*ctanomat> +% This is a description file for ctan-o-mat. +% It manages uploads of a package to +% CTAN -- the Comprehensive TeX Archive Network. +% +% The syntax is roughly oriented towards (La)TeX. +% Two form of the macros are used. The simple macros take one argument +% in braces. Here the argument may not contain embedded macros. +% +% The second form uses an environment enclosed in \begin{}/\end{}. +% In the long text fields logo macros can be used. +% +% You should enter your values between the begin and the end of the +% named type. +% ------------------------------------------------------------------------- +% This field contains the CTAN id of the package. +% The value is optional. +% The value is restricted to 32 characters. +\pkg{yathesis} +% ------------------------------------------------------------------------- +% This field contains the version of the package. +% The value is optional. +% The value is restricted to 32 characters. +\version{1.0.11 2021-12-01} +% ------------------------------------------------------------------------- +% This field contains the name of the author(s). +% The value is optional. +% The value is restricted to 128 characters. +\author{Denis Bitouzé} +% ------------------------------------------------------------------------- +% This field contains the email address of the uploader. +% The value is an email address. +% The value is restricted to 255 characters. +\email{denis.bitouze@univ-littoral.fr} +% ------------------------------------------------------------------------- +% This field contains the name of the uploader. +% The value is restricted to 255 characters. +\uploader{Denis Bitouzé} +% ------------------------------------------------------------------------- +% This field contains the directory on CTAN. +% The value is optional. +% The value is restricted to 255 characters. +\ctanPath{/macros/latex/contrib/yathesis} +% ------------------------------------------------------------------------- +% This field contains the license. +% The value is optional. +% The value is restricted to 2048 characters. +% Multiple values are allowed. +\license{lppl1.3c} +% ------------------------------------------------------------------------- +% This field contains the URL of the home page. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\home{} +% ------------------------------------------------------------------------- +% This field contains the URL of the bug tracker. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\bugtracker{https://github.com/dbitouze/yathesis/issues/} +% ------------------------------------------------------------------------- +% This field contains the support channel. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\support{} +% ------------------------------------------------------------------------- +% This field contains the version management. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\repository{https://github.com/dbitouze/yathesis/} +% ------------------------------------------------------------------------- +% This field contains the developer's channel. +% The value is optional. +% The value is a URL. +% The value is restricted to 255 characters. +% Multiple values are allowed. +\development{} +% ------------------------------------------------------------------------- +% This field contains the update indicator; true for update. +% The value is optional. +% The value is restricted to 8 characters. +\update{true} +% ------------------------------------------------------------------------- +% This field contains the topics id. +% The value is optional. +% The value is restricted to 1024 characters. +% Multiple values are allowed. +\topic{} +% ------------------------------------------------------------------------- +% This field contains the text for the mail announcement. +% The value is optional. +% The value is restricted to 8192 characters. +\begin{announcement} +\end{announcement} +% ------------------------------------------------------------------------- +% This field contains the one-liner for the package. +% The value is optional. +% The value is restricted to 128 characters. +\summary{A LaTeX class for writing a thesis following French rules} +% ------------------------------------------------------------------------- +% This field contains the descriptive abstract for the package. +% The value is optional. +% The value is restricted to 4096 characters. +\begin{description} +The purpose of yathesis is to facilitate the typesetting of theses prepared in France, whatever the disciplines and institutes. It implements most notably recommendations from the Ministry of Higher Education and Research, and this transparently to the user. It has also been designed to (optionally) take advantage of powerful tools available in LaTeX, including packages: + +- [`biblatex`](https://www.ctan.org/pkg/biblatex) for the bibliography; +- [`glossaries`](https://www.ctan.org/pkg/glossaries) for the glossary, list of acronyms and symbols list. + +The `yathesis` class, based on the book class, aims to be both simple to use and, to some extent, (easily) customizable. + +`yathesis` comes with templates and samples in the `doc/latex/yathesis/french/exemples/` directory in the distribution. They can also be tested on Overleaf ([template](www.overleaf.com/latex/templates/template-of-a-thesis-written-with-yathesis-class/nhtmtthnqwtd) and [specimen](www.overleaf.com/latex/examples/sample-of-a-thesis-written-with-yathesis-class/nbcfvfqgnjfq)). + +Note: The “ya” in the package name stands for “yet another”. +\end{description} +% ------------------------------------------------------------------------- +% This field contains the note to the CTAN upload managers. +% The value is optional. +% The value is restricted to 2048 characters. +\begin{note} +\end{note} +% ------------------------------------------------------------------------- +% This field contains the archive file. +% The value is the file name of the archive to be uploaded. +% It may have a relative or absolute directory. +\file{../dtx-forge/yathesis.zip} +%</ctanomat> %<*changelog> # [Unreleased] -# [1.0.10] - 2021-12-01 +# [1.0.10] - 2022-06-13 ## Added - (Far to perfect) Documentation of the code available as a PDF file. @@ -75,6 +209,7 @@ Typesetting the documentation of the class requires: ## Fixed - Bug gh #91 (https://git.io/JMrK8). +- Bug gh #92 (https://github.com/dbitouze/yathesis/issues/92). # [1.0.9] - 2021-10-13 @@ -346,7 +481,7 @@ Typesetting the documentation of the class requires: %</internal> %<*class|install> \def\yathesisversion{1.0.10} -\def\yathesisdate{2021-12-01} +\def\yathesisdate{2022-06-13} %</class|install> %<*install> \input l3docstrip.tex @@ -407,6 +542,11 @@ This work consists of the file yathesis.dtx \def\YAD@treesample{\YAD@examples/\YAD@sample/en-arborescence} %</install> %<*install> +\usedir{.} +\generate{ + \nopreamble\nopostamble + \file{\YAD@classname.pkg}{\from{\jobname.dtx}{ctanomat}} +}% \usedir{doc/latex/\YAD@classname} \generate{ \nopreamble\nopostamble @@ -551,9 +691,6 @@ This work consists of the file yathesis.dtx % \iffalse %<*driver> \ProvidesFile{yathesis.dtx} -% \RequirePackage{scrlfile} -% \ReplaceClass{article}{report} -% \BeforePackage{doc}{\let\oldmaketitle\maketitle} \documentclass[full,english,french,draft]{l3doc} \usepackage[a4paper,inner=5cm,landscape]{geometry} \usepackage[lining]{libertine} @@ -659,7 +796,9 @@ This work consists of the file yathesis.dtx % Pour pouvoir disposer d'autant de \enquote{flots} d'écriture dans % des fichiers annexes que nécessaire. % \begin{macrocode} -\RequirePackage{morewrites}% +\ExplSyntaxOn +\sys_if_engine_pdftex:T {\RequirePackage{morewrites}} +\ExplSyntaxOff % \end{macrocode} % Pour pouvoir définir des macros dont les arguments puissent être % spécifiés sous la forme ×clé=×\meta{valeur}, tant en argument de @@ -1342,10 +1481,6 @@ This work consists of the file yathesis.dtx % \begin{macrocode} \RequirePackage{xstring}[2013/10/13]% % \end{macrocode} -% Pour facilement changer la casse -% \begin{macrocode} -\RequirePackage{textcase}[2004/10/07]% -% \end{macrocode} % Pour tester le moteur employé % \begin{macrocode} \RequirePackage{iftex}[2013/04/04]% @@ -4482,13 +4617,13 @@ This work consists of the file yathesis.dtx \YAD@ifemptyorundef{\YAD@mainkeywords}{% \YAD@generic@argument@translate{keywords}% }{% - \MakeTextLowercase{\YAD@mainkeywords}% + \MakeLowercase{\YAD@mainkeywords}% }% }{% \YAD@ifemptyorundef{\YAD@secondarykeywords}{% \YAD@generic@argument@translate{keywords}% }{% - \MakeTextLowercase{\YAD@secondarykeywords}% + \MakeLowercase{\YAD@secondarykeywords}% }% }% }% diff --git a/macros/luatex/latex/ligtype/README.md b/macros/luatex/latex/ligtype/README.md index e7f080f87b..dd60e93809 100644 --- a/macros/luatex/latex/ligtype/README.md +++ b/macros/luatex/latex/ligtype/README.md @@ -1,31 +1,31 @@ -The package suppresses inappropriate ligatures following
-specified rules. Both font and user kerning are applied
-correctly, and f-glyphs are automatically replaced with
-their short-arm variant (if available). Also there is an
-emphasis on speed.
-By default the package applies German language ligature
-suppression rules. With the help of options and macros it
-can be used for other languages as well.
-The package requires LuaLaTeX.
-
-Copyright (c) 2022 Thomas Kelkel kelkel@emaileon.de
-
-The files of this package may be distributed and/or
-modified under the conditions of the LaTeX Project
-Public License, either version 1.3c of this license
-or (at your option) any later version. The latest
-version of this license is in
-
- http://www.latex-project.org/lppl.txt
-
-and version 1.3c or later is part of all distributions
-of LaTeX version 2009/09/24 or later.
-
-The ligtype package makes use of the German language
-ligature suppression rules of the selnolig package by
-Mico Loretan. The selnolig package can be downloaded at
-
- https://www.ctan.org/pkg/selnolig
-
-and may be distributed and/or modified under the
+The package suppresses inappropriate ligatures following +specified rules. Both font and user kerning are applied +correctly, and f-glyphs are automatically replaced with +their short-arm variant (if available). Also there is an +emphasis on speed. +By default the package applies German language ligature +suppression rules. With the help of options and macros it +can be used for other languages as well. +The package requires LuaLaTeX. + +Copyright (c) 2022 Thomas Kelkel kelkel@emaileon.de + +The files of this package may be distributed and/or +modified under the conditions of the LaTeX Project +Public License, either version 1.3c of this license +or (at your option) any later version. The latest +version of this license is in + + http://www.latex-project.org/lppl.txt + +and version 1.3c or later is part of all distributions +of LaTeX version 2009/09/24 or later. + +The ligtype package makes use of the German language +ligature suppression rules of the selnolig package by +Mico Loretan. The selnolig package can be downloaded at + + https://www.ctan.org/pkg/selnolig + +and may be distributed and/or modified under the conditions of the LaTeX Project Public License.
\ No newline at end of file diff --git a/macros/luatex/latex/ligtype/ligtype.lua b/macros/luatex/latex/ligtype/ligtype.lua index f4575b1d70..328125f3a4 100644 --- a/macros/luatex/latex/ligtype/ligtype.lua +++ b/macros/luatex/latex/ligtype/ligtype.lua @@ -1,1643 +1,1643 @@ --- Copyright (c) 2022 Thomas Kelkel kelkel@emaileon.de
-
--- This file may be distributed and/or modified under the
--- conditions of the LaTeX Project Public License, either
--- version 1.3c of this license or (at your option) any later
--- version. The latest version of this license is in
-
--- http://www.latex-project.org/lppl.txt
-
--- and version 1.3c or later is part of all distributions of
--- LaTeX version 2009/09/24 or later.
-
--- Version: 0.1a
-
--- The ligtype package makes use of the German language
--- ligature suppression rules of the selnolig package by
--- Mico Loretan. The selnolig package can be downloaded at
-
--- https://www.ctan.org/pkg/selnolig
-
--- and may be distributed and/or modified under the
--- conditions of the LaTeX Project Public License.
-
-local ID = node.id
-local GLYPH = ID ( "glyph" )
-local DISC = ID ( "disc" )
-local GLUE = ID ( "glue" )
-local KERN = ID ( "kern" )
-local WI = ID ( "whatsit" )
-local BOUND = ID ( "boundary" )
-local HLIST = ID ( "hlist" )
-local VLIST = ID ( "vlist" )
-local USERKERN = table.swapped ( node.subtypes ("kern") )["userkern"]
-local NEW = node.new
-local REM = node.remove
-local PREV = node.prev
-local NEXT = node.next
-local TAIL = node.tail
-local HAS_GLYPH = node.has_glyph
-local INS_B = node.insert_before
-local INS_A = node.insert_after
-local T = node.traverse
-local T_GLYPH = node.traverse_glyph
-local WIS = node.whatsits()
-local userdefined
-local pdfliteral
-local pairs = pairs
-local next = next
-local type = type
-local U = unicode.utf8
-local CHAR = U.char
-local GSUB = U.gsub
-local SUB = U.sub
-local LEN = U.len
-local BYTE = U.byte
-local FIND = U.find
-local T_INS = table.insert
-local T_CC = table.concat
-local FLOOR = math.floor
-local GET_FONT = font.getfont
-local ATC = luatexbase.add_to_callback
-local RFC = luatexbase.remove_from_callback
-
-local make_marks = false
-local no_short_f = false
-local all_short_f = false
-local no_default = false
-local lig_table = {}
-
-for key, value in pairs ( WIS ) do
- if value == "user_defined" then
- userdefined = key
- elseif value == "pdf_literal" then
- pdfliteral = key
- end
-end
-
-function ligtype_no_short_f ()
- no_short_f = true
-end
-
-function ligtype_all_short_f ()
- all_short_f = true
-end
-
-function ligtype_no_default ()
- no_default = true
-end
-
-local function to_ascii ( text )
- return GSUB ( text, "[äöüß]", "a" )
-end
-
-function ligtype_parse_macro ( text, marker, nolig )
- local text_ascii = to_ascii ( text )
- local marker_ascii = to_ascii ( marker )
- local pos = { nil, nil, nil, nil, nil }
- pos[1] = nolig
- local m_pos = FIND ( marker_ascii, "|" )
- pos[2] = SUB ( marker, m_pos - 1, m_pos - 1 ) .. SUB ( marker, m_pos + 1, m_pos + 1 )
- pos[3] = m_pos - 1
- pos[4] = m_pos
- if FIND ( text_ascii, "[%[]" ) then
- local plus_start = FIND ( text_ascii, "[%[]" ) + 1
- local plus_end = FIND ( text_ascii, "[%]]" ) - 1
- pos[6] = SUB ( text, plus_start, plus_end )
- text = SUB ( text, 1, plus_start - 2 ) .. "+"
- end
- pos[5] = text
- lig_table[#lig_table + 1] = pos
-end
-
-local function round ( num, dec )
- return FLOOR ( num * 10^dec + 0.5 ) / 10^dec
-end
-
-local function calc_value ( value )
- value = round ( value / 65536, 3 )
- return value
-end
-
-local function get_char_bytes ( text, text_len, reverse )
- local a = { nil, nil, nil, nil, nil }
- for i = 1, text_len do
- if reverse then
- a[text_len - i + 1] = BYTE ( text, i )
- else
- a[i] = BYTE ( text, i )
- end
- end
- return a
-end
-
-local function find_glyph ( n, d, replace )
- if d ( n ) then
- n = d ( n )
- while n.id ~= GLYPH do
- if not d ( n ) or n.id == GLUE or n.id == BOUND or ( n.id == KERN and n.subtype == USERKERN ) then replace = false break end
- n = d ( n )
- end
- else
- replace = false
- end
- return n, replace
-end
-
-local function get_ligs ( head )
- local lig_check = { ["ff"] = true, ["fi"] = true, ["fl"] = true, ["ffi"] = true, ["ffl"] = true, ["ft"] = true, ["fft"] = true, ["fb"] = true, ["ffb"] = true, ["fh"] = true, ["ffh"] = true, ["fk"] = true, ["ffk"] = true, ["fj"] = true, ["ffj"] = true, ["fff"] = true }
- local ligs = { ["ff"] = { nil, nil, nil, nil, nil }, ["fi"] = { nil, nil, nil, nil, nil }, ["fl"] = { nil, nil, nil, nil, nil }, ["ffi"] = { nil, nil, nil, nil, nil }, ["ffl"] = { nil, nil, nil, nil, nil }, ["ft"] = { nil, nil, nil, nil, nil }, ["fk"] = { nil, nil, nil, nil, nil }, ["fj"] = { nil, nil, nil, nil, nil }, ["fft"] = { nil, nil, nil, nil, nil }, ["fb"] = { nil, nil, nil, nil, nil }, ["ffb"] = { nil, nil, nil, nil, nil }, ["fh"] = { nil, nil, nil, nil, nil }, ["ffh"] = { nil, nil, nil, nil, nil }, ["ffk"] = { nil, nil, nil, nil, nil }, ["ffj"] = { nil, nil, nil, nil, nil }, ["fff"] = { nil, nil, nil, nil, nil } }
- for _, value in pairs ( lig_table ) do
- lig_check[value[2]] = true
- ligs[value[2]] = { nil, nil, nil, nil, nil }
- end
- local char_table = {}
- for key, _ in pairs ( lig_check ) do
- char_table[BYTE ( SUB ( key, 1, 1 ) )] = true
- end
- for n in T_GLYPH ( head ) do
- if n.char and char_table[n.char] then
- if NEXT ( n ) then
- local next_chars = { false, false }
- local second_glyph
- local success
- local next_glyph = n
- for i = 1, 2 do
- next_glyph, success = find_glyph ( next_glyph, NEXT, true )
- if success and next_glyph.char then
- next_chars[i] = next_glyph.char
- if i == 1 then
- second_glyph = next_glyph
- end
- end
- end
- if next_chars[1] and next_chars[2] and lig_check[CHAR ( n.char ) .. CHAR ( next_chars[1] ) .. CHAR ( next_chars[2] )] then
- local threestring = "ff" .. CHAR ( next_chars[2] )
- T_INS ( ligs[threestring], next_glyph )
- end
- if next_chars[1] and lig_check[CHAR ( n.char ) .. CHAR ( next_chars[1] )] then
- local ligstring = CHAR ( n.char ) .. CHAR ( next_chars[1] )
- T_INS ( ligs[ligstring], second_glyph )
- end
- end
- end
- end
- return ligs
-end
-
-local function check_text ( replace, n, d, string_len, string_chars, plus_boolean )
- if d ( n ) then
- local MOVE = d ( n )
- for i = 1, string_len do
- while MOVE.id ~= GLYPH do
- if not d ( MOVE ) or MOVE.id == GLUE or MOVE.id == BOUND or ( MOVE.id == KERN and MOVE.subtype == USERKERN ) then replace = false break end
- MOVE = d ( MOVE )
- end
- if ( MOVE.char ~= string_chars[i] and string_chars[i] ~= 43 ) or ( string_chars[i] == 43 and not plus_boolean[MOVE.char] ) then replace = false break end
- if d ( MOVE ) then
- MOVE = d ( MOVE )
- elseif i ~= string_len then replace = false break end
- end
- else
- replace = false
- end
- return replace
-end
-
-local function no_lig ( nolig, lig, lig_beg, lig_end, text, head, ligs, plus )
- local chars = { lig = { nil, nil, nil }, before = { nil, nil, nil, nil, nil }, after = { nil, nil, nil, nil, nil }, plus = { nil, nil, nil, nil, nil, nil, nil, nil, nil } }
- local before_lig
- local after_lig
- local count = 0
- local text_len = LEN ( text )
- local before_lig_len = lig_beg - 1
- local after_lig_len = text_len - lig_end
- chars.lig = get_char_bytes ( lig, 2, false )
- if lig_beg > 1 then
- before_lig = SUB ( text, 1, before_lig_len )
- chars.before = get_char_bytes ( before_lig, before_lig_len, true )
- end
- if lig_end < text_len then
- after_lig = SUB ( text, (lig_end + 1), text_len )
- chars.after = get_char_bytes ( after_lig, after_lig_len, false )
- end
- local plus_boolean = { nil, nil, nil, nil, nil, nil, nil, nil, nil }
- if plus then
- chars.plus = get_char_bytes ( plus, LEN ( plus ), false )
- for _, value in pairs ( chars.plus ) do
- if not ( value == nil ) then
- plus_boolean[value] = true
- end
- end
- end
- for _, value in pairs ( ligs ) do
- count = count + 1
- local n
- if value.char ~= chars.lig[2] then
- local BEFORE = value
- BEFORE = find_glyph ( BEFORE, PREV, true )
- n = BEFORE
- else
- n = value
- end
- if n.char == chars.lig[2] then
- local replace = true
- local prev_glyph = n
- prev_glyph, replace = find_glyph ( prev_glyph, PREV, replace )
- if NEXT ( prev_glyph ) and NEXT ( prev_glyph ).user_id and NEXT ( prev_glyph ).user_id == 289473 and nolig then
- replace = false
- end
- if prev_glyph.char ~= chars.lig[1] then
- replace = false
- end
- if replace then
- if lig_beg > 1 then
- replace = check_text ( replace, prev_glyph, PREV, before_lig_len, chars.before, plus_boolean )
- end
- if lig_end < text_len then
- replace = check_text ( replace, n, NEXT, after_lig_len, chars.after, plus_boolean )
- end
- if replace then
- if nolig then
- INS_A ( head, prev_glyph, NEW ( WI, userdefined ) )
- NEXT ( prev_glyph ).type = 100
- NEXT ( prev_glyph ).user_id = 289473
- else
- if NEXT ( prev_glyph ) and NEXT ( prev_glyph ).user_id == 289473 then
- REM ( head, NEXT ( prev_glyph ) )
- end
- end
- end
- end
- end
- end
-end
-
-local function find_disc ( n, d )
- local disc_node = nil
- while n.id ~= GLYPH do
- if d ( n ) then
- n = d ( n )
- else break end
- if n.id == DISC then
- disc_node = n
- break end
- end
- return disc_node
-end
-
-local function find_prev_next_glyph ( n, d )
- local some_node = d ( n )
- local lig_post = nil
- while some_node.id ~= GLYPH do
- if some_node.id == DISC and some_node.replace and HAS_GLYPH ( some_node.replace ) then
- for glyph_node in T_GLYPH ( some_node.replace ) do
- some_node = glyph_node
- end
- if d == PREV then
- for glyph_node in T_GLYPH ( some_node.post ) do
- lig_post = glyph_node
- end
- end
- break end
- some_node = d ( some_node )
- end
- return some_node, lig_post
-end
-
-local function make_kern ( head )
- local glyph_count = 0
- for n in T_GLYPH ( head ) do
- glyph_count = glyph_count + 1
- if glyph_count > 4 then break end
- end
- if glyph_count > 4 then
- for n in T ( head ) do
- if n.id == WI and n.user_id == 289473 then
- local font_kern = true
- local hyphen_font_kern = true
- local post_lig_font_kern = true
- local prev_glyph, lig_post = find_prev_next_glyph ( n, PREV )
- local next_glyph = find_prev_next_glyph ( n, NEXT )
- local kern_value = 0
- local kern_add = 0
- local hyphen_kern = 0
- local post_lig_kern = 0
- if prev_glyph.font then
- local tfmdata = GET_FONT ( prev_glyph.font )
- if tfmdata.resources then
- local resources = tfmdata.resources
- if not no_short_f and resources.unicodes then
- local uni = resources.unicodes
- local ff = nil
- local ff_short = nil
- local f_short = nil
- for key, value in pairs ( uni ) do
- if key == "f_f" or key == "uniFB00" then
- ff = value
- elseif key == "f_f.short" or key == "f_f.alt" then
- ff_short = value
- elseif key == "f.short" or key == "f.alt" then
- f_short = value
- end
- end
- if ( prev_glyph.char == 102 ) and f_short then
- prev_glyph.char = f_short
- elseif ( prev_glyph.char == ff ) and ff_short then
- prev_glyph.char = ff_short
- end
- end
- if resources.sequences then
- local seq = resources.sequences
- for _, t in pairs ( seq ) do
- if t.steps then
- local steps = t.steps
- for _, k in pairs ( steps ) do
- if k.coverage and ( k.coverage[prev_glyph.char] or ( lig_post and k.coverage[lig_post.char] ) ) then
- if k.coverage[prev_glyph.char] then
- local glyph_table = k.coverage[prev_glyph.char]
- if type ( glyph_table ) == "table" then
- for key, value in pairs ( glyph_table ) do
- if ( key == next_glyph.char or key == 45 ) and type ( value ) == "number" and ( k.format == "move" or tfmdata.specification.features.raw[t.name] ) then
- if font_kern and key == next_glyph.char then
- kern_value = kern_value + ( value / tfmdata.units_per_em * tfmdata.size )
- if tfmdata.specification.features.raw[t.name] then
- font_kern = false
- end
- elseif hyphen_font_kern and key == 45 then
- hyphen_kern = hyphen_kern + ( value / tfmdata.units_per_em * tfmdata.size )
- if tfmdata.specification.features.raw[t.name] then
- hyphen_font_kern = false
- end
- end
- end
- end
- end
- end
- if lig_post and k.coverage[lig_post.char] then
- local glyph_table = k.coverage[lig_post.char]
- if type ( glyph_table ) == "table" then
- for key, value in pairs ( glyph_table ) do
- if ( key == next_glyph.char ) and type ( value ) == "number" and ( k.format == "move" or tfmdata.specification.features.raw[t.name] ) then
- if post_lig_font_kern and key == next_glyph.char then
- post_lig_kern = post_lig_kern + ( value / tfmdata.units_per_em * tfmdata.size )
- if tfmdata.specification.features.raw[t.name] then
- post_lig_font_kern = false
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- local disc_prev = find_disc ( n, PREV )
- local disc_next = find_disc ( n, NEXT )
- if disc_prev then
- local REPLACE = disc_prev.replace
- REPLACE = INS_A ( REPLACE, TAIL ( REPLACE ), NEW ( KERN ) )
- TAIL ( REPLACE ).kern = kern_value
- disc_prev.replace = REPLACE
- local POST = disc_prev.post
- POST = INS_A ( POST, TAIL ( POST ), NEW ( KERN ) )
- TAIL ( POST ).kern = post_lig_kern
- disc_prev.post = POST
- elseif disc_next then
- local REPLACE = disc_next.replace
- REPLACE = INS_B ( REPLACE, REPLACE, NEW ( KERN ) )
- REPLACE.kern = kern_value
- disc_next.replace = REPLACE
- local PRE = disc_next.pre
- PRE = INS_B ( PRE, PRE, NEW ( KERN ) )
- PRE.kern = hyphen_kern
- disc_next.pre = PRE
- else
- INS_A ( head, n, NEW ( KERN ) )
- NEXT ( n ).kern = kern_value
- end
- end
- end
- end
- return head
-end
-
-local function place_marks ( head )
- for n in T ( head ) do
- if n.id == HLIST or n.id == VLIST then
- n.head = place_marks ( n.head )
- elseif n.id == WI and n.user_id == 289473 then
- local kern_add = 0
- if NEXT ( n ) and NEXT ( n ).id == DISC and NEXT ( n ).replace and NEXT ( n ).replace.id == KERN then
- kern_add = kern_add + calc_value ( NEXT ( n ).replace.kern ) * 0.5
- elseif NEXT ( n ).id == KERN and NEXT ( n ).kern then
- kern_add = kern_add + calc_value ( NEXT ( n ).kern ) * 0.5
- end
- if PREV ( n ) and PREV ( n ).id == DISC and PREV ( n ).replace and TAIL ( PREV ( n ).replace ).id == KERN then
- kern_add = kern_add - calc_value ( TAIL ( PREV ( n ).replace ).kern ) * 0.5
- elseif PREV ( n ).id == KERN and PREV ( n ).kern then
- kern_add = kern_add - calc_value ( PREV ( n ).kern ) * 0.5
- end
- local size_factor = 1
- if font.current() then
- size_factor = calc_value ( GET_FONT ( font.current() ).size / 10 )
- end
- head = INS_B ( head, n, NEW ( WI, pdfliteral ) )
- PREV ( n ).mode = 0
- PREV ( n ).data = "q .2 .8 1 rg " .. kern_add .. " 0 m " .. ( kern_add + 2 * size_factor ) .. " " .. -3 * size_factor .. " l " .. ( kern_add - 2 * size_factor ) .. " " .. -3 * size_factor .. " l " .. kern_add .. " 0 l f Q"
- n.user_id = 848485
- end
- end
- return head
-end
-
-local function lig_parse ( head )
- if all_short_f then
- for n in T_GLYPH ( head ) do
- if n.char == 102 and n.font then
- local tfmdata = GET_FONT ( n.font )
- if tfmdata.resources then
- local resources = tfmdata.resources
- if resources.unicodes then
- local uni = resources.unicodes
- for key, value in pairs ( uni ) do
- if ( key == "f.short" and n.char == 102 ) or ( key == "f_f.short" and n.char == 64256 ) then
- n.char = value
- end
- end
- end
- end
- end
- end
- end
- local glyph_count = 0
- for n in T_GLYPH ( head ) do
- glyph_count = glyph_count + 1
- if glyph_count > 4 then break end
- end
- if glyph_count > 4 then
- local text_table = { nil, nil, nil, nil, nil, nil, nil, nil, nil }
- local table_counter = 0
- for n in T_GLYPH ( head ) do
- if n.char then
- table_counter = table_counter + 1
- text_table[table_counter] = CHAR ( n.char )
- end
- end
- local text_string = {""}
- for i = 1, table_counter do
- text_string[#text_string + 1] = text_table[i]
- end
- text_string = T_CC (text_string)
-
- local function lt ( nolig, lig, lig_beg, lig_end, text, ligs, plus )
- if FIND ( text_string, text ) then
- no_lig ( nolig, lig, lig_beg, lig_end, text, head, ligs, plus )
- end
- end
-
- local ligs = get_ligs ( head )
- if not no_default then
- if next ( ligs["ff"] ) then
- lt ( true, "ff", 3, 4, "Auff+", ligs["ff"], "aeiloruyäöü" )
- lt ( true, "ff", 3, 4, "auff+", ligs["ff"], "aeiloruyäöü" )
- lt ( false, "ff", 4, 5, "Lauffen", ligs["ff"] )
- lt ( false, "ff", 5, 6, "Stauffach", ligs["ff"] )
- lt ( false, "ff", 5, 6, "Stauffen", ligs["ff"] )
- lt ( false, "ff", 5, 6, "stauffen", ligs["ff"] )
- lt ( false, "ff", 5, 6, "Stauffer", ligs["ff"] )
- lt ( false, "ff", 5, 6, "stauffer", ligs["ff"] )
- lt ( false, "ff", 5, 6, "Stauffisch", ligs["ff"] )
- lt ( false, "ff", 5, 6, "stauffisch", ligs["ff"] )
- lt ( false, "ff", 5, 6, "chauffier", ligs["ff"] )
- lt ( false, "ff", 5, 6, "Chauffier", ligs["ff"] )
- lt ( false, "ff", 5, 6, "chauffeur", ligs["ff"] )
- lt ( false, "ff", 5, 6, "Chauffeur", ligs["ff"] )
- lt ( false, "ff", 5, 6, "chauffement", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Brieff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "brieff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "Cheff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "cheff+", ligs["ff"], "aäeioöruü" )
- lt ( false, "ff", 4, 5, "cheffekt", ligs["ff"] )
- lt ( false, "ff", 5, 6, "Scheffel", ligs["ff"] )
- lt ( false, "ff", 5, 6, "scheffel", ligs["ff"] )
- lt ( false, "ff", 4, 5, "cheffizi", ligs["ff"] )
- lt ( false, "ff", 4, 5, "cheffé", ligs["ff"] )
- lt ( true, "ff", 4, 5, "cheffl+", ligs["ff"], "aiou" )
- lt ( true, "ff", 5, 6, "Dampff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "dampff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "Dorff+", ligs["ff"], "aäeiloöruü" )
- lt ( true, "ff", 4, 5, "dorff+", ligs["ff"], "aäeiloöruü" )
- lt ( true, "ff", 4, 5, "Hanff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "hanff", ligs["ff"] )
- lt ( true, "ff", 3, 4, "Hoff+", ligs["ff"], "aäiloöruü" )
- lt ( false, "ff", 3, 4, "Hoffacker", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Hoffart", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Hoffärt", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Hoffricht", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Hoffranz", ligs["ff"] )
- lt ( true, "ff", 4, 5, "Golff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "golff", ligs["ff"] )
- lt ( true, "ff", 3, 4, "Hoffern", ligs["ff"] )
- lt ( true, "ff", 3, 4, "hoffern", ligs["ff"] )
- lt ( true, "ff", 3, 4, "Hoffest", ligs["ff"] )
- lt ( true, "ff", 4, 5, "Impff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Kampff+", ligs["ff"], "aäeoöruü" )
- lt ( true, "ff", 5, 6, "kampff+", ligs["ff"], "aäeoöruü" )
- lt ( true, "ff", 4, 5, "Kopff+", ligs["ff"], "aäeoöruü" )
- lt ( true, "ff", 4, 5, "kopff+", ligs["ff"], "aäeoöruü" )
- lt ( true, "ff", 5, 6, "Klopff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "klopff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "Prüff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "prüff", ligs["ff"] )
- lt ( true, "ff", 3, 4, "Ruffach", ligs["ff"] )
- lt ( true, "ff", 3, 4, "ruffach", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Rumpff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Schaffang", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Schaffarm", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Schaffels", ligs["ff"] )
- lt ( true, "ff", 6, 7, "Schilff", ligs["ff"] )
- lt ( true, "ff", 6, 7, "schilff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "Senff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "senffa", ligs["ff"] )
- lt ( true, "ff", 4, 5, "senffl", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Sumpff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "sumpff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "Tariff", ligs["ff"] )
- lt ( true, "ff", 5, 6, "tariff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "Tieff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "tieff", ligs["ff"] )
- lt ( false, "ff", 4, 5, "tieffekt", ligs["ff"] )
- lt ( false, "ff", 4, 5, "tieffiz", ligs["ff"] )
- lt ( true, "ff", 4, 5, "chaffron", ligs["ff"] )
- lt ( true, "ff", 3, 4, "eiffest", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffabrik", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffacet", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffachl", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffachm", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffäch", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffaden", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffäd", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffähig", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffahn", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffahr", ligs["ff"] )
- lt ( false, "ff", 2, 3, "iffahrt", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffähr", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffaktor", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffakult", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffall", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffallee", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffallerg", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffallokat", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffäll", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffalt", ligs["ff"] )
- lt ( false, "ff", 2, 3, "iffalt", ligs["ff"] )
- lt ( false, "ff", 2, 3, "offalt", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffält", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffami", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Diffami", ligs["ff"] )
- lt ( false, "ff", 3, 4, "diffami", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffanat", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffans", ligs["ff"] )
- lt ( false, "ff", 3, 4, "riffans", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffans", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffanta", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffarb", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffarbeit", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffärb", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffaschi", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffassad", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffäul", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffecht", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffeder", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffedr", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffehl", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffeier", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffeier", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffeind+", ligs["ff"], "els" )
- lt ( false, "ff", 1, 2, "ffeindealer", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Büffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "büffeld", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffeldenk", ligs["ff"] )
- lt ( false, "ff", 2, 3, "Iffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Löffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "löffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Müffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "müffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "nüffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Riffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "taffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffeld", ligs["ff"] )
- lt ( false, "ff", 4, 5, "Trüffeld", ligs["ff"] )
- lt ( false, "ff", 4, 5, "trüffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Waffeld", ligs["ff"] )
- lt ( false, "ff", 3, 4, "waffeld", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffell", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffelleck", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffellinde", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Muffell", ligs["ff"] )
- lt ( false, "ff", 3, 4, "muffell", ligs["ff"] )
- lt ( false, "ff", 2, 3, "öffell", ligs["ff"] )
- lt ( false, "ff", 3, 4, "taffell", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffell", ligs["ff"] )
- lt ( false, "ff", 2, 3, "üffell", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffeile", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffenster", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fferien", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffernseh", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffertig", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffestl", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffests", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffetisch", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffetus", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffett", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Buffett", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Büffett", ligs["ff"] )
- lt ( false, "ff", 3, 4, "buffett", ligs["ff"] )
- lt ( false, "ff", 3, 4, "büffett", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffetz", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Buffetz", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Büffetz", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffeud", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffeue", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffilet", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffindung", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffirm", ligs["ff"] )
- lt ( false, "ff", 2, 3, "affirm", ligs["ff"] )
- lt ( false, "ff", 2, 3, "Affirm", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffolg", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffoli", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffolter", ligs["ff"] )
- lt ( false, "ff", 2, 3, "Affoltern", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffond", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fforder", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fförder", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fforell", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fform", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fförm", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fforsch", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fforen", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fforu", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffoto", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fföt", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffracht", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrag", ligs["ff"] )
- lt ( false, "ff", 3, 4, "Suffrage", ligs["ff"] )
- lt ( false, "ff", 3, 4, "suffrage", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrak", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffrak", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrank", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffräs", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrau", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffraum", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffraub", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffrausch", ligs["ff"] )
- lt ( false, "ff", 1, 2, "ffraup", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffreak", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffreak", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffregat", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrei", ligs["ff"] )
- lt ( false, "ff", 4, 5, "chiffrei", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffrei", ligs["ff"] )
- lt ( false, "ff", 2, 3, "uffreis", ligs["ff"] )
- lt ( false, "ff", 3, 4, "luffrei", ligs["ff"] )
- lt ( false, "ff", 2, 3, "iffreig", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffremd", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffreq", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffreu", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrisch", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffried", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffries", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffries", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrist", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffriseu", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrisur", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffront", ligs["ff"] )
- lt ( false, "ff", 2, 3, "affront", ligs["ff"] )
- lt ( false, "ff", 2, 3, "Affront", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrosch", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrösch", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrucht", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrücht", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffrüh", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffund", ligs["ff"] )
- lt ( false, "ff", 2, 3, "iffund", ligs["ff"] )
- lt ( false, "ff", 3, 4, "toffund", ligs["ff"] )
- lt ( true, "ff", 1, 2, "fführ", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffunk", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffühl", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffüll", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffürst", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffuß", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffuss", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffüß", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffüss", ligs["ff"] )
- lt ( false, "ff", 2, 3, "iffuss", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffutter", ligs["ff"] )
- lt ( true, "ff", 1, 2, "ffütter", ligs["ff"] )
- lt ( true, "ff", 3, 4, "hoffan", ligs["ff"] )
- lt ( true, "ff", 3, 4, "hoffersch", ligs["ff"] )
- lt ( true, "ff", 3, 4, "hoffest", ligs["ff"] )
- lt ( true, "ff", 3, 4, "hoffete", ligs["ff"] )
- lt ( true, "ff", 2, 3, "lffach", ligs["ff"] )
- lt ( true, "ff", 2, 3, "offegen", ligs["ff"] )
- lt ( true, "ff", 2, 3, "pffach", ligs["ff"] )
- lt ( true, "ff", 2, 3, "pffern", ligs["ff"] )
- lt ( true, "ff", 2, 3, "pffest", ligs["ff"] )
- lt ( true, "ff", 2, 3, "pffels", ligs["ff"] )
- lt ( true, "ff", 2, 3, "pffont", ligs["ff"] )
- lt ( true, "ff", 2, 3, "pffüh", ligs["ff"] )
- lt ( true, "ff", 4, 5, "reiffern", ligs["ff"] )
- lt ( true, "ff", 2, 3, "rffan", ligs["ff"] )
- lt ( true, "ff", 2, 3, "rffeel", ligs["ff"] )
- lt ( true, "ff", 2, 3, "rffest", ligs["ff"] )
- lt ( true, "ff", 2, 3, "rffinn", ligs["ff"] )
- lt ( true, "ff", 2, 3, "rffleck", ligs["ff"] )
- lt ( true, "ff", 5, 6, "straffern", ligs["ff"] )
- lt ( false, "ff", 7, 8, "rtstraffern", ligs["ff"] )
- lt ( false, "ff", 7, 8, "ssstraffern", ligs["ff"] )
- lt ( true, "ff", 2, 3, "uffax", ligs["ff"] )
- lt ( true, "ff", 3, 4, "ünff", ligs["ff"] )
- lt ( true, "ff", 4, 5, "wurff+", ligs["ff"], "aäeiloöruü" )
- end
- if next ( ligs["fi"] ) then
- lt ( true, "fi", 3, 4, "Aufi", ligs["fi"] )
- lt ( true, "fi", 3, 4, "aufinstr", ligs["fi"] )
- lt ( true, "fi", 3, 4, "aufirr", ligs["fi"] )
- lt ( true, "fi", 3, 4, "aufisst", ligs["fi"] )
- lt ( true, "fi", 5, 6, "Briefi", ligs["fi"] )
- lt ( true, "fi", 5, 6, "briefi", ligs["fi"] )
- lt ( false, "fi", 5, 6, "Briefing", ligs["fi"] )
- lt ( false, "fi", 6, 7, "ebriefing", ligs["fi"] )
- lt ( true, "fi", 4, 5, "Chefi", ligs["fi"] )
- lt ( true, "fi", 4, 5, "chefi", ligs["fi"] )
- lt ( false, "fi", 4, 5, "Chefin", ligs["fi"] )
- lt ( true, "fi", 4, 5, "Chefin+", ligs["fi"] , "abcdefghijklmopqrstuvwxyzäöü" )
- lt ( false, "fi", 4, 5, "chefin", ligs["fi"] )
- lt ( true, "fi", 4, 5, "chefind", ligs["fi"] )
- lt ( false, "fi", 4, 5, "chefibel", ligs["fi"] )
- lt ( false, "fi", 4, 5, "chefiebe", ligs["fi"] )
- lt ( false, "fi", 4, 5, "chefigur", ligs["fi"] )
- lt ( false, "fi", 4, 5, "chefilm", ligs["fi"] )
- lt ( false, "fi", 4, 5, "chefili", ligs["fi"] )
- lt ( false, "fi", 4, 5, "chefirm", ligs["fi"] )
- lt ( false, "fi", 4, 5, "chefisch", ligs["fi"] )
- lt ( true, "fi", 4, 5, "Dorfi", ligs["fi"] )
- lt ( true, "fi", 4, 5, "dorfi", ligs["fi"] )
- lt ( true, "fi", 3, 4, "Hofi", ligs["fi"] )
- lt ( false, "fi", 3, 4, "Hofier", ligs["fi"] )
- lt ( true, "fi", 5, 6, "Kampfi", ligs["fi"] )
- lt ( true, "fi", 5, 6, "kampfi", ligs["fi"] )
- lt ( true, "fi", 4, 5, "Kaufi", ligs["fi"] )
- lt ( true, "fi", 4, 5, "kaufi", ligs["fi"] )
- lt ( true, "fi", 4, 5, "Laufi", ligs["fi"] )
- lt ( true, "fi", 4, 5, "laufi", ligs["fi"] )
- lt ( false, "fi", 4, 5, "Laufig", ligs["fi"] )
- lt ( false, "fi", 5, 6, "Blaufi", ligs["fi"] )
- lt ( false, "fi", 4, 5, "laufilter", ligs["fi"] )
- lt ( false, "fi", 4, 5, "laufiedr", ligs["fi"] )
- lt ( true, "fi", 3, 4, "rüfi", ligs["fi"] )
- lt ( true, "fi", 5, 6, "Rumpfi", ligs["fi"] )
- lt ( true, "fi", 5, 6, "rumpfi", ligs["fi"] )
- lt ( false, "fi", 5, 6, "rumpfig", ligs["fi"] )
- lt ( true, "fi", 4, 5, "chafi", ligs["fi"] )
- lt ( false, "fi", 5, 6, "schafigu", ligs["fi"] )
- lt ( true, "fi", 5, 6, "chlafi", ligs["fi"] )
- lt ( false, "fi", 5, 6, "chlafitt", ligs["fi"] )
- lt ( true, "fi", 5, 6, "Strafi", ligs["fi"] )
- lt ( true, "fi", 5, 6, "strafi", ligs["fi"] )
- lt ( true, "fi", 5, 6, "Tarifi", ligs["fi"] )
- lt ( true, "fi", 5, 6, "tarifi", ligs["fi"] )
- lt ( false, "fi", 5, 6, "Tarifier", ligs["fi"] )
- lt ( false, "fi", 5, 6, "tarifier", ligs["fi"] )
- lt ( true, "fi", 4, 5, "Tiefinn", ligs["fi"] )
- lt ( true, "fi", 4, 5, "tiefinn", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fidee", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fideol", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fidentif", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fidentit", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fidol", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fidyll", ligs["fi"] )
- lt ( true, "fi", 1, 2, "figel", ligs["fi"] )
- lt ( false, "fi", 1, 2, "figelehrt", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fikone", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fillus", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fimman", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fimmob", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fimmun", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fimp", ligs["fi"] )
- lt ( true, "fi", 1, 2, "findex", ligs["fi"] )
- lt ( true, "fi", 1, 2, "findikat", ligs["fi"] )
- lt ( true, "fi", 1, 2, "findiv", ligs["fi"] )
- lt ( true, "fi", 1, 2, "findiz", ligs["fi"] )
- lt ( true, "fi", 1, 2, "findust", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finfekt", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finfiz", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finfo", ligs["fi"] )
- lt ( false, "fi", 4, 5, "Delfinfo", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finfra", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finfus", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fingenieur", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finhab", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finhalat", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finhalt", ligs["fi"] )
- lt ( false, "fi", 4, 5, "Delfinhalt", ligs["fi"] )
- lt ( false, "fi", 4, 5, "raffinhalt", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finitia", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finjekt", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finkont", ligs["fi"] )
- lt ( false, "fi", 4, 5, "Delfinkont", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnenaus", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnenohr", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnenfl", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnenl", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnenraum", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnenräum", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnens", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finner", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnig", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finnov", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finsass", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finsekt", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finsel", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finserat", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finsign", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finspek", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finsta", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finstinkt", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finstitu", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finstrukt+", ligs["fi"] , "io" )
- lt ( true, "fi", 1, 2, "finstrum", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finsuff", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finszen", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fintars", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fintell", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fintegr", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fintens", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finter", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finton", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fintrig", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finvent", ligs["fi"] )
- lt ( true, "fi", 1, 2, "finvest", ligs["fi"] )
- lt ( true, "fi", 1, 2, "firis", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fironi", ligs["fi"] )
- lt ( true, "fi", 1, 2, "firre", ligs["fi"] )
- lt ( true, "fi", 1, 2, "firru", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fisolat", ligs["fi"] )
- lt ( true, "fi", 1, 2, "fisolie", ligs["fi"] )
- end
- if next ( ligs["fl"] ) then
- lt ( true, "fl", 3, 4, "Aufl+", ligs["fl"], "aeiouyäöü" )
- lt ( true, "fl", 3, 4, "aufl", ligs["fl"] )
- lt ( false, "fl", 3, 4, "auflair", ligs["fl"] )
- lt ( false, "fl", 3, 4, "aufläche", ligs["fl"] )
- lt ( false, "fl", 3, 4, "aufliegl", ligs["fl"] )
- lt ( false, "fl", 3, 4, "auflüssig", ligs["fl"] )
- lt ( false, "fl", 4, 5, "baufl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Baufl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "bauflösen", ligs["fl"] )
- lt ( false, "fl", 5, 6, "blaufl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "blaufloch", ligs["fl"] )
- lt ( true, "fl", 5, 6, "blauflog", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Blaufl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "fraufl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Fraufl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "gauflöte", ligs["fl"] )
- lt ( false, "fl", 5, 6, "graufl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Graufl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "onauflo", ligs["fl"] )
- lt ( false, "fl", 5, 6, "onauflu", ligs["fl"] )
- lt ( false, "fl", 7, 8, "Moskaufl", ligs["fl"] )
- lt ( false, "fl", 6, 7, "Schauflieg", ligs["fl"] )
- lt ( false, "fl", 6, 7, "Schaufloß", ligs["fl"] )
- lt ( false, "fl", 6, 7, "schauflöß", ligs["fl"] )
- lt ( false, "fl", 6, 7, "Schauflug", ligs["fl"] )
- lt ( false, "fl", 6, 7, "Schauflüg", ligs["fl"] )
- lt ( false, "fl", 6, 7, "schauflieg", ligs["fl"] )
- lt ( false, "fl", 6, 7, "schaufloß", ligs["fl"] )
- lt ( false, "fl", 6, 7, "schauflöß", ligs["fl"] )
- lt ( false, "fl", 6, 7, "schauflug", ligs["fl"] )
- lt ( false, "fl", 6, 7, "schauflüg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Taufliege", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Briefl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "briefl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Chefl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "chefl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "achefl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "ichefl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "schefl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "chefläche", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Dampfl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "dampfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Dorfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "dorfl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "dorfliese", ligs["fl"] )
- lt ( false, "fl", 4, 5, "dorflüg", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Fünfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "fünfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Golfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "golfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Hanfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "hanfl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "thanflamm", ligs["fl"] )
- lt ( true, "fl", 3, 4, "Hofl", ligs["fl"] )
- lt ( true, "fl", 3, 4, "hofl", ligs["fl"] )
- lt ( false, "fl", 3, 4, "hoflosk", ligs["fl"] )
- lt ( true, "fl", 3, 4, "Huflatt", ligs["fl"] )
- lt ( true, "fl", 3, 4, "huflatt", ligs["fl"] )
- lt ( true, "fl", 3, 4, "Hufled", ligs["fl"] )
- lt ( true, "fl", 3, 4, "hufled", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Impfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "impfla", ligs["fl"] )
- lt ( false, "fl", 5, 6, "eimpflanz", ligs["fl"] )
- lt ( true, "fl", 4, 5, "impfle", ligs["fl"] )
- lt ( false, "fl", 5, 6, "eimpfleg", ligs["fl"] )
- lt ( false, "fl", 5, 6, "timpfleg", ligs["fl"] )
- lt ( true, "fl", 4, 5, "impflücke", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Kampfl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "kampfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Kopfl+", ligs["fl"], "äeioöuüy" )
- lt ( true, "fl", 4, 5, "kopfl+", ligs["fl"], "äeioöuüy" )
- lt ( true, "fl", 4, 5, "Köpfl+", ligs["fl"], "aäioöuüy" )
- lt ( true, "fl", 4, 5, "köpfl+", ligs["fl"], "aäioöuüy" )
- lt ( true, "fl", 3, 4, "opfla", ligs["fl"] )
- lt ( false, "fl", 4, 5, "kopflaster", ligs["fl"] )
- lt ( false, "fl", 4, 5, "kopfleg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "kopflaum", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Pfeifl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "pfeifl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Pfiffl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "pfiffl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Prüfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "prüfl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "Reliefl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "reliefl", ligs["fl"] )
- lt ( true, "fl", 3, 4, "Rufl", ligs["fl"] )
- lt ( true, "fl", 3, 4, "rufl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Durufl", ligs["fl"] )
- lt ( false, "fl", 6, 7, "mbarufl", ligs["fl"] )
- lt ( false, "fl", 3, 4, "ruflagge", ligs["fl"] )
- lt ( false, "fl", 3, 4, "rufleisch", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Schafl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "schafl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "Schiefl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "schiefl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "Schilfl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "schilfl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "Schlafl", ligs["fl"] )
- lt ( true, "fl", 6, 7, "schlafl", ligs["fl"] )
- lt ( true, "fl", 7, 8, "Schleifl", ligs["fl"] )
- lt ( true, "fl", 7, 8, "schleifl", ligs["fl"] )
- lt ( true, "fl", 8, 9, "Schrumpfl", ligs["fl"] )
- lt ( true, "fl", 8, 9, "schrumpfl", ligs["fl"] )
- lt ( true, "fl", 7, 8, "Schweifl", ligs["fl"] )
- lt ( true, "fl", 7, 8, "schweifl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Senfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "senfl+", ligs["fl"], "aä" )
- lt ( true, "fl", 5, 6, "Steifl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "steifl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Strafl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "strafl", ligs["fl"] )
- lt ( true, "fl", 7, 8, "Strumpfl", ligs["fl"] )
- lt ( true, "fl", 7, 8, "strumpfl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Sumpfl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "sumpfl", ligs["fl"] )
- lt ( false, "fl", 6, 7, "nsumpfl", ligs["fl"] )
- lt ( false, "fl", 6, 7, "isumpfl", ligs["fl"] )
- lt ( false, "fl", 6, 7, "ssumpfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Surfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "surfl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "surfleck", ligs["fl"] )
- lt ( false, "fl", 4, 5, "surflüg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "surflüss", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Tarifl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "tarifl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Tiefl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "tiefl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "tiefläche", ligs["fl"] )
- lt ( false, "fl", 5, 6, "atieflaute", ligs["fl"] )
- lt ( false, "fl", 5, 6, "atieflut", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Topfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "topfl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Topflagg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Topflitz", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Topflor", ligs["fl"] )
- lt ( false, "fl", 5, 6, "rtopfli", ligs["fl"] )
- lt ( false, "fl", 4, 5, "topfläch", ligs["fl"] )
- lt ( false, "fl", 4, 5, "topfleg", ligs["fl"] )
- lt ( true, "fl", 5, 6, "rtopfleg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "topflop", ligs["fl"] )
- lt ( false, "fl", 4, 5, "topflug", ligs["fl"] )
- lt ( false, "fl", 4, 5, "topflüg", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Torfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "torfl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Torflagge", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Torflügel", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Torflut", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torfläche", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflasch", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflieg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflimm", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflitz", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torfloss", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflott", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torfluch", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflug", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflüg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torflüss", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torfluss", ligs["fl"] )
- lt ( false, "fl", 4, 5, "torfluß", ligs["fl"] )
- lt ( true, "fl", 5, 6, "Tropfl", ligs["fl"] )
- lt ( true, "fl", 5, 6, "tropfl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "tropflug", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Wurfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "wurfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Würfl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "würfl", ligs["fl"] )
- lt ( true, "fl", 3, 4, "alflede", ligs["fl"] )
- lt ( true, "fl", 2, 3, "aflied", ligs["fl"] )
- lt ( true, "fl", 2, 3, "aflos", ligs["fl"] )
- lt ( false, "fl", 2, 3, "aflosk", ligs["fl"] )
- lt ( false, "fl", 3, 4, "rafloss", ligs["fl"] )
- lt ( true, "fl", 2, 3, "aflück", ligs["fl"] )
- lt ( true, "fl", 4, 5, "ampfl+", ligs["fl"], "aäou" )
- lt ( false, "fl", 4, 5, "ampfläch", ligs["fl"] )
- lt ( false, "fl", 4, 5, "ampflanz", ligs["fl"] )
- lt ( false, "fl", 4, 5, "ampfleg", ligs["fl"] )
- lt ( true, "fl", 3, 4, "arflad", ligs["fl"] )
- lt ( true, "fl", 3, 4, "äufle", ligs["fl"] )
- lt ( true, "fl", 3, 4, "eufle", ligs["fl"] )
- lt ( false, "fl", 3, 4, "eufleiß", ligs["fl"] )
- lt ( false, "fl", 3, 4, "eufleiss", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flaberer", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flabor", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flage", ligs["fl"] )
- lt ( false, "fl", 3, 4, "siflage", ligs["fl"] )
- lt ( false, "fl", 3, 4, "ouflage", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flagun", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flähm", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flaminat", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flamp", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fland", ligs["fl"] )
- lt ( false, "fl", 1, 2, "flandern", ligs["fl"] )
- lt ( false, "fl", 1, 2, "flandrisch", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fländ", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fläng", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flapp", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flärm", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flauf", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fläuf", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flaun", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fleb", ligs["fl"] )
- lt ( false, "fl", 4, 5, "huffleb", ligs["fl"] )
- lt ( true, "fl", 3, 4, "alfleder", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flehn", ligs["fl"] )
- lt ( false, "fl", 2, 3, "nflehn", ligs["fl"] )
- lt ( false, "fl", 2, 3, "rflehn", ligs["fl"] )
- lt ( false, "fl", 3, 4, "Hoflehn", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flehr", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fleiden", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flein", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fleist", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fleit", ligs["fl"] )
- lt ( false, "fl", 6, 7, "Kaltefleiter", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flektür", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fler", ligs["fl"] )
- lt ( false, "fl", 4, 5, "Hoefler", ligs["fl"] )
- lt ( false, "fl", 7, 8, "Knoepffler", ligs["fl"] )
- lt ( false, "fl", 2, 3, "fflerhyth", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fleut", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flich", ligs["fl"] )
- lt ( false, "fl", 1, 2, "flicht", ligs["fl"] )
- lt ( true, "fl", 3, 4, "öpflicht", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flieb", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flief", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flift", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flig", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flila", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flinde", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fling", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Bempfling", ligs["fl"] )
- lt ( false, "fl", 3, 4, "Haflinge", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flini", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flinse", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flisch", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flist", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fliter", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flizenz", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flobby", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flöch", ligs["fl"] )
- lt ( false, "fl", 1, 2, "flöchte", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flöff", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flohn", ligs["fl"] )
- lt ( false, "fl", 1, 2, "flohnetz", ligs["fl"] )
- lt ( false, "fl", 3, 4, "ntflohn", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flöhn", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flok", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flord", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flösch", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flösu", ligs["fl"] )
- lt ( true, "fl", 1, 2, "fluft", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flung", ligs["fl"] )
- lt ( true, "fl", 1, 2, "flust", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Gipfle", ligs["fl"] )
- lt ( true, "fl", 4, 5, "gipfle", ligs["fl"] )
- lt ( true, "fl", 5, 6, "chopfl", ligs["fl"] )
- lt ( true, "fl", 2, 3, "lflady", ligs["fl"] )
- lt ( true, "fl", 2, 3, "lflast", ligs["fl"] )
- lt ( true, "fl", 2, 3, "lflos", ligs["fl"] )
- lt ( false, "fl", 2, 3, "lfloss", ligs["fl"] )
- lt ( false, "fl", 2, 3, "lflosk", ligs["fl"] )
- lt ( true, "fl", 2, 3, "nflehm", ligs["fl"] )
- lt ( true, "fl", 2, 3, "oflad", ligs["fl"] )
- lt ( true, "fl", 2, 3, "ofläd", ligs["fl"] )
- lt ( true, "fl", 2, 3, "oflück", ligs["fl"] )
- lt ( false, "fl", 4, 5, "gopflaum", ligs["fl"] )
- lt ( false, "fl", 4, 5, "iopflast", ligs["fl"] )
- lt ( false, "fl", 4, 5, "nopflaster", ligs["fl"] )
- lt ( false, "fl", 3, 4, "opflair", ligs["fl"] )
- lt ( false, "fl", 3, 4, "opflanz", ligs["fl"] )
- lt ( true, "fl", 3, 4, "öpfle", ligs["fl"] )
- lt ( true, "fl", 3, 4, "orflad", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflaut", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pfleier", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflehm", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pfleis", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pfleu", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflid", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflied", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pfloch", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflos", ligs["fl"] )
- lt ( false, "fl", 2, 3, "pfloss", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflös", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflup", ligs["fl"] )
- lt ( true, "fl", 2, 3, "pflux", ligs["fl"] )
- lt ( true, "fl", 2, 3, "rfläd", ligs["fl"] )
- lt ( true, "fl", 2, 3, "rflück", ligs["fl"] )
- lt ( true, "fl", 2, 3, "rfluke", ligs["fl"] )
- lt ( true, "fl", 4, 5, "reifl", ligs["fl"] )
- lt ( true, "fl", 4, 5, "Reifl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Breifl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "breifl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Dreifl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "dreifl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "Freifl", ligs["fl"] )
- lt ( false, "fl", 5, 6, "freifl", ligs["fl"] )
- lt ( false, "fl", 7, 8, "eiereifl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reifläch", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reiflagg", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reiflamm", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reiflasch", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reiflies", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reiflock", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reifloh", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reiflöhe", ligs["fl"] )
- lt ( false, "fl", 4, 5, "reiflott", ligs["fl"] )
- lt ( true, "fl", 3, 4, "Tafle", ligs["fl"] )
- lt ( true, "fl", 3, 4, "tafle", ligs["fl"] )
- lt ( false, "fl", 3, 4, "tafleck", ligs["fl"] )
- lt ( false, "fl", 3, 4, "taflege", ligs["fl"] )
- lt ( true, "fl", 3, 4, "urflad", ligs["fl"] )
- lt ( true, "fl", 3, 4, "ürfla", ligs["fl"] )
- lt ( true, "fl", 3, 4, "urfloch", ligs["fl"] )
- lt ( true, "fl", 3, 4, "ürfloch", ligs["fl"] )
- lt ( true, "fl", 3, 4, "wafle", ligs["fl"] )
- lt ( true, "fl", 3, 4, "wefle", ligs["fl"] )
- lt ( true, "fl", 4, 5, "weifle", ligs["fl"] )
- lt ( false, "fl", 4, 5, "weifleck", ligs["fl"] )
- lt ( true, "fl", 4, 5, "werfl", ligs["fl"] )
- lt ( false, "fl", 6, 7, "chwerfl", ligs["fl"] )
- lt ( false, "fl", 4, 5, "werflitz", ligs["fl"] )
- end
- if next ( ligs["ffi"] ) then
- lt ( true, "ff", 2, 3, "affind", ligs["ffi"] )
- lt ( false, "ff", 4, 5, "araffind", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffibel", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffieb", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffigu", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffilm", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffilter", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffinal", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffinte", ligs["ffi"] )
- lt ( false, "ff", 3, 4, "raffinte", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffinanz", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffistel", ligs["ffi"] )
- lt ( true, "ff", 1, 2, "ffixier", ligs["ffi"] )
- lt ( true, "ff", 2, 3, "iffind", ligs["ffi"] )
- lt ( true, "ff", 2, 3, "lffing", ligs["ffi"] )
- lt ( true, "ff", 2, 3, "lffisch", ligs["ffi"] )
- lt ( true, "ff", 2, 3, "nffing", ligs["ffi"] )
- lt ( true, "ff", 2, 3, "pffi", ligs["ffi"] )
- lt ( true, "ff", 4, 5, "reiffing", ligs["ffi"] )
- lt ( true, "fi", 5, 6, "Stoffi", ligs["ffi"] )
- lt ( true, "fi", 5, 6, "stoffi", ligs["ffi"] )
- lt ( false, "fi", 5, 6, "stoffiz", ligs["ffi"] )
- lt ( false, "fi", 5, 6, "stoffig", ligs["ffi"] )
- lt ( true, "fi", 2, 3, "ffinnen", ligs["ffi"] )
- end
- if next ( ligs["ffl"] ) then
- lt ( true, "fl", 5, 6, "Griffl", ligs["ffl"] )
- lt ( true, "fl", 5, 6, "griffl", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "Offline", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "offline", ligs["ffl"] )
- lt ( true, "fl", 5, 6, "Pfiffl", ligs["ffl"] )
- lt ( true, "fl", 6, 7, "Scheffle", ligs["ffl"] )
- lt ( true, "fl", 6, 7, "scheffle", ligs["ffl"] )
- lt ( true, "fl", 6, 7, "Schiffl", ligs["ffl"] )
- lt ( true, "fl", 6, 7, "schiffl", ligs["ffl"] )
- lt ( true, "fl", 5, 6, "Stoffl", ligs["ffl"] )
- lt ( true, "fl", 5, 6, "stoffl", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "afflu", ligs["ffl"] )
- lt ( true, "fl", 2, 3, "fflamell", ligs["ffl"] )
- lt ( true, "fl", 2, 3, "fflast", ligs["ffl"] )
- lt ( true, "fl", 2, 3, "fflatsch", ligs["ffl"] )
- lt ( true, "fl", 2, 3, "ffloch", ligs["ffl"] )
- lt ( true, "fl", 2, 3, "fflos", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "ifflo", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "offlad", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "öffle", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "offlo", ligs["ffl"] )
- lt ( true, "fl", 4, 5, "pufflack", ligs["ffl"] )
- lt ( true, "fl", 4, 5, "taffle", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "ufflad", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "uffläd", ligs["ffl"] )
- lt ( true, "fl", 4, 5, "luffleck", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "äffle", ligs["ffl"] )
- lt ( true, "fl", 3, 4, "üffle", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "Auffl", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "auffl", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "eiffleck", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflatter", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "ffläch", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflech", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "ffleisch", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflexib", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflies", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflimm", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "ffluch", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflüch", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflug", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflüg", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflur", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "ffluss", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflüs", ligs["ffl"] )
- lt ( true, "ff", 1, 2, "fflut", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "iefflieg", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "iefflog", ligs["ffl"] )
- lt ( true, "ff", 2, 3, "lfflach", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "mpffl", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "opffl", ligs["ffl"] )
- lt ( true, "ff", 3, 4, "upffl", ligs["ffl"] )
- lt ( true, "ff", 2, 3, "rfflad", ligs["ffl"] )
- lt ( true, "ff", 2, 3, "rfflasch", ligs["ffl"] )
- lt ( true, "ff", 4, 5, "wurffl", ligs["ffl"] )
- end
- if next ( ligs["ft"] ) then
- lt ( true, "ft", 3, 4, "Auft+", ligs["ft"] , "aähioöruüy" )
- lt ( true, "ft", 3, 4, "auft+", ligs["ft"] , "aähioöruüy" )
- lt ( true, "ft", 5, 6, "Brieft", ligs["ft"] )
- lt ( true, "ft", 5, 6, "brieft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Cheft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "cheft+", ligs["ft"] , "abcdefghijklmnopqrstuvwxyzäöü" )
- lt ( false, "ft", 7, 8, "omicheft+", ligs["ft"] , "ceg" )
- lt ( true, "ft", 4, 5, "Dorft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "dorft", ligs["ft"] )
- lt ( true, "ft", 3, 4, "Elfte", ligs["ft"] )
- lt ( true, "ft", 3, 4, "elfte", ligs["ft"] )
- lt ( false, "ft", 3, 4, "elfterfolg", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Fünft+", ligs["ft"] , "aäeoöruy" )
- lt ( true, "ft", 4, 5, "fünft+", ligs["ft"] , "aäeoöruy" )
- lt ( false, "ft", 4, 5, "fünfterfolg", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Fünfterfolg", ligs["ft"] )
- lt ( false, "ft", 4, 5, "fünftrang", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Fünftrang", ligs["ft"] )
- lt ( false, "ft", 4, 5, "fünftreich", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Fünftreich", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Fünftoper", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Fünftrund", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Fünftäon", ligs["ft"] )
- lt ( false, "ft", 4, 5, "fünftältest", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Fünftältest", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Golft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "golft+", ligs["ft"] , "hiruüy" )
- lt ( true, "ft", 5, 6, "Greift+", ligs["ft"] , "eio" )
- lt ( true, "ft", 4, 5, "Hanftau", ligs["ft"] )
- lt ( true, "ft", 3, 4, "Hoft+", ligs["ft"] , "aäehioöruüy" )
- lt ( true, "ft", 3, 4, "hoft+", ligs["ft"] , "aähioöruü" )
- lt ( true, "ft", 3, 4, "Huftra", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Kopft+", ligs["ft"] , "aäehioöruüy" )
- lt ( true, "ft", 4, 5, "Laufte", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Prüft+", ligs["ft"] , "aähioöruüy" )
- lt ( true, "ft", 4, 5, "prüft+", ligs["ft"] , "aähioöruü" )
- lt ( true, "ft", 3, 4, "Ruft+", ligs["ft"] , "aäehioöruüy" )
- lt ( true, "ft", 5, 6, "Schaftal", ligs["ft"] )
- lt ( true, "ft", 5, 6, "Schaftor", ligs["ft"] )
- lt ( true, "ft", 5, 6, "Schaftreib", ligs["ft"] )
- lt ( true, "ft", 5, 6, "schaftal", ligs["ft"] )
- lt ( true, "ft", 5, 6, "schaftor", ligs["ft"] )
- lt ( true, "ft", 5, 6, "schaftreib", ligs["ft"] )
- lt ( true, "ft", 6, 7, "Schlaft", ligs["ft"] )
- lt ( true, "ft", 6, 7, "schlaft+", ligs["ft"] , "aähioöruüy" )
- lt ( true, "ft", 6, 7, "Schilft+", ligs["ft"] , "äehiruüy" )
- lt ( true, "ft", 6, 7, "schilft+", ligs["ft"] , "hiruüy" )
- lt ( true, "ft", 4, 5, "Senft+", ligs["ft"] , "aäehioöruy" )
- lt ( false, "ft", 4, 5, "Senftenberg", ligs["ft"] )
- lt ( true, "ft", 5, 6, "Straft+", ligs["ft"] , "aähioöruüy" )
- lt ( true, "ft", 5, 6, "straft+", ligs["ft"] , "aähioöruüy" )
- lt ( false, "ft", 5, 6, "straftheit", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Sufft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Surft+", ligs["ft"] , "ähiöüy" )
- lt ( true, "ft", 5, 6, "Tarift", ligs["ft"] )
- lt ( true, "ft", 5, 6, "tarift", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Tieft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Torft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "torft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Wurft", ligs["ft"] )
- lt ( true, "ft", 4, 5, "wurft", ligs["ft"] )
- lt ( true, "ft", 2, 3, "fft+", ligs["ft"] , "aähioöruüy" )
- lt ( true, "ft", 8, 9, "Abstreiftest", ligs["ft"] )
- lt ( true, "ft", 6, 7, "Ankauftest", ligs["ft"] )
- lt ( true, "ft", 7, 8, "Hörprüftest", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Hüpftest", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Impftest", ligs["ft"] )
- lt ( true, "ft", 4, 5, "Kauftest", ligs["ft"] )
- lt ( true, "ft", 5, 6, "Klopftest", ligs["ft"] )
- lt ( true, "ft", 5, 6, "Kneiftest", ligs["ft"] )
- lt ( true, "ft", 12, 13, "Lichtschweiftest", ligs["ft"] )
- lt ( true, "ft", 7, 8, "Rückruftest", ligs["ft"] )
- lt ( true, "ft", 7, 8, "Schnupftest", ligs["ft"] )
- lt ( true, "ft", 5, 6, "Sumpftest", ligs["ft"] )
- lt ( true, "ft", 5, 6, "Tropftest", ligs["ft"] )
- lt ( true, "ft", 9, 10, "Wettkampftest", ligs["ft"] )
- lt ( true, "ft", 4, 5, "tofftest", ligs["ft"] )
- lt ( true, "ft", 2, 3, "aftee", ligs["ft"] )
- lt ( true, "ft", 3, 4, "auftee", ligs["ft"] )
- lt ( true, "ft", 4, 5, "lauftest", ligs["ft"] )
- lt ( true, "ft", 3, 4, "eiftie", ligs["ft"] )
- lt ( true, "ft", 3, 4, "eiftit", ligs["ft"] )
- lt ( true, "ft", 3, 4, "eiftr", ligs["ft"] )
- lt ( true, "ft", 5, 6, "elieft", ligs["ft"] )
- lt ( true, "ft", 3, 4, "enftei", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftabell", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftablett", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftafel", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftag", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftagent", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftäg", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftalsg", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftanz", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftanzahl", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftanzeig", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftanzieh", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftanzüg", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftänz", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftari", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftaristokr", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftarn", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftasse", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftassel", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftatb", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftaten", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftätig", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftauch", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftaugl", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftaume", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftax", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteam", ligs["ft"] )
- lt ( false, "ft", 1, 2, "fteamt", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftechn", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftedd", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteich", ligs["ft"] )
- lt ( false, "ft", 2, 3, "nfteich", ligs["ft"] )
- lt ( false, "ft", 2, 3, "ifteich", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteigw", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteil", ligs["ft"] )
- lt ( false, "ft", 1, 2, "fteilfr", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftelef", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteleph", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftelegr", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteller", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftempel", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftemper", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftempo", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftendenz", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftentak", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteppi", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftermin", ligs["ft"] )
- lt ( false, "ft", 1, 2, "fterminder", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftermit", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftermitt", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fterrain", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fterrass", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fterrin", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fterror", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftestat", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftestation", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftestatist", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fteuf", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftext", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftextrakt", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftheat", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fthem", ligs["ft"] )
- lt ( false, "ft", 1, 2, "fthemm", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftheor", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftherap", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftick", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftief", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftiefigur", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftier", ligs["ft"] )
- lt ( false, "ft", 3, 4, "haftier", ligs["ft"] )
- lt ( false, "ft", 3, 4, "Muftier", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftipp", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftirad", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftisch", ligs["ft"] )
- lt ( false, "ft", 4, 5, "stiftisch", ligs["ft"] )
- lt ( false, "ft", 3, 4, "ünftisch", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftod", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftodem", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fton", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftön", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftool", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftopf", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftopfer", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftöpf", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftorig", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftour", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrader", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftradition", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fträg", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrain", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftränk", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftransp", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fträume", ligs["ft"] )
- lt ( false, "ft", 2, 3, "afträume", ligs["ft"] )
- lt ( false, "ft", 2, 3, "äfträume", ligs["ft"] )
- lt ( false, "ft", 3, 4, "rifträume", ligs["ft"] )
- lt ( false, "ft", 2, 3, "ufträume", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrauri", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftreff", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftresor", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftresorp", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftret", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftrett", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftreturn", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrick", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrieb", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrief", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrift", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrimest", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftritt", ligs["ft"] )
- lt ( false, "ft", 1, 2, "ftritter", ligs["ft"] )
- lt ( false, "ft", 3, 4, "Luftritt", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrott", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrüb", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrunk", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftrupp", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftuch", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftüch", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftürk", ligs["ft"] )
- lt ( true, "ft", 1, 2, "fturm", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftürm", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftyp", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftyr", ligs["ft"] )
- lt ( true, "ft", 1, 2, "ftwist", ligs["ft"] )
- lt ( true, "ft", 4, 5, "graftum", ligs["ft"] )
- lt ( true, "ft", 4, 5, "graftüm", ligs["ft"] )
- lt ( true, "ft", 3, 4, "hoftest", ligs["ft"] )
- lt ( true, "ft", 3, 4, "iefta", ligs["ft"] )
- lt ( true, "ft", 3, 4, "iefto", ligs["ft"] )
- lt ( true, "ft", 3, 4, "ieftö", ligs["ft"] )
- lt ( true, "ft", 3, 4, "ieftra", ligs["ft"] )
- lt ( true, "ft", 2, 3, "lfta", ligs["ft"] )
- lt ( true, "ft", 2, 3, "lfto", ligs["ft"] )
- lt ( true, "ft", 2, 3, "lftö", ligs["ft"] )
- lt ( true, "ft", 2, 3, "lftum", ligs["ft"] )
- lt ( true, "ft", 2, 3, "nftü", ligs["ft"] )
- lt ( false, "ft", 2, 3, "nftüb", ligs["ft"] )
- lt ( true, "ft", 2, 3, "nftübchen", ligs["ft"] )
- lt ( true, "ft", 3, 4, "ölfte", ligs["ft"] )
- lt ( true, "ft", 2, 3, "pft+", ligs["ft"] , "aähioöruüy" )
- lt ( false, "ft", 2, 3, "pftheit", ligs["ft"] )
- lt ( true, "ft", 2, 3, "pftee", ligs["ft"] )
- lt ( true, "ft", 2, 3, "pfteig", ligs["ft"] )
- lt ( true, "ft", 2, 3, "pftender", ligs["ft"] )
- lt ( true, "ft", 2, 3, "rftr", ligs["ft"] )
- lt ( false, "ft", 5, 6, "tdurftrö", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Werftr", ligs["ft"] )
- lt ( false, "ft", 4, 5, "werftr", ligs["ft"] )
- lt ( true, "ft", 4, 5, "werftrage", ligs["ft"] )
- lt ( true, "ft", 2, 3, "rftu", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Werftu", ligs["ft"] )
- lt ( false, "ft", 4, 5, "werftu", ligs["ft"] )
- lt ( true, "ft", 2, 3, "uftas", ligs["ft"] )
- lt ( false, "ft", 3, 4, "Duftas", ligs["ft"] )
- lt ( false, "ft", 3, 4, "duftas", ligs["ft"] )
- lt ( false, "ft", 4, 5, "Gruftas", ligs["ft"] )
- lt ( false, "ft", 4, 5, "gruftas", ligs["ft"] )
- lt ( false, "ft", 3, 4, "Luftas", ligs["ft"] )
- lt ( false, "ft", 3, 4, "luftas", ligs["ft"] )
- lt ( false, "ft", 2, 3, "uftassoz", ligs["ft"] )
- lt ( true, "ft", 3, 4, "urfta", ligs["ft"] )
- lt ( false, "ft", 5, 6, "tdurfta", ligs["ft"] )
- lt ( true, "ft", 3, 4, "urfto", ligs["ft"] )
- lt ( true, "ft", 3, 4, "ünftor", ligs["ft"] )
- end
- if next ( ligs["fb"] ) then
- lt ( true, "fb", 1, 2, "fb", ligs["fb"] )
- end
- if next ( ligs["fh"] ) then
- lt ( true, "fh", 1, 2, "fh", ligs["fh"] )
- end
- if next ( ligs["fk"] ) then
- lt ( true, "fk", 1, 2, "fk", ligs["fk"] )
- lt ( false, "fk", 3, 4, "Kafka", ligs["fk"] )
- lt ( false, "fk", 3, 4, "kafka", ligs["fk"] )
- lt ( false, "fk", 4, 5, "Piefke", ligs["fk"] )
- lt ( false, "fk", 4, 5, "piefkei", ligs["fk"] )
- lt ( false, "fk", 3, 4, "Safka", ligs["fk"] )
- lt ( false, "fk", 6, 7, "Potrafke", ligs["fk"] )
- lt ( false, "fk", 5, 6, "Sprafke", ligs["fk"] )
- lt ( false, "fk", 6, 7, "Shirafkan", ligs["fk"] )
- lt ( false, "fk", 5, 6, "Tirafkan", ligs["fk"] )
- lt ( false, "fk", 4, 5, "Selfkant", ligs["fk"] )
- lt ( false, "fk", 3, 4, "Rifkin", ligs["fk"] )
- end
- if next ( ligs["fj"] ) then
- lt ( true, "fj", 1, 2, "fj", ligs["fj"] )
- lt ( false, "fj", 1, 2, "fjord", ligs["fj"] )
- lt ( false, "fj", 1, 2, "fjör", ligs["fj"] )
- lt ( false, "fj", 4, 5, "Ísafjarðarbær", ligs["fj"] )
- lt ( false, "fj", 1, 2, "fjell", ligs["fj"] )
- lt ( false, "fj", 1, 2, "fjall", ligs["fj"] )
- lt ( false, "fj", 1, 2, "fjäll", ligs["fj"] )
- lt ( false, "fj", 1, 2, "fjöll", ligs["fj"] )
- lt ( false, "fj", 6, 7, "Prokofjew", ligs["fj"] )
- lt ( false, "fj", 3, 4, "Sufjan", ligs["fj"] )
- lt ( false, "fj", 3, 4, "Eefje", ligs["fj"] )
- lt ( false, "fj", 5, 6, "Astafjew", ligs["fj"] )
- end
- if next ( ligs["fff"] ) then
- lt ( true, "ff", 2, 3, "fff", ligs["fff"] )
- end
- end
- for _, value in ipairs ( lig_table ) do
- lt ( value[1], value[2], value[3], value[4], value[5], ligs[value[2]], value[6] )
- end
- end
-end
-
-local function no_ligs ( head )
- local ligs = get_ligs ( head )
- local string_table = { "ff", "fi", "fl", "ft", "fb", "fh", "fk", "fj" }
- local lig_check = {}
- for _, value in pairs ( lig_table ) do
- lig_check[value[2]] = true
- end
- for key, value in pairs ( lig_check ) do
- if value then
- string_table[#string_table + 1] = key
- end
- end
- for _, value in pairs ( string_table ) do
- no_lig ( true, value, 1, 2, value, head, ligs[value] )
- end
-end
-
-function ligtype_write_ligs ( s )
- ATC ( "ligaturing", no_ligs, "no ligs" )
- local lig_check = {}
- for _, value in pairs ( lig_table ) do
- lig_check[value[2]] = true
- end
- local ligs_string = "ff fi fl ft fb fh fk fj"
- for key, value in pairs ( lig_check ) do
- if value and not FIND ( ligs_string, key ) then
- ligs_string = ligs_string .. " " .. key
- end
- end
- local par_end = [[\par\addvspace{\baselineskip}]]
- tex.sprint ( [[\newpage{}\pagestyle{empty}\parindent=0em{}]] .. ligs_string .. par_end .. [[\textbf{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{\textbf{]] .. ligs_string .. [[}}]] .. par_end .. [[{\sffamily{}]] .. ligs_string .. par_end .. [[\textbf{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{\textbf{]] .. ligs_string .. [[}}]] .. par_end .. [[}\newpage{}]] )
-end
-
-function ligtype_make_marks ()
- make_marks = true
- ATC ( "post_linebreak_filter", place_marks, "place marks postline" )
- ATC ( "hpack_filter", place_marks, "place marks hpack" )
-end
-
-function ligtype_on ()
- ATC ( "ligaturing", lig_parse, "make and break ligatures" )
- ATC ( "pre_linebreak_filter", make_kern, "make kerns preline" )
- ATC ( "hpack_filter", make_kern, "make kerns hpack", 2 )
-end
-
-function ligtype_off ()
- RFC ( "ligaturing", "make and break ligatures" )
- RFC ( "pre_linebreak_filter", "make kerns preline" )
- RFC ( "hpack_filter", "make kerns hpack" )
+-- Copyright (c) 2022 Thomas Kelkel kelkel@emaileon.de + +-- This file may be distributed and/or modified under the +-- conditions of the LaTeX Project Public License, either +-- version 1.3c of this license or (at your option) any later +-- version. The latest version of this license is in + +-- http://www.latex-project.org/lppl.txt + +-- and version 1.3c or later is part of all distributions of +-- LaTeX version 2009/09/24 or later. + +-- Version: 0.1b + +-- The ligtype package makes use of the German language +-- ligature suppression rules of the selnolig package by +-- Mico Loretan. The selnolig package can be downloaded at + +-- https://www.ctan.org/pkg/selnolig + +-- and may be distributed and/or modified under the +-- conditions of the LaTeX Project Public License. + +local ID = node.id +local GLYPH = ID ( "glyph" ) +local DISC = ID ( "disc" ) +local GLUE = ID ( "glue" ) +local KERN = ID ( "kern" ) +local WI = ID ( "whatsit" ) +local BOUND = ID ( "boundary" ) +local HLIST = ID ( "hlist" ) +local VLIST = ID ( "vlist" ) +local USERKERN = table.swapped ( node.subtypes ("kern") )["userkern"] +local NEW = node.new +local REM = node.remove +local PREV = node.prev +local NEXT = node.next +local TAIL = node.tail +local HAS_GLYPH = node.has_glyph +local INS_B = node.insert_before +local INS_A = node.insert_after +local T = node.traverse +local T_GLYPH = node.traverse_glyph +local WIS = node.whatsits() +local userdefined +local pdfliteral +local pairs = pairs +local next = next +local type = type +local U = unicode.utf8 +local CHAR = U.char +local GSUB = U.gsub +local SUB = U.sub +local LEN = U.len +local BYTE = U.byte +local FIND = U.find +local T_INS = table.insert +local T_CC = table.concat +local FLOOR = math.floor +local GET_FONT = font.getfont +local ATC = luatexbase.add_to_callback +local RFC = luatexbase.remove_from_callback + +local make_marks = false +local no_short_f = false +local all_short_f = false +local no_default = false +local lig_table = {} + +for key, value in pairs ( WIS ) do + if value == "user_defined" then + userdefined = key + elseif value == "pdf_literal" then + pdfliteral = key + end +end + +function ligtype_no_short_f () + no_short_f = true +end + +function ligtype_all_short_f () + all_short_f = true +end + +function ligtype_no_default () + no_default = true +end + +local function to_ascii ( text ) + return GSUB ( text, "[äöüß]", "a" ) +end + +function ligtype_parse_macro ( text, marker, nolig ) + local text_ascii = to_ascii ( text ) + local marker_ascii = to_ascii ( marker ) + local pos = { nil, nil, nil, nil, nil } + pos[1] = nolig + local m_pos = FIND ( marker_ascii, "|" ) + pos[2] = SUB ( marker, m_pos - 1, m_pos - 1 ) .. SUB ( marker, m_pos + 1, m_pos + 1 ) + pos[3] = m_pos - 1 + pos[4] = m_pos + if FIND ( text_ascii, "[%[]" ) then + local plus_start = FIND ( text_ascii, "[%[]" ) + 1 + local plus_end = FIND ( text_ascii, "[%]]" ) - 1 + pos[6] = SUB ( text, plus_start, plus_end ) + text = SUB ( text, 1, plus_start - 2 ) .. "+" + end + pos[5] = text + lig_table[#lig_table + 1] = pos +end + +local function round ( num, dec ) + return FLOOR ( num * 10^dec + 0.5 ) / 10^dec +end + +local function calc_value ( value ) + value = round ( value / 65536, 3 ) + return value +end + +local function get_char_bytes ( text, text_len, reverse ) + local a = { nil, nil, nil, nil, nil } + for i = 1, text_len do + if reverse then + a[text_len - i + 1] = BYTE ( text, i ) + else + a[i] = BYTE ( text, i ) + end + end + return a +end + +local function find_glyph ( n, d, replace ) + if d ( n ) then + n = d ( n ) + while n.id ~= GLYPH do + if not d ( n ) or n.id == GLUE or n.id == BOUND or ( n.id == KERN and n.subtype == USERKERN ) then replace = false break end + n = d ( n ) + end + else + replace = false + end + return n, replace +end + +local function get_ligs ( head ) + local lig_check = { ["ff"] = true, ["fi"] = true, ["fl"] = true, ["ffi"] = true, ["ffl"] = true, ["ft"] = true, ["fft"] = true, ["fb"] = true, ["ffb"] = true, ["fh"] = true, ["ffh"] = true, ["fk"] = true, ["ffk"] = true, ["fj"] = true, ["ffj"] = true, ["fff"] = true } + local ligs = { ["ff"] = { nil, nil, nil, nil, nil }, ["fi"] = { nil, nil, nil, nil, nil }, ["fl"] = { nil, nil, nil, nil, nil }, ["ffi"] = { nil, nil, nil, nil, nil }, ["ffl"] = { nil, nil, nil, nil, nil }, ["ft"] = { nil, nil, nil, nil, nil }, ["fk"] = { nil, nil, nil, nil, nil }, ["fj"] = { nil, nil, nil, nil, nil }, ["fft"] = { nil, nil, nil, nil, nil }, ["fb"] = { nil, nil, nil, nil, nil }, ["ffb"] = { nil, nil, nil, nil, nil }, ["fh"] = { nil, nil, nil, nil, nil }, ["ffh"] = { nil, nil, nil, nil, nil }, ["ffk"] = { nil, nil, nil, nil, nil }, ["ffj"] = { nil, nil, nil, nil, nil }, ["fff"] = { nil, nil, nil, nil, nil } } + for _, value in pairs ( lig_table ) do + lig_check[value[2]] = true + ligs[value[2]] = { nil, nil, nil, nil, nil } + end + local char_table = {} + for key, _ in pairs ( lig_check ) do + char_table[BYTE ( SUB ( key, 1, 1 ) )] = true + end + for n in T_GLYPH ( head ) do + if n.char and char_table[n.char] then + if NEXT ( n ) then + local next_chars = { false, false } + local second_glyph + local success + local next_glyph = n + for i = 1, 2 do + next_glyph, success = find_glyph ( next_glyph, NEXT, true ) + if success and next_glyph.char then + next_chars[i] = next_glyph.char + if i == 1 then + second_glyph = next_glyph + end + end + end + if next_chars[1] and next_chars[2] and lig_check[CHAR ( n.char ) .. CHAR ( next_chars[1] ) .. CHAR ( next_chars[2] )] then + local threestring = "ff" .. CHAR ( next_chars[2] ) + T_INS ( ligs[threestring], next_glyph ) + end + if next_chars[1] and lig_check[CHAR ( n.char ) .. CHAR ( next_chars[1] )] then + local ligstring = CHAR ( n.char ) .. CHAR ( next_chars[1] ) + T_INS ( ligs[ligstring], second_glyph ) + end + end + end + end + return ligs +end + +local function check_text ( replace, n, d, string_len, string_chars, plus_boolean ) + if d ( n ) then + local MOVE = d ( n ) + for i = 1, string_len do + while MOVE.id ~= GLYPH do + if not d ( MOVE ) or MOVE.id == GLUE or MOVE.id == BOUND or ( MOVE.id == KERN and MOVE.subtype == USERKERN ) then replace = false break end + MOVE = d ( MOVE ) + end + if ( MOVE.char ~= string_chars[i] and string_chars[i] ~= 43 ) or ( string_chars[i] == 43 and not plus_boolean[MOVE.char] ) then replace = false break end + if d ( MOVE ) then + MOVE = d ( MOVE ) + elseif i ~= string_len then replace = false break end + end + else + replace = false + end + return replace +end + +local function no_lig ( nolig, lig, lig_beg, lig_end, text, head, ligs, plus ) + local chars = { lig = { nil, nil, nil }, before = { nil, nil, nil, nil, nil }, after = { nil, nil, nil, nil, nil }, plus = { nil, nil, nil, nil, nil, nil, nil, nil, nil } } + local before_lig + local after_lig + local count = 0 + local text_len = LEN ( text ) + local before_lig_len = lig_beg - 1 + local after_lig_len = text_len - lig_end + chars.lig = get_char_bytes ( lig, 2, false ) + if lig_beg > 1 then + before_lig = SUB ( text, 1, before_lig_len ) + chars.before = get_char_bytes ( before_lig, before_lig_len, true ) + end + if lig_end < text_len then + after_lig = SUB ( text, (lig_end + 1), text_len ) + chars.after = get_char_bytes ( after_lig, after_lig_len, false ) + end + local plus_boolean = { nil, nil, nil, nil, nil, nil, nil, nil, nil } + if plus then + chars.plus = get_char_bytes ( plus, LEN ( plus ), false ) + for _, value in pairs ( chars.plus ) do + if not ( value == nil ) then + plus_boolean[value] = true + end + end + end + for _, value in pairs ( ligs ) do + count = count + 1 + local n + if value.char ~= chars.lig[2] then + local BEFORE = value + BEFORE = find_glyph ( BEFORE, PREV, true ) + n = BEFORE + else + n = value + end + if n.char == chars.lig[2] then + local replace = true + local prev_glyph = n + prev_glyph, replace = find_glyph ( prev_glyph, PREV, replace ) + if NEXT ( prev_glyph ) and NEXT ( prev_glyph ).user_id and NEXT ( prev_glyph ).user_id == 289473 and nolig then + replace = false + end + if prev_glyph.char ~= chars.lig[1] then + replace = false + end + if replace then + if lig_beg > 1 then + replace = check_text ( replace, prev_glyph, PREV, before_lig_len, chars.before, plus_boolean ) + end + if lig_end < text_len then + replace = check_text ( replace, n, NEXT, after_lig_len, chars.after, plus_boolean ) + end + if replace then + if nolig then + INS_A ( head, prev_glyph, NEW ( WI, userdefined ) ) + NEXT ( prev_glyph ).type = 100 + NEXT ( prev_glyph ).user_id = 289473 + else + if NEXT ( prev_glyph ) and NEXT ( prev_glyph ).user_id == 289473 then + REM ( head, NEXT ( prev_glyph ) ) + end + end + end + end + end + end +end + +local function find_disc ( n, d ) + local disc_node = nil + while n.id ~= GLYPH do + if d ( n ) then + n = d ( n ) + else break end + if n.id == DISC then + disc_node = n + break end + end + return disc_node +end + +local function find_prev_next_glyph ( n, d ) + local some_node = d ( n ) + local lig_post = nil + while some_node.id ~= GLYPH do + if some_node.id == DISC and some_node.replace and HAS_GLYPH ( some_node.replace ) then + for glyph_node in T_GLYPH ( some_node.replace ) do + some_node = glyph_node + end + if d == PREV then + for glyph_node in T_GLYPH ( some_node.post ) do + lig_post = glyph_node + end + end + break end + some_node = d ( some_node ) + end + return some_node, lig_post +end + +local function make_kern ( head ) + local glyph_count = 0 + for n in T_GLYPH ( head ) do + glyph_count = glyph_count + 1 + if glyph_count > 4 then break end + end + if glyph_count > 4 then + for n in T ( head ) do + if n.id == WI and n.user_id == 289473 then + local font_kern = true + local hyphen_font_kern = true + local post_lig_font_kern = true + local prev_glyph, lig_post = find_prev_next_glyph ( n, PREV ) + local next_glyph = find_prev_next_glyph ( n, NEXT ) + local kern_value = 0 + local kern_add = 0 + local hyphen_kern = 0 + local post_lig_kern = 0 + if prev_glyph.font then + local tfmdata = GET_FONT ( prev_glyph.font ) + if tfmdata.resources then + local resources = tfmdata.resources + if not no_short_f and resources.unicodes then + local uni = resources.unicodes + local ff = nil + local ff_short = nil + local f_short = nil + for key, value in pairs ( uni ) do + if key == "f_f" or key == "uniFB00" then + ff = value + elseif key == "f_f.short" or key == "f_f.alt" then + ff_short = value + elseif key == "f.short" or key == "f.alt" then + f_short = value + end + end + if ( prev_glyph.char == 102 ) and f_short then + prev_glyph.char = f_short + elseif ( prev_glyph.char == ff ) and ff_short then + prev_glyph.char = ff_short + end + end + if resources.sequences then + local seq = resources.sequences + for _, t in pairs ( seq ) do + if t.steps then + local steps = t.steps + for _, k in pairs ( steps ) do + if k.coverage and ( k.coverage[prev_glyph.char] or ( lig_post and k.coverage[lig_post.char] ) ) then + if k.coverage[prev_glyph.char] then + local glyph_table = k.coverage[prev_glyph.char] + if type ( glyph_table ) == "table" then + for key, value in pairs ( glyph_table ) do + if ( key == next_glyph.char or key == 45 ) and type ( value ) == "number" and ( k.format == "move" or tfmdata.specification.features.raw[t.name] ) then + if font_kern and key == next_glyph.char then + kern_value = kern_value + ( value / tfmdata.units_per_em * tfmdata.size ) + if tfmdata.specification.features.raw[t.name] then + font_kern = false + end + elseif hyphen_font_kern and key == 45 then + hyphen_kern = hyphen_kern + ( value / tfmdata.units_per_em * tfmdata.size ) + if tfmdata.specification.features.raw[t.name] then + hyphen_font_kern = false + end + end + end + end + end + end + if lig_post and k.coverage[lig_post.char] then + local glyph_table = k.coverage[lig_post.char] + if type ( glyph_table ) == "table" then + for key, value in pairs ( glyph_table ) do + if ( key == next_glyph.char ) and type ( value ) == "number" and ( k.format == "move" or tfmdata.specification.features.raw[t.name] ) then + if post_lig_font_kern and key == next_glyph.char then + post_lig_kern = post_lig_kern + ( value / tfmdata.units_per_em * tfmdata.size ) + if tfmdata.specification.features.raw[t.name] then + post_lig_font_kern = false + end + end + end + end + end + end + end + end + end + end + end + end + end + local disc_prev = find_disc ( n, PREV ) + local disc_next = find_disc ( n, NEXT ) + if disc_prev then + local REPLACE = disc_prev.replace + REPLACE = INS_A ( REPLACE, TAIL ( REPLACE ), NEW ( KERN ) ) + TAIL ( REPLACE ).kern = kern_value + disc_prev.replace = REPLACE + local POST = disc_prev.post + POST = INS_A ( POST, TAIL ( POST ), NEW ( KERN ) ) + TAIL ( POST ).kern = post_lig_kern + disc_prev.post = POST + elseif disc_next then + local REPLACE = disc_next.replace + REPLACE = INS_B ( REPLACE, REPLACE, NEW ( KERN ) ) + REPLACE.kern = kern_value + disc_next.replace = REPLACE + local PRE = disc_next.pre + PRE = INS_B ( PRE, PRE, NEW ( KERN ) ) + PRE.kern = hyphen_kern + disc_next.pre = PRE + else + INS_A ( head, n, NEW ( KERN ) ) + NEXT ( n ).kern = kern_value + end + end + end + end + return head +end + +local function place_marks ( head ) + for n in T ( head ) do + if n.id == HLIST or n.id == VLIST then + n.head = place_marks ( n.head ) + elseif n.id == WI and n.user_id == 289473 then + local kern_add = 0 + if NEXT ( n ) and NEXT ( n ).id == DISC and NEXT ( n ).replace and NEXT ( n ).replace.id == KERN then + kern_add = kern_add + calc_value ( NEXT ( n ).replace.kern ) * 0.5 + elseif NEXT ( n ).id == KERN and NEXT ( n ).kern then + kern_add = kern_add + calc_value ( NEXT ( n ).kern ) * 0.5 + end + if PREV ( n ) and PREV ( n ).id == DISC and PREV ( n ).replace and TAIL ( PREV ( n ).replace ).id == KERN then + kern_add = kern_add - calc_value ( TAIL ( PREV ( n ).replace ).kern ) * 0.5 + elseif PREV ( n ).id == KERN and PREV ( n ).kern then + kern_add = kern_add - calc_value ( PREV ( n ).kern ) * 0.5 + end + local size_factor = 1 + if font.current() then + size_factor = calc_value ( GET_FONT ( font.current() ).size / 10 ) + end + head = INS_B ( head, n, NEW ( WI, pdfliteral ) ) + PREV ( n ).mode = 0 + PREV ( n ).data = "q .2 .8 1 rg " .. kern_add .. " 0 m " .. ( kern_add + 2 * size_factor ) .. " " .. -3 * size_factor .. " l " .. ( kern_add - 2 * size_factor ) .. " " .. -3 * size_factor .. " l " .. kern_add .. " 0 l f Q" + n.user_id = 848485 + end + end + return head +end + +local function lig_parse ( head ) + if all_short_f then + for n in T_GLYPH ( head ) do + if n.char == 102 and n.font then + local tfmdata = GET_FONT ( n.font ) + if tfmdata.resources then + local resources = tfmdata.resources + if resources.unicodes then + local uni = resources.unicodes + for key, value in pairs ( uni ) do + if key == "f.short" or key == "f.alt" then + n.char = value + end + end + end + end + end + end + end + local glyph_count = 0 + for n in T_GLYPH ( head ) do + glyph_count = glyph_count + 1 + if glyph_count > 4 then break end + end + if glyph_count > 4 then + local text_table = { nil, nil, nil, nil, nil, nil, nil, nil, nil } + local table_counter = 0 + for n in T_GLYPH ( head ) do + if n.char then + table_counter = table_counter + 1 + text_table[table_counter] = CHAR ( n.char ) + end + end + local text_string = {""} + for i = 1, table_counter do + text_string[#text_string + 1] = text_table[i] + end + text_string = T_CC (text_string) + + local function lt ( nolig, lig, lig_beg, lig_end, text, ligs, plus ) + if FIND ( text_string, text ) then + no_lig ( nolig, lig, lig_beg, lig_end, text, head, ligs, plus ) + end + end + + local ligs = get_ligs ( head ) + if not no_default then + if next ( ligs["ff"] ) then + lt ( true, "ff", 3, 4, "Auff+", ligs["ff"], "aeiloruyäöü" ) + lt ( true, "ff", 3, 4, "auff+", ligs["ff"], "aeiloruyäöü" ) + lt ( false, "ff", 4, 5, "Lauffen", ligs["ff"] ) + lt ( false, "ff", 5, 6, "Stauffach", ligs["ff"] ) + lt ( false, "ff", 5, 6, "Stauffen", ligs["ff"] ) + lt ( false, "ff", 5, 6, "stauffen", ligs["ff"] ) + lt ( false, "ff", 5, 6, "Stauffer", ligs["ff"] ) + lt ( false, "ff", 5, 6, "stauffer", ligs["ff"] ) + lt ( false, "ff", 5, 6, "Stauffisch", ligs["ff"] ) + lt ( false, "ff", 5, 6, "stauffisch", ligs["ff"] ) + lt ( false, "ff", 5, 6, "chauffier", ligs["ff"] ) + lt ( false, "ff", 5, 6, "Chauffier", ligs["ff"] ) + lt ( false, "ff", 5, 6, "chauffeur", ligs["ff"] ) + lt ( false, "ff", 5, 6, "Chauffeur", ligs["ff"] ) + lt ( false, "ff", 5, 6, "chauffement", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Brieff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "brieff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "Cheff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "cheff+", ligs["ff"], "aäeioöruü" ) + lt ( false, "ff", 4, 5, "cheffekt", ligs["ff"] ) + lt ( false, "ff", 5, 6, "Scheffel", ligs["ff"] ) + lt ( false, "ff", 5, 6, "scheffel", ligs["ff"] ) + lt ( false, "ff", 4, 5, "cheffizi", ligs["ff"] ) + lt ( false, "ff", 4, 5, "cheffé", ligs["ff"] ) + lt ( true, "ff", 4, 5, "cheffl+", ligs["ff"], "aiou" ) + lt ( true, "ff", 5, 6, "Dampff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "dampff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "Dorff+", ligs["ff"], "aäeiloöruü" ) + lt ( true, "ff", 4, 5, "dorff+", ligs["ff"], "aäeiloöruü" ) + lt ( true, "ff", 4, 5, "Hanff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "hanff", ligs["ff"] ) + lt ( true, "ff", 3, 4, "Hoff+", ligs["ff"], "aäiloöruü" ) + lt ( false, "ff", 3, 4, "Hoffacker", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Hoffart", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Hoffärt", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Hoffricht", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Hoffranz", ligs["ff"] ) + lt ( true, "ff", 4, 5, "Golff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "golff", ligs["ff"] ) + lt ( true, "ff", 3, 4, "Hoffern", ligs["ff"] ) + lt ( true, "ff", 3, 4, "hoffern", ligs["ff"] ) + lt ( true, "ff", 3, 4, "Hoffest", ligs["ff"] ) + lt ( true, "ff", 4, 5, "Impff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Kampff+", ligs["ff"], "aäeoöruü" ) + lt ( true, "ff", 5, 6, "kampff+", ligs["ff"], "aäeoöruü" ) + lt ( true, "ff", 4, 5, "Kopff+", ligs["ff"], "aäeoöruü" ) + lt ( true, "ff", 4, 5, "kopff+", ligs["ff"], "aäeoöruü" ) + lt ( true, "ff", 5, 6, "Klopff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "klopff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "Prüff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "prüff", ligs["ff"] ) + lt ( true, "ff", 3, 4, "Ruffach", ligs["ff"] ) + lt ( true, "ff", 3, 4, "ruffach", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Rumpff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Schaffang", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Schaffarm", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Schaffels", ligs["ff"] ) + lt ( true, "ff", 6, 7, "Schilff", ligs["ff"] ) + lt ( true, "ff", 6, 7, "schilff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "Senff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "senffa", ligs["ff"] ) + lt ( true, "ff", 4, 5, "senffl", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Sumpff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "sumpff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "Tariff", ligs["ff"] ) + lt ( true, "ff", 5, 6, "tariff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "Tieff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "tieff", ligs["ff"] ) + lt ( false, "ff", 4, 5, "tieffekt", ligs["ff"] ) + lt ( false, "ff", 4, 5, "tieffiz", ligs["ff"] ) + lt ( true, "ff", 4, 5, "chaffron", ligs["ff"] ) + lt ( true, "ff", 3, 4, "eiffest", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffabrik", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffacet", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffachl", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffachm", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffäch", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffaden", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffäd", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffähig", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffahn", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffahr", ligs["ff"] ) + lt ( false, "ff", 2, 3, "iffahrt", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffähr", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffaktor", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffakult", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffall", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffallee", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffallerg", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffallokat", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffäll", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffalt", ligs["ff"] ) + lt ( false, "ff", 2, 3, "iffalt", ligs["ff"] ) + lt ( false, "ff", 2, 3, "offalt", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffält", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffami", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Diffami", ligs["ff"] ) + lt ( false, "ff", 3, 4, "diffami", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffanat", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffans", ligs["ff"] ) + lt ( false, "ff", 3, 4, "riffans", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffans", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffanta", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffarb", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffarbeit", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffärb", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffaschi", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffassad", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffäul", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffecht", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffeder", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffedr", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffehl", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffeier", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffeier", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffeind+", ligs["ff"], "els" ) + lt ( false, "ff", 1, 2, "ffeindealer", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Büffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "büffeld", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffeldenk", ligs["ff"] ) + lt ( false, "ff", 2, 3, "Iffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Löffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "löffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Müffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "müffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "nüffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Riffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "taffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffeld", ligs["ff"] ) + lt ( false, "ff", 4, 5, "Trüffeld", ligs["ff"] ) + lt ( false, "ff", 4, 5, "trüffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Waffeld", ligs["ff"] ) + lt ( false, "ff", 3, 4, "waffeld", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffell", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffelleck", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffellinde", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Muffell", ligs["ff"] ) + lt ( false, "ff", 3, 4, "muffell", ligs["ff"] ) + lt ( false, "ff", 2, 3, "öffell", ligs["ff"] ) + lt ( false, "ff", 3, 4, "taffell", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffell", ligs["ff"] ) + lt ( false, "ff", 2, 3, "üffell", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffeile", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffenster", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fferien", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffernseh", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffertig", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffestl", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffests", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffetisch", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffetus", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffett", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Buffett", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Büffett", ligs["ff"] ) + lt ( false, "ff", 3, 4, "buffett", ligs["ff"] ) + lt ( false, "ff", 3, 4, "büffett", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffetz", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Buffetz", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Büffetz", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffeud", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffeue", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffilet", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffindung", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffirm", ligs["ff"] ) + lt ( false, "ff", 2, 3, "affirm", ligs["ff"] ) + lt ( false, "ff", 2, 3, "Affirm", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffolg", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffoli", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffolter", ligs["ff"] ) + lt ( false, "ff", 2, 3, "Affoltern", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffond", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fforder", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fförder", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fforell", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fform", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fförm", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fforsch", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fforen", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fforu", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffoto", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fföt", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffracht", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrag", ligs["ff"] ) + lt ( false, "ff", 3, 4, "Suffrage", ligs["ff"] ) + lt ( false, "ff", 3, 4, "suffrage", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrak", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffrak", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrank", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffräs", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrau", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffraum", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffraub", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffrausch", ligs["ff"] ) + lt ( false, "ff", 1, 2, "ffraup", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffreak", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffreak", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffregat", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrei", ligs["ff"] ) + lt ( false, "ff", 4, 5, "chiffrei", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffrei", ligs["ff"] ) + lt ( false, "ff", 2, 3, "uffreis", ligs["ff"] ) + lt ( false, "ff", 3, 4, "luffrei", ligs["ff"] ) + lt ( false, "ff", 2, 3, "iffreig", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffremd", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffreq", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffreu", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrisch", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffried", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffries", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffries", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrist", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffriseu", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrisur", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffront", ligs["ff"] ) + lt ( false, "ff", 2, 3, "affront", ligs["ff"] ) + lt ( false, "ff", 2, 3, "Affront", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrosch", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrösch", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrucht", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrücht", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffrüh", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffund", ligs["ff"] ) + lt ( false, "ff", 2, 3, "iffund", ligs["ff"] ) + lt ( false, "ff", 3, 4, "toffund", ligs["ff"] ) + lt ( true, "ff", 1, 2, "fführ", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffunk", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffühl", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffüll", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffürst", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffuß", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffuss", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffüß", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffüss", ligs["ff"] ) + lt ( false, "ff", 2, 3, "iffuss", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffutter", ligs["ff"] ) + lt ( true, "ff", 1, 2, "ffütter", ligs["ff"] ) + lt ( true, "ff", 3, 4, "hoffan", ligs["ff"] ) + lt ( true, "ff", 3, 4, "hoffersch", ligs["ff"] ) + lt ( true, "ff", 3, 4, "hoffest", ligs["ff"] ) + lt ( true, "ff", 3, 4, "hoffete", ligs["ff"] ) + lt ( true, "ff", 2, 3, "lffach", ligs["ff"] ) + lt ( true, "ff", 2, 3, "offegen", ligs["ff"] ) + lt ( true, "ff", 2, 3, "pffach", ligs["ff"] ) + lt ( true, "ff", 2, 3, "pffern", ligs["ff"] ) + lt ( true, "ff", 2, 3, "pffest", ligs["ff"] ) + lt ( true, "ff", 2, 3, "pffels", ligs["ff"] ) + lt ( true, "ff", 2, 3, "pffont", ligs["ff"] ) + lt ( true, "ff", 2, 3, "pffüh", ligs["ff"] ) + lt ( true, "ff", 4, 5, "reiffern", ligs["ff"] ) + lt ( true, "ff", 2, 3, "rffan", ligs["ff"] ) + lt ( true, "ff", 2, 3, "rffeel", ligs["ff"] ) + lt ( true, "ff", 2, 3, "rffest", ligs["ff"] ) + lt ( true, "ff", 2, 3, "rffinn", ligs["ff"] ) + lt ( true, "ff", 2, 3, "rffleck", ligs["ff"] ) + lt ( true, "ff", 5, 6, "straffern", ligs["ff"] ) + lt ( false, "ff", 7, 8, "rtstraffern", ligs["ff"] ) + lt ( false, "ff", 7, 8, "ssstraffern", ligs["ff"] ) + lt ( true, "ff", 2, 3, "uffax", ligs["ff"] ) + lt ( true, "ff", 3, 4, "ünff", ligs["ff"] ) + lt ( true, "ff", 4, 5, "wurff+", ligs["ff"], "aäeiloöruü" ) + end + if next ( ligs["fi"] ) then + lt ( true, "fi", 3, 4, "Aufi", ligs["fi"] ) + lt ( true, "fi", 3, 4, "aufinstr", ligs["fi"] ) + lt ( true, "fi", 3, 4, "aufirr", ligs["fi"] ) + lt ( true, "fi", 3, 4, "aufisst", ligs["fi"] ) + lt ( true, "fi", 5, 6, "Briefi", ligs["fi"] ) + lt ( true, "fi", 5, 6, "briefi", ligs["fi"] ) + lt ( false, "fi", 5, 6, "Briefing", ligs["fi"] ) + lt ( false, "fi", 6, 7, "ebriefing", ligs["fi"] ) + lt ( true, "fi", 4, 5, "Chefi", ligs["fi"] ) + lt ( true, "fi", 4, 5, "chefi", ligs["fi"] ) + lt ( false, "fi", 4, 5, "Chefin", ligs["fi"] ) + lt ( true, "fi", 4, 5, "Chefin+", ligs["fi"] , "abcdefghijklmopqrstuvwxyzäöü" ) + lt ( false, "fi", 4, 5, "chefin", ligs["fi"] ) + lt ( true, "fi", 4, 5, "chefind", ligs["fi"] ) + lt ( false, "fi", 4, 5, "chefibel", ligs["fi"] ) + lt ( false, "fi", 4, 5, "chefiebe", ligs["fi"] ) + lt ( false, "fi", 4, 5, "chefigur", ligs["fi"] ) + lt ( false, "fi", 4, 5, "chefilm", ligs["fi"] ) + lt ( false, "fi", 4, 5, "chefili", ligs["fi"] ) + lt ( false, "fi", 4, 5, "chefirm", ligs["fi"] ) + lt ( false, "fi", 4, 5, "chefisch", ligs["fi"] ) + lt ( true, "fi", 4, 5, "Dorfi", ligs["fi"] ) + lt ( true, "fi", 4, 5, "dorfi", ligs["fi"] ) + lt ( true, "fi", 3, 4, "Hofi", ligs["fi"] ) + lt ( false, "fi", 3, 4, "Hofier", ligs["fi"] ) + lt ( true, "fi", 5, 6, "Kampfi", ligs["fi"] ) + lt ( true, "fi", 5, 6, "kampfi", ligs["fi"] ) + lt ( true, "fi", 4, 5, "Kaufi", ligs["fi"] ) + lt ( true, "fi", 4, 5, "kaufi", ligs["fi"] ) + lt ( true, "fi", 4, 5, "Laufi", ligs["fi"] ) + lt ( true, "fi", 4, 5, "laufi", ligs["fi"] ) + lt ( false, "fi", 4, 5, "Laufig", ligs["fi"] ) + lt ( false, "fi", 5, 6, "Blaufi", ligs["fi"] ) + lt ( false, "fi", 4, 5, "laufilter", ligs["fi"] ) + lt ( false, "fi", 4, 5, "laufiedr", ligs["fi"] ) + lt ( true, "fi", 3, 4, "rüfi", ligs["fi"] ) + lt ( true, "fi", 5, 6, "Rumpfi", ligs["fi"] ) + lt ( true, "fi", 5, 6, "rumpfi", ligs["fi"] ) + lt ( false, "fi", 5, 6, "rumpfig", ligs["fi"] ) + lt ( true, "fi", 4, 5, "chafi", ligs["fi"] ) + lt ( false, "fi", 5, 6, "schafigu", ligs["fi"] ) + lt ( true, "fi", 5, 6, "chlafi", ligs["fi"] ) + lt ( false, "fi", 5, 6, "chlafitt", ligs["fi"] ) + lt ( true, "fi", 5, 6, "Strafi", ligs["fi"] ) + lt ( true, "fi", 5, 6, "strafi", ligs["fi"] ) + lt ( true, "fi", 5, 6, "Tarifi", ligs["fi"] ) + lt ( true, "fi", 5, 6, "tarifi", ligs["fi"] ) + lt ( false, "fi", 5, 6, "Tarifier", ligs["fi"] ) + lt ( false, "fi", 5, 6, "tarifier", ligs["fi"] ) + lt ( true, "fi", 4, 5, "Tiefinn", ligs["fi"] ) + lt ( true, "fi", 4, 5, "tiefinn", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fidee", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fideol", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fidentif", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fidentit", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fidol", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fidyll", ligs["fi"] ) + lt ( true, "fi", 1, 2, "figel", ligs["fi"] ) + lt ( false, "fi", 1, 2, "figelehrt", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fikone", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fillus", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fimman", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fimmob", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fimmun", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fimp", ligs["fi"] ) + lt ( true, "fi", 1, 2, "findex", ligs["fi"] ) + lt ( true, "fi", 1, 2, "findikat", ligs["fi"] ) + lt ( true, "fi", 1, 2, "findiv", ligs["fi"] ) + lt ( true, "fi", 1, 2, "findiz", ligs["fi"] ) + lt ( true, "fi", 1, 2, "findust", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finfekt", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finfiz", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finfo", ligs["fi"] ) + lt ( false, "fi", 4, 5, "Delfinfo", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finfra", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finfus", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fingenieur", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finhab", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finhalat", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finhalt", ligs["fi"] ) + lt ( false, "fi", 4, 5, "Delfinhalt", ligs["fi"] ) + lt ( false, "fi", 4, 5, "raffinhalt", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finitia", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finjekt", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finkont", ligs["fi"] ) + lt ( false, "fi", 4, 5, "Delfinkont", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnenaus", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnenohr", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnenfl", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnenl", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnenraum", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnenräum", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnens", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finner", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnig", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finnov", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finsass", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finsekt", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finsel", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finserat", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finsign", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finspek", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finsta", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finstinkt", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finstitu", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finstrukt+", ligs["fi"] , "io" ) + lt ( true, "fi", 1, 2, "finstrum", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finsuff", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finszen", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fintars", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fintell", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fintegr", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fintens", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finter", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finton", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fintrig", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finvent", ligs["fi"] ) + lt ( true, "fi", 1, 2, "finvest", ligs["fi"] ) + lt ( true, "fi", 1, 2, "firis", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fironi", ligs["fi"] ) + lt ( true, "fi", 1, 2, "firre", ligs["fi"] ) + lt ( true, "fi", 1, 2, "firru", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fisolat", ligs["fi"] ) + lt ( true, "fi", 1, 2, "fisolie", ligs["fi"] ) + end + if next ( ligs["fl"] ) then + lt ( true, "fl", 3, 4, "Aufl+", ligs["fl"], "aeiouyäöü" ) + lt ( true, "fl", 3, 4, "aufl", ligs["fl"] ) + lt ( false, "fl", 3, 4, "auflair", ligs["fl"] ) + lt ( false, "fl", 3, 4, "aufläche", ligs["fl"] ) + lt ( false, "fl", 3, 4, "aufliegl", ligs["fl"] ) + lt ( false, "fl", 3, 4, "auflüssig", ligs["fl"] ) + lt ( false, "fl", 4, 5, "baufl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Baufl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "bauflösen", ligs["fl"] ) + lt ( false, "fl", 5, 6, "blaufl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "blaufloch", ligs["fl"] ) + lt ( true, "fl", 5, 6, "blauflog", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Blaufl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "fraufl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Fraufl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "gauflöte", ligs["fl"] ) + lt ( false, "fl", 5, 6, "graufl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Graufl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "onauflo", ligs["fl"] ) + lt ( false, "fl", 5, 6, "onauflu", ligs["fl"] ) + lt ( false, "fl", 7, 8, "Moskaufl", ligs["fl"] ) + lt ( false, "fl", 6, 7, "Schauflieg", ligs["fl"] ) + lt ( false, "fl", 6, 7, "Schaufloß", ligs["fl"] ) + lt ( false, "fl", 6, 7, "schauflöß", ligs["fl"] ) + lt ( false, "fl", 6, 7, "Schauflug", ligs["fl"] ) + lt ( false, "fl", 6, 7, "Schauflüg", ligs["fl"] ) + lt ( false, "fl", 6, 7, "schauflieg", ligs["fl"] ) + lt ( false, "fl", 6, 7, "schaufloß", ligs["fl"] ) + lt ( false, "fl", 6, 7, "schauflöß", ligs["fl"] ) + lt ( false, "fl", 6, 7, "schauflug", ligs["fl"] ) + lt ( false, "fl", 6, 7, "schauflüg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Taufliege", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Briefl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "briefl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Chefl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "chefl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "achefl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "ichefl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "schefl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "chefläche", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Dampfl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "dampfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Dorfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "dorfl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "dorfliese", ligs["fl"] ) + lt ( false, "fl", 4, 5, "dorflüg", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Fünfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "fünfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Golfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "golfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Hanfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "hanfl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "thanflamm", ligs["fl"] ) + lt ( true, "fl", 3, 4, "Hofl", ligs["fl"] ) + lt ( true, "fl", 3, 4, "hofl", ligs["fl"] ) + lt ( false, "fl", 3, 4, "hoflosk", ligs["fl"] ) + lt ( true, "fl", 3, 4, "Huflatt", ligs["fl"] ) + lt ( true, "fl", 3, 4, "huflatt", ligs["fl"] ) + lt ( true, "fl", 3, 4, "Hufled", ligs["fl"] ) + lt ( true, "fl", 3, 4, "hufled", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Impfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "impfla", ligs["fl"] ) + lt ( false, "fl", 5, 6, "eimpflanz", ligs["fl"] ) + lt ( true, "fl", 4, 5, "impfle", ligs["fl"] ) + lt ( false, "fl", 5, 6, "eimpfleg", ligs["fl"] ) + lt ( false, "fl", 5, 6, "timpfleg", ligs["fl"] ) + lt ( true, "fl", 4, 5, "impflücke", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Kampfl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "kampfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Kopfl+", ligs["fl"], "äeioöuüy" ) + lt ( true, "fl", 4, 5, "kopfl+", ligs["fl"], "äeioöuüy" ) + lt ( true, "fl", 4, 5, "Köpfl+", ligs["fl"], "aäioöuüy" ) + lt ( true, "fl", 4, 5, "köpfl+", ligs["fl"], "aäioöuüy" ) + lt ( true, "fl", 3, 4, "opfla", ligs["fl"] ) + lt ( false, "fl", 4, 5, "kopflaster", ligs["fl"] ) + lt ( false, "fl", 4, 5, "kopfleg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "kopflaum", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Pfeifl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "pfeifl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Pfiffl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "pfiffl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Prüfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "prüfl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "Reliefl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "reliefl", ligs["fl"] ) + lt ( true, "fl", 3, 4, "Rufl", ligs["fl"] ) + lt ( true, "fl", 3, 4, "rufl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Durufl", ligs["fl"] ) + lt ( false, "fl", 6, 7, "mbarufl", ligs["fl"] ) + lt ( false, "fl", 3, 4, "ruflagge", ligs["fl"] ) + lt ( false, "fl", 3, 4, "rufleisch", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Schafl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "schafl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "Schiefl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "schiefl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "Schilfl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "schilfl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "Schlafl", ligs["fl"] ) + lt ( true, "fl", 6, 7, "schlafl", ligs["fl"] ) + lt ( true, "fl", 7, 8, "Schleifl", ligs["fl"] ) + lt ( true, "fl", 7, 8, "schleifl", ligs["fl"] ) + lt ( true, "fl", 8, 9, "Schrumpfl", ligs["fl"] ) + lt ( true, "fl", 8, 9, "schrumpfl", ligs["fl"] ) + lt ( true, "fl", 7, 8, "Schweifl", ligs["fl"] ) + lt ( true, "fl", 7, 8, "schweifl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Senfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "senfl+", ligs["fl"], "aä" ) + lt ( true, "fl", 5, 6, "Steifl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "steifl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Strafl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "strafl", ligs["fl"] ) + lt ( true, "fl", 7, 8, "Strumpfl", ligs["fl"] ) + lt ( true, "fl", 7, 8, "strumpfl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Sumpfl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "sumpfl", ligs["fl"] ) + lt ( false, "fl", 6, 7, "nsumpfl", ligs["fl"] ) + lt ( false, "fl", 6, 7, "isumpfl", ligs["fl"] ) + lt ( false, "fl", 6, 7, "ssumpfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Surfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "surfl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "surfleck", ligs["fl"] ) + lt ( false, "fl", 4, 5, "surflüg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "surflüss", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Tarifl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "tarifl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Tiefl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "tiefl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "tiefläche", ligs["fl"] ) + lt ( false, "fl", 5, 6, "atieflaute", ligs["fl"] ) + lt ( false, "fl", 5, 6, "atieflut", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Topfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "topfl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Topflagg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Topflitz", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Topflor", ligs["fl"] ) + lt ( false, "fl", 5, 6, "rtopfli", ligs["fl"] ) + lt ( false, "fl", 4, 5, "topfläch", ligs["fl"] ) + lt ( false, "fl", 4, 5, "topfleg", ligs["fl"] ) + lt ( true, "fl", 5, 6, "rtopfleg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "topflop", ligs["fl"] ) + lt ( false, "fl", 4, 5, "topflug", ligs["fl"] ) + lt ( false, "fl", 4, 5, "topflüg", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Torfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "torfl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Torflagge", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Torflügel", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Torflut", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torfläche", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflasch", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflieg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflimm", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflitz", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torfloss", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflott", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torfluch", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflug", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflüg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torflüss", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torfluss", ligs["fl"] ) + lt ( false, "fl", 4, 5, "torfluß", ligs["fl"] ) + lt ( true, "fl", 5, 6, "Tropfl", ligs["fl"] ) + lt ( true, "fl", 5, 6, "tropfl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "tropflug", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Wurfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "wurfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Würfl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "würfl", ligs["fl"] ) + lt ( true, "fl", 3, 4, "alflede", ligs["fl"] ) + lt ( true, "fl", 2, 3, "aflied", ligs["fl"] ) + lt ( true, "fl", 2, 3, "aflos", ligs["fl"] ) + lt ( false, "fl", 2, 3, "aflosk", ligs["fl"] ) + lt ( false, "fl", 3, 4, "rafloss", ligs["fl"] ) + lt ( true, "fl", 2, 3, "aflück", ligs["fl"] ) + lt ( true, "fl", 4, 5, "ampfl+", ligs["fl"], "aäou" ) + lt ( false, "fl", 4, 5, "ampfläch", ligs["fl"] ) + lt ( false, "fl", 4, 5, "ampflanz", ligs["fl"] ) + lt ( false, "fl", 4, 5, "ampfleg", ligs["fl"] ) + lt ( true, "fl", 3, 4, "arflad", ligs["fl"] ) + lt ( true, "fl", 3, 4, "äufle", ligs["fl"] ) + lt ( true, "fl", 3, 4, "eufle", ligs["fl"] ) + lt ( false, "fl", 3, 4, "eufleiß", ligs["fl"] ) + lt ( false, "fl", 3, 4, "eufleiss", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flaberer", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flabor", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flage", ligs["fl"] ) + lt ( false, "fl", 3, 4, "siflage", ligs["fl"] ) + lt ( false, "fl", 3, 4, "ouflage", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flagun", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flähm", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flaminat", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flamp", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fland", ligs["fl"] ) + lt ( false, "fl", 1, 2, "flandern", ligs["fl"] ) + lt ( false, "fl", 1, 2, "flandrisch", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fländ", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fläng", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flapp", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flärm", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flauf", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fläuf", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flaun", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fleb", ligs["fl"] ) + lt ( false, "fl", 4, 5, "huffleb", ligs["fl"] ) + lt ( true, "fl", 3, 4, "alfleder", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flehn", ligs["fl"] ) + lt ( false, "fl", 2, 3, "nflehn", ligs["fl"] ) + lt ( false, "fl", 2, 3, "rflehn", ligs["fl"] ) + lt ( false, "fl", 3, 4, "Hoflehn", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flehr", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fleiden", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flein", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fleist", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fleit", ligs["fl"] ) + lt ( false, "fl", 6, 7, "Kaltefleiter", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flektür", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fler", ligs["fl"] ) + lt ( false, "fl", 4, 5, "Hoefler", ligs["fl"] ) + lt ( false, "fl", 7, 8, "Knoepffler", ligs["fl"] ) + lt ( false, "fl", 2, 3, "fflerhyth", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fleut", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flich", ligs["fl"] ) + lt ( false, "fl", 1, 2, "flicht", ligs["fl"] ) + lt ( true, "fl", 3, 4, "öpflicht", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flieb", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flief", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flift", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flig", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flila", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flinde", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fling", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Bempfling", ligs["fl"] ) + lt ( false, "fl", 3, 4, "Haflinge", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flini", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flinse", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flisch", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flist", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fliter", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flizenz", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flobby", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flöch", ligs["fl"] ) + lt ( false, "fl", 1, 2, "flöchte", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flöff", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flohn", ligs["fl"] ) + lt ( false, "fl", 1, 2, "flohnetz", ligs["fl"] ) + lt ( false, "fl", 3, 4, "ntflohn", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flöhn", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flok", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flord", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flösch", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flösu", ligs["fl"] ) + lt ( true, "fl", 1, 2, "fluft", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flung", ligs["fl"] ) + lt ( true, "fl", 1, 2, "flust", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Gipfle", ligs["fl"] ) + lt ( true, "fl", 4, 5, "gipfle", ligs["fl"] ) + lt ( true, "fl", 5, 6, "chopfl", ligs["fl"] ) + lt ( true, "fl", 2, 3, "lflady", ligs["fl"] ) + lt ( true, "fl", 2, 3, "lflast", ligs["fl"] ) + lt ( true, "fl", 2, 3, "lflos", ligs["fl"] ) + lt ( false, "fl", 2, 3, "lfloss", ligs["fl"] ) + lt ( false, "fl", 2, 3, "lflosk", ligs["fl"] ) + lt ( true, "fl", 2, 3, "nflehm", ligs["fl"] ) + lt ( true, "fl", 2, 3, "oflad", ligs["fl"] ) + lt ( true, "fl", 2, 3, "ofläd", ligs["fl"] ) + lt ( true, "fl", 2, 3, "oflück", ligs["fl"] ) + lt ( false, "fl", 4, 5, "gopflaum", ligs["fl"] ) + lt ( false, "fl", 4, 5, "iopflast", ligs["fl"] ) + lt ( false, "fl", 4, 5, "nopflaster", ligs["fl"] ) + lt ( false, "fl", 3, 4, "opflair", ligs["fl"] ) + lt ( false, "fl", 3, 4, "opflanz", ligs["fl"] ) + lt ( true, "fl", 3, 4, "öpfle", ligs["fl"] ) + lt ( true, "fl", 3, 4, "orflad", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflaut", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pfleier", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflehm", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pfleis", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pfleu", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflid", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflied", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pfloch", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflos", ligs["fl"] ) + lt ( false, "fl", 2, 3, "pfloss", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflös", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflup", ligs["fl"] ) + lt ( true, "fl", 2, 3, "pflux", ligs["fl"] ) + lt ( true, "fl", 2, 3, "rfläd", ligs["fl"] ) + lt ( true, "fl", 2, 3, "rflück", ligs["fl"] ) + lt ( true, "fl", 2, 3, "rfluke", ligs["fl"] ) + lt ( true, "fl", 4, 5, "reifl", ligs["fl"] ) + lt ( true, "fl", 4, 5, "Reifl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Breifl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "breifl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Dreifl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "dreifl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "Freifl", ligs["fl"] ) + lt ( false, "fl", 5, 6, "freifl", ligs["fl"] ) + lt ( false, "fl", 7, 8, "eiereifl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reifläch", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reiflagg", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reiflamm", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reiflasch", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reiflies", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reiflock", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reifloh", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reiflöhe", ligs["fl"] ) + lt ( false, "fl", 4, 5, "reiflott", ligs["fl"] ) + lt ( true, "fl", 3, 4, "Tafle", ligs["fl"] ) + lt ( true, "fl", 3, 4, "tafle", ligs["fl"] ) + lt ( false, "fl", 3, 4, "tafleck", ligs["fl"] ) + lt ( false, "fl", 3, 4, "taflege", ligs["fl"] ) + lt ( true, "fl", 3, 4, "urflad", ligs["fl"] ) + lt ( true, "fl", 3, 4, "ürfla", ligs["fl"] ) + lt ( true, "fl", 3, 4, "urfloch", ligs["fl"] ) + lt ( true, "fl", 3, 4, "ürfloch", ligs["fl"] ) + lt ( true, "fl", 3, 4, "wafle", ligs["fl"] ) + lt ( true, "fl", 3, 4, "wefle", ligs["fl"] ) + lt ( true, "fl", 4, 5, "weifle", ligs["fl"] ) + lt ( false, "fl", 4, 5, "weifleck", ligs["fl"] ) + lt ( true, "fl", 4, 5, "werfl", ligs["fl"] ) + lt ( false, "fl", 6, 7, "chwerfl", ligs["fl"] ) + lt ( false, "fl", 4, 5, "werflitz", ligs["fl"] ) + end + if next ( ligs["ffi"] ) then + lt ( true, "ff", 2, 3, "affind", ligs["ffi"] ) + lt ( false, "ff", 4, 5, "araffind", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffibel", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffieb", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffigu", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffilm", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffilter", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffinal", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffinte", ligs["ffi"] ) + lt ( false, "ff", 3, 4, "raffinte", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffinanz", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffistel", ligs["ffi"] ) + lt ( true, "ff", 1, 2, "ffixier", ligs["ffi"] ) + lt ( true, "ff", 2, 3, "iffind", ligs["ffi"] ) + lt ( true, "ff", 2, 3, "lffing", ligs["ffi"] ) + lt ( true, "ff", 2, 3, "lffisch", ligs["ffi"] ) + lt ( true, "ff", 2, 3, "nffing", ligs["ffi"] ) + lt ( true, "ff", 2, 3, "pffi", ligs["ffi"] ) + lt ( true, "ff", 4, 5, "reiffing", ligs["ffi"] ) + lt ( true, "fi", 5, 6, "Stoffi", ligs["ffi"] ) + lt ( true, "fi", 5, 6, "stoffi", ligs["ffi"] ) + lt ( false, "fi", 5, 6, "stoffiz", ligs["ffi"] ) + lt ( false, "fi", 5, 6, "stoffig", ligs["ffi"] ) + lt ( true, "fi", 2, 3, "ffinnen", ligs["ffi"] ) + end + if next ( ligs["ffl"] ) then + lt ( true, "fl", 5, 6, "Griffl", ligs["ffl"] ) + lt ( true, "fl", 5, 6, "griffl", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "Offline", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "offline", ligs["ffl"] ) + lt ( true, "fl", 5, 6, "Pfiffl", ligs["ffl"] ) + lt ( true, "fl", 6, 7, "Scheffle", ligs["ffl"] ) + lt ( true, "fl", 6, 7, "scheffle", ligs["ffl"] ) + lt ( true, "fl", 6, 7, "Schiffl", ligs["ffl"] ) + lt ( true, "fl", 6, 7, "schiffl", ligs["ffl"] ) + lt ( true, "fl", 5, 6, "Stoffl", ligs["ffl"] ) + lt ( true, "fl", 5, 6, "stoffl", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "afflu", ligs["ffl"] ) + lt ( true, "fl", 2, 3, "fflamell", ligs["ffl"] ) + lt ( true, "fl", 2, 3, "fflast", ligs["ffl"] ) + lt ( true, "fl", 2, 3, "fflatsch", ligs["ffl"] ) + lt ( true, "fl", 2, 3, "ffloch", ligs["ffl"] ) + lt ( true, "fl", 2, 3, "fflos", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "ifflo", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "offlad", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "öffle", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "offlo", ligs["ffl"] ) + lt ( true, "fl", 4, 5, "pufflack", ligs["ffl"] ) + lt ( true, "fl", 4, 5, "taffle", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "ufflad", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "uffläd", ligs["ffl"] ) + lt ( true, "fl", 4, 5, "luffleck", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "äffle", ligs["ffl"] ) + lt ( true, "fl", 3, 4, "üffle", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "Auffl", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "auffl", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "eiffleck", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflatter", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "ffläch", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflech", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "ffleisch", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflexib", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflies", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflimm", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "ffluch", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflüch", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflug", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflüg", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflur", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "ffluss", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflüs", ligs["ffl"] ) + lt ( true, "ff", 1, 2, "fflut", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "iefflieg", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "iefflog", ligs["ffl"] ) + lt ( true, "ff", 2, 3, "lfflach", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "mpffl", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "opffl", ligs["ffl"] ) + lt ( true, "ff", 3, 4, "upffl", ligs["ffl"] ) + lt ( true, "ff", 2, 3, "rfflad", ligs["ffl"] ) + lt ( true, "ff", 2, 3, "rfflasch", ligs["ffl"] ) + lt ( true, "ff", 4, 5, "wurffl", ligs["ffl"] ) + end + if next ( ligs["ft"] ) then + lt ( true, "ft", 3, 4, "Auft+", ligs["ft"] , "aähioöruüy" ) + lt ( true, "ft", 3, 4, "auft+", ligs["ft"] , "aähioöruüy" ) + lt ( true, "ft", 5, 6, "Brieft", ligs["ft"] ) + lt ( true, "ft", 5, 6, "brieft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Cheft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "cheft+", ligs["ft"] , "abcdefghijklmnopqrstuvwxyzäöü" ) + lt ( false, "ft", 7, 8, "omicheft+", ligs["ft"] , "ceg" ) + lt ( true, "ft", 4, 5, "Dorft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "dorft", ligs["ft"] ) + lt ( true, "ft", 3, 4, "Elfte", ligs["ft"] ) + lt ( true, "ft", 3, 4, "elfte", ligs["ft"] ) + lt ( false, "ft", 3, 4, "elfterfolg", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Fünft+", ligs["ft"] , "aäeoöruy" ) + lt ( true, "ft", 4, 5, "fünft+", ligs["ft"] , "aäeoöruy" ) + lt ( false, "ft", 4, 5, "fünfterfolg", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Fünfterfolg", ligs["ft"] ) + lt ( false, "ft", 4, 5, "fünftrang", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Fünftrang", ligs["ft"] ) + lt ( false, "ft", 4, 5, "fünftreich", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Fünftreich", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Fünftoper", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Fünftrund", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Fünftäon", ligs["ft"] ) + lt ( false, "ft", 4, 5, "fünftältest", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Fünftältest", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Golft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "golft+", ligs["ft"] , "hiruüy" ) + lt ( true, "ft", 5, 6, "Greift+", ligs["ft"] , "eio" ) + lt ( true, "ft", 4, 5, "Hanftau", ligs["ft"] ) + lt ( true, "ft", 3, 4, "Hoft+", ligs["ft"] , "aäehioöruüy" ) + lt ( true, "ft", 3, 4, "hoft+", ligs["ft"] , "aähioöruü" ) + lt ( true, "ft", 3, 4, "Huftra", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Kopft+", ligs["ft"] , "aäehioöruüy" ) + lt ( true, "ft", 4, 5, "Laufte", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Prüft+", ligs["ft"] , "aähioöruüy" ) + lt ( true, "ft", 4, 5, "prüft+", ligs["ft"] , "aähioöruü" ) + lt ( true, "ft", 3, 4, "Ruft+", ligs["ft"] , "aäehioöruüy" ) + lt ( true, "ft", 5, 6, "Schaftal", ligs["ft"] ) + lt ( true, "ft", 5, 6, "Schaftor", ligs["ft"] ) + lt ( true, "ft", 5, 6, "Schaftreib", ligs["ft"] ) + lt ( true, "ft", 5, 6, "schaftal", ligs["ft"] ) + lt ( true, "ft", 5, 6, "schaftor", ligs["ft"] ) + lt ( true, "ft", 5, 6, "schaftreib", ligs["ft"] ) + lt ( true, "ft", 6, 7, "Schlaft", ligs["ft"] ) + lt ( true, "ft", 6, 7, "schlaft+", ligs["ft"] , "aähioöruüy" ) + lt ( true, "ft", 6, 7, "Schilft+", ligs["ft"] , "äehiruüy" ) + lt ( true, "ft", 6, 7, "schilft+", ligs["ft"] , "hiruüy" ) + lt ( true, "ft", 4, 5, "Senft+", ligs["ft"] , "aäehioöruy" ) + lt ( false, "ft", 4, 5, "Senftenberg", ligs["ft"] ) + lt ( true, "ft", 5, 6, "Straft+", ligs["ft"] , "aähioöruüy" ) + lt ( true, "ft", 5, 6, "straft+", ligs["ft"] , "aähioöruüy" ) + lt ( false, "ft", 5, 6, "straftheit", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Sufft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Surft+", ligs["ft"] , "ähiöüy" ) + lt ( true, "ft", 5, 6, "Tarift", ligs["ft"] ) + lt ( true, "ft", 5, 6, "tarift", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Tieft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Torft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "torft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Wurft", ligs["ft"] ) + lt ( true, "ft", 4, 5, "wurft", ligs["ft"] ) + lt ( true, "ft", 2, 3, "fft+", ligs["ft"] , "aähioöruüy" ) + lt ( true, "ft", 8, 9, "Abstreiftest", ligs["ft"] ) + lt ( true, "ft", 6, 7, "Ankauftest", ligs["ft"] ) + lt ( true, "ft", 7, 8, "Hörprüftest", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Hüpftest", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Impftest", ligs["ft"] ) + lt ( true, "ft", 4, 5, "Kauftest", ligs["ft"] ) + lt ( true, "ft", 5, 6, "Klopftest", ligs["ft"] ) + lt ( true, "ft", 5, 6, "Kneiftest", ligs["ft"] ) + lt ( true, "ft", 12, 13, "Lichtschweiftest", ligs["ft"] ) + lt ( true, "ft", 7, 8, "Rückruftest", ligs["ft"] ) + lt ( true, "ft", 7, 8, "Schnupftest", ligs["ft"] ) + lt ( true, "ft", 5, 6, "Sumpftest", ligs["ft"] ) + lt ( true, "ft", 5, 6, "Tropftest", ligs["ft"] ) + lt ( true, "ft", 9, 10, "Wettkampftest", ligs["ft"] ) + lt ( true, "ft", 4, 5, "tofftest", ligs["ft"] ) + lt ( true, "ft", 2, 3, "aftee", ligs["ft"] ) + lt ( true, "ft", 3, 4, "auftee", ligs["ft"] ) + lt ( true, "ft", 4, 5, "lauftest", ligs["ft"] ) + lt ( true, "ft", 3, 4, "eiftie", ligs["ft"] ) + lt ( true, "ft", 3, 4, "eiftit", ligs["ft"] ) + lt ( true, "ft", 3, 4, "eiftr", ligs["ft"] ) + lt ( true, "ft", 5, 6, "elieft", ligs["ft"] ) + lt ( true, "ft", 3, 4, "enftei", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftabell", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftablett", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftafel", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftag", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftagent", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftäg", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftalsg", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftanz", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftanzahl", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftanzeig", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftanzieh", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftanzüg", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftänz", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftari", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftaristokr", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftarn", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftasse", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftassel", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftatb", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftaten", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftätig", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftauch", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftaugl", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftaume", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftax", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteam", ligs["ft"] ) + lt ( false, "ft", 1, 2, "fteamt", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftechn", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftedd", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteich", ligs["ft"] ) + lt ( false, "ft", 2, 3, "nfteich", ligs["ft"] ) + lt ( false, "ft", 2, 3, "ifteich", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteigw", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteil", ligs["ft"] ) + lt ( false, "ft", 1, 2, "fteilfr", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftelef", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteleph", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftelegr", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteller", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftempel", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftemper", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftempo", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftendenz", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftentak", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteppi", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftermin", ligs["ft"] ) + lt ( false, "ft", 1, 2, "fterminder", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftermit", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftermitt", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fterrain", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fterrass", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fterrin", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fterror", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftestat", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftestation", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftestatist", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fteuf", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftext", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftextrakt", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftheat", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fthem", ligs["ft"] ) + lt ( false, "ft", 1, 2, "fthemm", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftheor", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftherap", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftick", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftief", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftiefigur", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftier", ligs["ft"] ) + lt ( false, "ft", 3, 4, "haftier", ligs["ft"] ) + lt ( false, "ft", 3, 4, "Muftier", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftipp", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftirad", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftisch", ligs["ft"] ) + lt ( false, "ft", 4, 5, "stiftisch", ligs["ft"] ) + lt ( false, "ft", 3, 4, "ünftisch", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftod", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftodem", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fton", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftön", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftool", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftopf", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftopfer", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftöpf", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftorig", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftour", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrader", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftradition", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fträg", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrain", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftränk", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftransp", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fträume", ligs["ft"] ) + lt ( false, "ft", 2, 3, "afträume", ligs["ft"] ) + lt ( false, "ft", 2, 3, "äfträume", ligs["ft"] ) + lt ( false, "ft", 3, 4, "rifträume", ligs["ft"] ) + lt ( false, "ft", 2, 3, "ufträume", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrauri", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftreff", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftresor", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftresorp", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftret", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftrett", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftreturn", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrick", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrieb", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrief", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrift", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrimest", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftritt", ligs["ft"] ) + lt ( false, "ft", 1, 2, "ftritter", ligs["ft"] ) + lt ( false, "ft", 3, 4, "Luftritt", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrott", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrüb", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrunk", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftrupp", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftuch", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftüch", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftürk", ligs["ft"] ) + lt ( true, "ft", 1, 2, "fturm", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftürm", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftyp", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftyr", ligs["ft"] ) + lt ( true, "ft", 1, 2, "ftwist", ligs["ft"] ) + lt ( true, "ft", 4, 5, "graftum", ligs["ft"] ) + lt ( true, "ft", 4, 5, "graftüm", ligs["ft"] ) + lt ( true, "ft", 3, 4, "hoftest", ligs["ft"] ) + lt ( true, "ft", 3, 4, "iefta", ligs["ft"] ) + lt ( true, "ft", 3, 4, "iefto", ligs["ft"] ) + lt ( true, "ft", 3, 4, "ieftö", ligs["ft"] ) + lt ( true, "ft", 3, 4, "ieftra", ligs["ft"] ) + lt ( true, "ft", 2, 3, "lfta", ligs["ft"] ) + lt ( true, "ft", 2, 3, "lfto", ligs["ft"] ) + lt ( true, "ft", 2, 3, "lftö", ligs["ft"] ) + lt ( true, "ft", 2, 3, "lftum", ligs["ft"] ) + lt ( true, "ft", 2, 3, "nftü", ligs["ft"] ) + lt ( false, "ft", 2, 3, "nftüb", ligs["ft"] ) + lt ( true, "ft", 2, 3, "nftübchen", ligs["ft"] ) + lt ( true, "ft", 3, 4, "ölfte", ligs["ft"] ) + lt ( true, "ft", 2, 3, "pft+", ligs["ft"] , "aähioöruüy" ) + lt ( false, "ft", 2, 3, "pftheit", ligs["ft"] ) + lt ( true, "ft", 2, 3, "pftee", ligs["ft"] ) + lt ( true, "ft", 2, 3, "pfteig", ligs["ft"] ) + lt ( true, "ft", 2, 3, "pftender", ligs["ft"] ) + lt ( true, "ft", 2, 3, "rftr", ligs["ft"] ) + lt ( false, "ft", 5, 6, "tdurftrö", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Werftr", ligs["ft"] ) + lt ( false, "ft", 4, 5, "werftr", ligs["ft"] ) + lt ( true, "ft", 4, 5, "werftrage", ligs["ft"] ) + lt ( true, "ft", 2, 3, "rftu", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Werftu", ligs["ft"] ) + lt ( false, "ft", 4, 5, "werftu", ligs["ft"] ) + lt ( true, "ft", 2, 3, "uftas", ligs["ft"] ) + lt ( false, "ft", 3, 4, "Duftas", ligs["ft"] ) + lt ( false, "ft", 3, 4, "duftas", ligs["ft"] ) + lt ( false, "ft", 4, 5, "Gruftas", ligs["ft"] ) + lt ( false, "ft", 4, 5, "gruftas", ligs["ft"] ) + lt ( false, "ft", 3, 4, "Luftas", ligs["ft"] ) + lt ( false, "ft", 3, 4, "luftas", ligs["ft"] ) + lt ( false, "ft", 2, 3, "uftassoz", ligs["ft"] ) + lt ( true, "ft", 3, 4, "urfta", ligs["ft"] ) + lt ( false, "ft", 5, 6, "tdurfta", ligs["ft"] ) + lt ( true, "ft", 3, 4, "urfto", ligs["ft"] ) + lt ( true, "ft", 3, 4, "ünftor", ligs["ft"] ) + end + if next ( ligs["fb"] ) then + lt ( true, "fb", 1, 2, "fb", ligs["fb"] ) + end + if next ( ligs["fh"] ) then + lt ( true, "fh", 1, 2, "fh", ligs["fh"] ) + end + if next ( ligs["fk"] ) then + lt ( true, "fk", 1, 2, "fk", ligs["fk"] ) + lt ( false, "fk", 3, 4, "Kafka", ligs["fk"] ) + lt ( false, "fk", 3, 4, "kafka", ligs["fk"] ) + lt ( false, "fk", 4, 5, "Piefke", ligs["fk"] ) + lt ( false, "fk", 4, 5, "piefkei", ligs["fk"] ) + lt ( false, "fk", 3, 4, "Safka", ligs["fk"] ) + lt ( false, "fk", 6, 7, "Potrafke", ligs["fk"] ) + lt ( false, "fk", 5, 6, "Sprafke", ligs["fk"] ) + lt ( false, "fk", 6, 7, "Shirafkan", ligs["fk"] ) + lt ( false, "fk", 5, 6, "Tirafkan", ligs["fk"] ) + lt ( false, "fk", 4, 5, "Selfkant", ligs["fk"] ) + lt ( false, "fk", 3, 4, "Rifkin", ligs["fk"] ) + end + if next ( ligs["fj"] ) then + lt ( true, "fj", 1, 2, "fj", ligs["fj"] ) + lt ( false, "fj", 1, 2, "fjord", ligs["fj"] ) + lt ( false, "fj", 1, 2, "fjör", ligs["fj"] ) + lt ( false, "fj", 4, 5, "Ísafjarðarbær", ligs["fj"] ) + lt ( false, "fj", 1, 2, "fjell", ligs["fj"] ) + lt ( false, "fj", 1, 2, "fjall", ligs["fj"] ) + lt ( false, "fj", 1, 2, "fjäll", ligs["fj"] ) + lt ( false, "fj", 1, 2, "fjöll", ligs["fj"] ) + lt ( false, "fj", 6, 7, "Prokofjew", ligs["fj"] ) + lt ( false, "fj", 3, 4, "Sufjan", ligs["fj"] ) + lt ( false, "fj", 3, 4, "Eefje", ligs["fj"] ) + lt ( false, "fj", 5, 6, "Astafjew", ligs["fj"] ) + end + if next ( ligs["fff"] ) then + lt ( true, "ff", 2, 3, "fff", ligs["fff"] ) + end + end + for _, value in ipairs ( lig_table ) do + lt ( value[1], value[2], value[3], value[4], value[5], ligs[value[2]], value[6] ) + end + end +end + +local function no_ligs ( head ) + local ligs = get_ligs ( head ) + local string_table = { "ff", "fi", "fl", "ft", "fb", "fh", "fk", "fj" } + local lig_check = {} + for _, value in pairs ( lig_table ) do + lig_check[value[2]] = true + end + for key, value in pairs ( lig_check ) do + if value then + string_table[#string_table + 1] = key + end + end + for _, value in pairs ( string_table ) do + no_lig ( true, value, 1, 2, value, head, ligs[value] ) + end +end + +function ligtype_write_ligs ( s ) + ATC ( "ligaturing", no_ligs, "no ligs" ) + local lig_check = {} + for _, value in pairs ( lig_table ) do + lig_check[value[2]] = true + end + local ligs_string = "ff fi fl ft fb fh fk fj" + for key, value in pairs ( lig_check ) do + if value and not FIND ( ligs_string, key ) then + ligs_string = ligs_string .. " " .. key + end + end + local par_end = [[\par\addvspace{\baselineskip}]] + tex.sprint ( [[\newpage{}\pagestyle{empty}\parindent=0em{}]] .. ligs_string .. par_end .. [[\textbf{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{\textbf{]] .. ligs_string .. [[}}]] .. par_end .. [[{\sffamily{}]] .. ligs_string .. par_end .. [[\textbf{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{]] .. ligs_string .. [[}]] .. par_end .. [[\textit{\textbf{]] .. ligs_string .. [[}}]] .. par_end .. [[}\newpage{}]] ) +end + +function ligtype_make_marks () + make_marks = true + ATC ( "post_linebreak_filter", place_marks, "place marks postline" ) + ATC ( "hpack_filter", place_marks, "place marks hpack" ) +end + +function ligtype_on () + ATC ( "ligaturing", lig_parse, "make and break ligatures" ) + ATC ( "pre_linebreak_filter", make_kern, "make kerns preline" ) + ATC ( "hpack_filter", make_kern, "make kerns hpack", 2 ) +end + +function ligtype_off () + RFC ( "ligaturing", "make and break ligatures" ) + RFC ( "pre_linebreak_filter", "make kerns preline" ) + RFC ( "hpack_filter", "make kerns hpack" ) end
\ No newline at end of file diff --git a/macros/luatex/latex/ligtype/ligtype.pdf b/macros/luatex/latex/ligtype/ligtype.pdf Binary files differindex 96d8973225..98eb766816 100644 --- a/macros/luatex/latex/ligtype/ligtype.pdf +++ b/macros/luatex/latex/ligtype/ligtype.pdf diff --git a/macros/luatex/latex/ligtype/ligtype.sty b/macros/luatex/latex/ligtype/ligtype.sty index f98ec53fdc..3cf84a67f0 100644 --- a/macros/luatex/latex/ligtype/ligtype.sty +++ b/macros/luatex/latex/ligtype/ligtype.sty @@ -1,53 +1,53 @@ -% Copyright (c) 2022 Thomas Kelkel kelkel@emaileon.de
-
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either
-% version 1.3c of this license or (at your option) any later
-% version. The latest version of this license is in
-
-% http://www.latex-project.org/lppl.txt
-
-% and version 1.3c or later is part of all distributions of
-% LaTeX version 2009/09/24 or later.
-
-% The ligtype package makes use of the German language
-% ligature suppression rules of the selnolig package by
-% Mico Loretan. The selnolig package can be downloaded at
-
-% https://www.ctan.org/pkg/selnolig
-
-% and may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License.
-
-\ProvidesPackage{ligtype}[2022/06/11 v0.1a Comprehensive ligature suppression functionalities]
-\RequirePackage{ifluatex,luatexbase}
-
-\ifluatex
- \directlua{require ( "ligtype.lua" )}
-
- \def\ligtypeon{\directlua{ligtype_on()}}
- \def\ligtypeoff{\directlua{ligtype_off()}}
-
- \ligtypeon
-
- \newcommand\nolig[2]{%
- \directlua{%
- ligtype_parse_macro ( "\luatexluaescapestring{#1}", "\luatexluaescapestring{#2}", true )%
- }%
- }
- \newcommand\keeplig[2]{%
- \directlua{%
- ligtype_parse_macro ( "\luatexluaescapestring{#1}", "\luatexluaescapestring{#2}", false )%
- }%
- }
-
- \DeclareOption{noshortf}{\directlua{ligtype_no_short_f()}}
- \DeclareOption{allshortf}{\directlua{ligtype_all_short_f()}}
- \DeclareOption{makemarks}{\directlua{ligtype_make_marks()}}
- \DeclareOption{kerntest}{\AtEndDocument{\directlua{ligtype_write_ligs()}}}
- \DeclareOption{nodefault}{\directlua{ligtype_no_default()}}
- \ProcessOptions
-\else
- \errhelp{Compile with LuaLaTeX to be able to use the "ligtype" package.}
- \errmessage{Package "ligtype" error: This package requires LuaLaTeX!}
+% Copyright (c) 2022 Thomas Kelkel kelkel@emaileon.de + +% This file may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3c of this license or (at your option) any later +% version. The latest version of this license is in + +% http://www.latex-project.org/lppl.txt + +% and version 1.3c or later is part of all distributions of +% LaTeX version 2009/09/24 or later. + +% The ligtype package makes use of the German language +% ligature suppression rules of the selnolig package by +% Mico Loretan. The selnolig package can be downloaded at + +% https://www.ctan.org/pkg/selnolig + +% and may be distributed and/or modified under the +% conditions of the LaTeX Project Public License. + +\ProvidesPackage{ligtype}[2022/06/13 v0.1b Comprehensive ligature suppression functionalities] +\RequirePackage{ifluatex,luatexbase} + +\ifluatex + \directlua{require ( "ligtype.lua" )} + + \def\ligtypeon{\directlua{ligtype_on()}} + \def\ligtypeoff{\directlua{ligtype_off()}} + + \ligtypeon + + \newcommand\nolig[2]{% + \directlua{% + ligtype_parse_macro ( "\luatexluaescapestring{#1}", "\luatexluaescapestring{#2}", true )% + }% + } + \newcommand\keeplig[2]{% + \directlua{% + ligtype_parse_macro ( "\luatexluaescapestring{#1}", "\luatexluaescapestring{#2}", false )% + }% + } + + \DeclareOption{noshortf}{\directlua{ligtype_no_short_f()}} + \DeclareOption{allshortf}{\directlua{ligtype_all_short_f()}} + \DeclareOption{makemarks}{\directlua{ligtype_make_marks()}} + \DeclareOption{kerntest}{\AtEndDocument{\directlua{ligtype_write_ligs()}}} + \DeclareOption{nodefault}{\directlua{ligtype_no_default()}} + \ProcessOptions +\else + \errhelp{Compile with LuaLaTeX to be able to use the "ligtype" package.} + \errmessage{Package "ligtype" error: This package requires LuaLaTeX!} \fi
\ No newline at end of file diff --git a/macros/luatex/latex/ligtype/ligtype.tex b/macros/luatex/latex/ligtype/ligtype.tex index 8769a94f57..e122531415 100644 --- a/macros/luatex/latex/ligtype/ligtype.tex +++ b/macros/luatex/latex/ligtype/ligtype.tex @@ -1,496 +1,496 @@ -\documentclass[
-ukenglish,%
-twoside=false,%
-fontsize=10pt,%
-bibliography=totoc,%
-numbers=autoenddot,%
-headings=normalsize,%
-overfullrule,%
-headings=optiontotoc,%
-]
-{scrartcl}
-
-\makeatletter
-\providecommand\@ix{9.6}
-\providecommand\@xi{10.4}
-\providecommand\@xiii{13.15}
-\def\subfootnotesize{%
- \@setfontsize%
- \subfootnotesize%
- {7.6}{8}%
-}
-\def\supernormalsize{%
- \@setfontsize%
- \supernormalsize%
- \@xi{12}%
-}
-\def\subnormalsize{%
- \@setfontsize%
- \subnormalsize%
- \@ix{11}%
-}
-\def\sublarge{%
- \@setfontsize%
- \sublarge%
- {11.2}{13}%
-}
-\def\superlarge{%
- \@setfontsize%
- \superlarge%
- \@xiii{16}%
-}
-\makeatother
-
-\newcommand*{\sectionas}{2.3ex plus .2ex}
-\newcommand*{\sectionbs}{-3.5ex plus -1ex minus -.2ex}
-\newcommand*{\sectiontbs}{3.6pt}
-\newcommand*{\subsectiontbs}{1.2pt}
-\newcommand*{\subsectionas}{1.5ex plus .2ex}
-\newcommand*{\subsectionbs}{-3.25ex plus -1ex minus -.2ex}
-\newcommand*{\subsubsectionas}{\subsectionas}
-\newcommand*{\subsubsectionbs}{\subsectionbs}
-\newcommand*{\paragraphas}{-1em}
-\newcommand*{\paragraphbs}{.8\baselineskip}
-
-\newlength{\tnwsection}
-\newlength{\tnwsubsection}
-\newlength{\tnwsubsubsection}
-\newlength{\tnwparagraph}
-\newlength{\tisection}
-\newlength{\tisubsection}
-\newlength{\tisubsubsection}
-\newlength{\tiparagraph}
-
-\setlength{\tnwsection}{1.2em}
-\addtolength{\tnwsection}{.6em}
-\setlength{\tnwsubsection}{\tnwsection}
-\addtolength{\tnwsubsection}{.75em}
-\setlength{\tnwsubsubsection}{\tnwsubsection}
-\addtolength{\tnwsubsubsection}{.75em}
-\setlength{\tnwparagraph}{\tnwsubsubsection}
-\addtolength{\tnwparagraph}{.75em}
-
-\setlength{\tisection}{0em}
-\setlength{\tisubsection}{\tisection}
-\addtolength{\tisubsection}{\tnwsection}
-\setlength{\tisubsubsection}{\tisubsection}
-\addtolength{\tisubsubsection}{\tnwsubsection}
-\setlength{\tiparagraph}{\tisubsubsection}
-\addtolength{\tiparagraph}{\tnwsubsubsection}
-
-\RedeclareSectionCommands[%
- tocraggedentrytext=true,%
-]%
-{section,subsection,subsubsection,paragraph}
-
-\RedeclareSectionCommand[%
- tocindent=\tisection,%
- tocnumwidth=\tnwsection,%
- tocbeforeskip=\sectiontbs,%
- tocentryformat=\supernormalsize\sffamily\bfseries,%
- tocentrynumberformat=\supernormalsize\sffamily\bfseries,%
- tocpagenumberformat=\supernormalsize\sffamily\bfseries%
-]%
-{section}
-
-\RedeclareSectionCommand[%
- tocindent=\tisubsection,%
- tocnumwidth=\tnwsubsection,%
- tocbeforeskip=\subsectiontbs,%
- tocentryformat=\subnormalsize,%
- tocentrynumberformat=\subnormalsize,%
- tocpagenumberformat=\subnormalsize%
-]%
-{subsection}
-
-\RedeclareSectionCommand[%
- tocindent=\tisubsubsection,%
- tocnumwidth=\tnwsubsubsection,%
- tocbeforeskip=\sectiontbs%
-]%
-{subsubsection}
-
-\RedeclareSectionCommand[%
- afterskip=\paragraphas,%
- beforeskip=\paragraphbs,%
- tocindent=\tiparagraph,%
- tocnumwidth=\tnwparagraph,%
- tocbeforeskip=\sectiontbs%
-]%
-{paragraph}
-
-\linespread{1.1}
-
-\newcommand*{\hs}{\hspace{.45em}}
-
-\usepackage{fontspec}
-
-\directlua{
-
- fonts.handlers.otf.addfeature {
- name = "onumkern",
- type = "kern",
- data = {
- ["v"] = { ["zero.taboldstyle"] = 80 },
- ["two.taboldstyle"] = { ["zero.taboldstyle"] = 30, ["/"] = 50 },
- ["five.taboldstyle"] = { ["/"] = 20 },
- ["»"] = { ["I"] = 50 },
- },
- }
-
-}
-
-\setmainfont{Tangent}[
- BoldFont = *-Medium,
- ItalicFont = *-Italic,
- Ligatures = {Common, TeX},
- Numbers = OldStyle,
- RawFeature = +onumkern
-]
-
-\setsansfont{SegoeUI}[
- BoldFont = seguisb.ttf,
- Ligatures = {Discretionary, TeX},
- Numbers = OldStyle
-]
-
-\setmonofont{Consolas}[
- ItalicFont = *-Italic,
- Numbers = OldStyle
-]
-
-\newcommand*{\mono}[1]{%
- {\subnormalsize\texttt{#1}}%
-}
-
-\newcommand*{\monofn}[1]{%
- {\subfootnotesize\texttt{#1}}%
-}
-
-\usepackage{babel}
-\usepackage{realscripts}
-\usepackage[paper=a4paper,marginratio={2:1,3:4}]{geometry}
-\usepackage[noshortf,makemarks]{ligtype}
-\usepackage{spacekern}
-\usepackage{hyperref}
-\usepackage{bookmark}
-\usepackage{microtype}
-
-\hypersetup{%
- pdflang=en,%
- unicode=true,%
- pdfborder={0 0 0},%
- bookmarksopen=true,%
- bookmarksopenlevel=0,%
- bookmarksnumbered=true,%
- pdftitle={The ligtype package},
- pdfsubject={Comprehensive ligature suppression functionalities},
- pdfauthor={Thomas Kelkel},
- pdfkeywords={tex, latex, ligatures}
-}
-
-\setlength{\parindent}{0pt}
-\setlength{\parskip}{.4\baselineskip}
-
-\newcommand*{\q}[1]{%
- ›%
- #1%
- ‹%
-}
-\newcommand*{\qq}[1]{%
- »%
- #1%
- «%
-}
-
-\setlength{\footnotesep}{.8em}
-
-\deffootnote[0em]{0em}{1em}{}
-
-\newcommand*{\fn}[1]{%
- \footnotemark%
- \footnotetext{%
- \textbf{\addfontfeature{Numbers = Lining, BoldFont = Tangent-Bold}\thefootnote}%
- \hs%
- #1%
- }%
-}
-
-\newcommand*{\textnote}[1]{%
- {%
- \ttfamily%
- \char174{}%
- #1%
- \char174{}%
- }%
-}
-
-\usepackage{luacode}
-
-\begin{luacode}
-
-local FLOOR = math.floor
-
-local function round ( num, dec )
- return FLOOR ( num * 10^dec + 0.5 ) / 10^dec
-end
-
-local p_array = {false, false, false, false, false}
-local p_counter = 0
-local ID = node.id
-local NEW = node.new
-local COPY = node.copy
-local REM = node.remove
-local PREV = node.prev
-local NEXT = node.next
-local TAIL = node.tail
-local T_ID = node.traverse_id
-local T_GLYPH = node.traverse_glyph
-local INS_B = node.insert_before
-local GLYPH = ID ( "glyph" )
-local GLUE = ID ( "glue" )
-local KERN = ID ( "kern" )
-local HLIST = ID ( "hlist" )
-local SWAPPED = table.swapped
-local SUBTYPES = node.subtypes
-local SPACESKIP = SWAPPED ( SUBTYPES ("glue") )["spaceskip"]
-local WIDTH = round ( tex.sp ( "1.6em" ), 0 )
-local ipairs = ipairs
-local page_counter = 0
-local INS_A = node.insert_after
-local p_counter_x = 0
-local ATC = luatexbase.add_to_callback
-
-local function make_marks ( head, char, id, array, counter )
- for n in T_GLYPH ( head ) do
- if n.char == char then
- counter = counter + 1
- array[counter] = {false, false, false}
- head = INS_B ( head, n, NEW ( GLYPH ) )
- PREV ( n ).data = id
- local NEXT = n.next
- local inside_counter = 0
- while NEXT.char ~= char do
- inside_counter = inside_counter + 1
- array[counter][inside_counter] = COPY ( NEXT )
- NEXT = NEXT.next
- REM ( head, NEXT.prev )
- end
- head = REM ( head, NEXT )
- head = REM ( head, n )
- end
- end
- return head, array, counter
-end
-
-local function mark_notes ( head )
- head, p_array, p_counter = make_marks ( head, 174, 427956, p_array, p_counter )
- return head
-end
-
-local function make_margin_notes ( head, id, array, counter )
- for n in T_ID ( HLIST, head ) do
- local first_kern = 0
- local first_width = 0
- for glyph_node in T_GLYPH ( n.head ) do
- if glyph_node.data == id then
- counter = counter + 1
- local tail_node = TAIL ( n.head )
- local glue_node = NEW ( GLUE )
- glue_node.subtype = SPACESKIP
- glue_node.width = WIDTH
- local NEXT
- local switch_counter = 1 -- page_counter
- n.head = INS_A ( n.head, TAIL ( n.head ), glue_node )
- if ( switch_counter % 2 == 0 ) then
- NEXT = glue_node
- else
- NEXT = tail_node
- end
- local kern_value = 0
- for _, value in ipairs ( array[counter] ) do
- if value ~= false then
- local NUMBER = COPY ( value )
- n.head = INS_A ( n.head, NEXT, NUMBER)
- if NEXT.next then
- NEXT = NEXT.next
- end
- if NUMBER.width then
- kern_value = kern_value - NUMBER.width
- end
- end
- end
- local kern_node = NEW ( KERN )
- kern_node.kern = kern_value - glue_node.width
- if switch_counter % 2 ~= 0 then
- kern_node.kern = kern_node.kern - tex.hsize + first_kern
- n.head = INS_A ( n.head, tail_node, kern_node )
- end
- if ( switch_counter % 2 == 0 ) and ( first_kern < 0 ) then
- kern_node.kern = kern_node.kern - first_kern + first_width - kern_value
- n.head = INS_A ( n.head, tail_node, kern_node )
- end
- first_kern = kern_node.kern
- first_width = kern_value
- end
- end
- end
- return head, counter
-end
-
-local function make_text_notes ( head )
- page_counter = page_counter + 1
- head, p_counter_x = make_margin_notes ( head, 427956, p_array, p_counter_x )
- return head
-end
-
- ATC ( "ligaturing", mark_notes , "mark notes" )
- ATC ( "pre_output_filter", make_text_notes , "count pages" )
-
-\end{luacode}
-
-\flushbottom
-
-\nolig{ligtype}{lig|type}
-
-\begin{document}
-
-\title{The ligtype package\vspace{.25\baselineskip}\\\superlarge{}Comprehensive ligature suppression functionalities}%
-\author{\sublarge{}Thomas Kelkel\vspace{-.25\baselineskip}\\\sublarge{}kelkel@emaileon.de\vspace{-.25\baselineskip}}%
-\date{\addfontfeature{LetterSpace=2}\sublarge{}2022/06/11\quad{}v0.1a}%
-\maketitle
-
-\ligtypeoff
-
-\tableofcontents
-
-\addvspace{3em}
-\hfill\textit{\qq{I don't think you would ever do this in English}}\par
-\addvspace{-.25\baselineskip}
-\hfill {\small\textbf{David Carlisle}\quad}
-\vspace{-2\baselineskip}
-
-\section{Introduction}
-
-The main feature of this package is the selective suppression of typographic ligatures.
-
-There’s already the \mono{selnolig} package by Mico Loretan providing such capability. However, it has some significant shortcomings that render it barely applicable in many use cases. The \mono{ligtype} package steps in to address these deficiencies. The main improvements are:
-
-\paragraph{Kerning}
-
-The \mono{ligtype} package applies kerning for the glyphs of the suppressed ligatures. Both font and user kerning are applied in the usual way.
-
-\paragraph{Short-armed f}
-
-If available, it automatically replaces the f-glyphs of suppressed ligatures with their short-arm variant.
-
-\paragraph{Speed}
-
-It is about ten times faster on a typical document, thanks to its completely different architecture.\fn{This factor increases with the length of the paragraphs. On a 150-page paragraph, \monofn{ligtype} runs about a hundred times faster.}
-
-\addvspace{\paragraphbs}
-
-Another, rather minor, difference is that it does not require \mono{fontspec}.
-
-\addvspace{\paragraphbs}
-
-\noindent The \mono{ligtype} package provides built-in suppression of inappropriate ligatures for \textbf{\addfontfeature{BoldFont = Tangent-Bold}German language documents.} (\kern.05emFor this purpose it makes use of the corresponding suppression rules provided by the \mono{selnolig} package, which cover all common f-ligatures\fn{Details can be taken from the \monofn{selnolig} documentation.}.) Using the \mono{nodefault} option and the \mono{\textbackslash{}nolig} and \mono{\textbackslash{}keeplig} macros it can also be used for other languages.
-
-Please note that Lua{\addfontfeature{LetterSpace = 2}\LaTeX} is required to use this package.
-
-Finally, a quick word regarding the code: It is optimized for speed throughout. It would have been much easier to provide a significantly shorter, clearer, more straightforward one. Unfortunately, with this software such code would not have been the fastest one.
-
-\section{Basic usage}
-
-To load the package, simply add the following line to the preamble of the document:
-
-\begin{quote}
- \mono{\textbackslash{}usepackage\{ligtype\}}
-\end{quote}
-
-If the glyphs forming the ligatures are already properly kerned and a German language document is typeset, loading the package without any options should be sufficient for most use cases.
-
-However, most of the time it will be the case that the corresponding glyphs have to be kerned first. For this task, the \mono{kerntest} option is extremely helpful.
-
-\section{Package options}
-
-Options can be loaded by adding them comma separated within square brackets:
-
-\begin{quote}
- \mono{\textbackslash{}usepackage[\textit{<option1>,<option2>,…}]\{ligtype\}}
-\end{quote}
-
-\addcontentsline{toc}{subsection}{kerntest}
-
-\textnote{kerntest}This option prints all glyph combinations that comprise the ligatures \mono{ligtype} is looking for in Regular, Italic, Bold and Italic Bold for both the Roman and the Sans font on the last page of the document. This gives you an overview of all kerning pairs that are relevant when breaking ligatures, and you can inspect the kerning values accordingly.
-
-\addcontentsline{toc}{subsection}{makemarks}
-
-\textnote{makemarks}Marks each point where a ligature was suppressed with a blue triangle below the baseline.
-
-\addcontentsline{toc}{subsection}{noshortf}
-
-\textnote{noshortf}Various use cases are conceivable with this option.
-
-It is primarily intended to suppress the use of short-armed f if they are not desired.
-
-In addition, it may be useful to load this option when using fonts that do not offer short-armed f, since there is a small gain in speed if \mono{ligtype} does not look for them.
-
-Finally, this option could be used to prevent \qq{false positives}. (Even though such are not known to occur.)
-
-\addcontentsline{toc}{subsection}{allshortf}
-
-\textnote{allshortf}In some cases it may be desirable to use short-armed f without having different f-glyphs in the document. This option can be used for such purpose, since it replaces all long-armed f with their short-arm variant (if available).
-
-This option has priority over the \mono{noshortf} option, i.\,e. if both are loaded, \mono{allshortf} is applied.
-
-\addcontentsline{toc}{subsection}{nodefault}
-
-\textnote{nodefault}Disables the built-in (German language) suppression rules. With this option and the \mono{\textbackslash{}nolig} and \mono{\textbackslash{}keeplig} macros, \mono{ligtype} can be used for other languages.
-
-\section{Macros}
-
-\addcontentsline{toc}{subsection}{nolig}
-
-\addcontentsline{toc}{subsection}{keeplig}
-
-\textnote{\textbackslash{}nolig}The first macro defines a rule for suppressing ligatures, the second one for keeping them. Both macros take two arguments.\textnote{\textbackslash{}keeplig} The first one specifies the string to search for. In the second, a marker of the breaking point is added to this string using a vertical bar.\fn{The architecture of the \monofn{ligtype} package differs quite significantly from that of the \monofn{selnolig} package. To allow current users of \monofn{selnolig} to continue using existing macros for creating suppression rules as far as possible without changes, the syntax has been largely adopted. For the \monofn{\textbackslash{}nolig} macro it is identical. However, in contrast to the \monofn{selnolig} syntax, the breakpoint must be specified as a second argument for the \monofn{\textbackslash{}keeplig} macros, since \monofn{ligtype} requires this for every rule application.} For example:
-
-\begin{quote}
- \mono{\textbackslash{}nolig\{flich\}\{f|lich\}}\\
- \mono{\textbackslash{}keeplig\{flicht\}\{f|licht\}}
-\end{quote}
-
-A list of alternatives that can be located at the end of the string can be specified within square brackets:
-
-\begin{quote}
- \mono{\textbackslash{}nolig\{Auff[aeiloruyäöü]\}\{Auf|f\}}
-\end{quote}
-
-It is important to note that macros are processed in the order in which they are defined, which means that strings defined later have priority over strings defined earlier. Accordingly, strings defined later should not be included in strings defined earlier, otherwise the earlier ones will have no effect.
-
-\addcontentsline{toc}{subsection}{ligtypeon}
-
-\addcontentsline{toc}{subsection}{ligtypeoff}
-
-\textnote{\textbackslash{}ligtypeon}With the help of these macros the features of the \mono{ligtype} package can be switched on and off within the document.\textnote{\textbackslash{}ligtypeoff}
-
-\section{Acknowledgements}
-
-The \mono{ligtype} package makes use of the German language ligature suppression rules of the \mono{selnolig} package by Mico Loretan. The \mono{selnolig} package can be downloaded at
-
-\begin{quote}
- \mono{https://www.ctan.org/pkg/selnolig}
-\end{quote}
-
-and may be distributed and/or modified under the conditions of the LaTeX Project Public License.
-
-Please see the \qq{License and acknowledgments} section of the \mono{selnolig} documentation to learn about all the people who contributed to the creation of the suppression rules.
-
-In general, the truly excellent \mono{selnolig} documentation is highly recommended for further information on the subject of this package.
-
-\section{License}
-
-This package is copyright © 2022 Thomas Kelkel. It may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this license or (at your option) any later version. This work has the LPPL maintenance status \qq{author maintained}.
-
+\documentclass[ +ukenglish,% +twoside=false,% +fontsize=10pt,% +bibliography=totoc,% +numbers=autoenddot,% +headings=normalsize,% +overfullrule,% +headings=optiontotoc,% +] +{scrartcl} + +\makeatletter +\providecommand\@ix{9.6} +\providecommand\@xi{10.4} +\providecommand\@xiii{13.15} +\def\subfootnotesize{% + \@setfontsize% + \subfootnotesize% + {7.6}{8}% +} +\def\supernormalsize{% + \@setfontsize% + \supernormalsize% + \@xi{12}% +} +\def\subnormalsize{% + \@setfontsize% + \subnormalsize% + \@ix{11}% +} +\def\sublarge{% + \@setfontsize% + \sublarge% + {11.2}{13}% +} +\def\superlarge{% + \@setfontsize% + \superlarge% + \@xiii{16}% +} +\makeatother + +\newcommand*{\sectionas}{2.3ex plus .2ex} +\newcommand*{\sectionbs}{-3.5ex plus -1ex minus -.2ex} +\newcommand*{\sectiontbs}{3.6pt} +\newcommand*{\subsectiontbs}{1.2pt} +\newcommand*{\subsectionas}{1.5ex plus .2ex} +\newcommand*{\subsectionbs}{-3.25ex plus -1ex minus -.2ex} +\newcommand*{\subsubsectionas}{\subsectionas} +\newcommand*{\subsubsectionbs}{\subsectionbs} +\newcommand*{\paragraphas}{-1em} +\newcommand*{\paragraphbs}{.8\baselineskip} + +\newlength{\tnwsection} +\newlength{\tnwsubsection} +\newlength{\tnwsubsubsection} +\newlength{\tnwparagraph} +\newlength{\tisection} +\newlength{\tisubsection} +\newlength{\tisubsubsection} +\newlength{\tiparagraph} + +\setlength{\tnwsection}{1.2em} +\addtolength{\tnwsection}{.6em} +\setlength{\tnwsubsection}{\tnwsection} +\addtolength{\tnwsubsection}{.75em} +\setlength{\tnwsubsubsection}{\tnwsubsection} +\addtolength{\tnwsubsubsection}{.75em} +\setlength{\tnwparagraph}{\tnwsubsubsection} +\addtolength{\tnwparagraph}{.75em} + +\setlength{\tisection}{0em} +\setlength{\tisubsection}{\tisection} +\addtolength{\tisubsection}{\tnwsection} +\setlength{\tisubsubsection}{\tisubsection} +\addtolength{\tisubsubsection}{\tnwsubsection} +\setlength{\tiparagraph}{\tisubsubsection} +\addtolength{\tiparagraph}{\tnwsubsubsection} + +\RedeclareSectionCommands[% + tocraggedentrytext=true,% +]% +{section,subsection,subsubsection,paragraph} + +\RedeclareSectionCommand[% + tocindent=\tisection,% + tocnumwidth=\tnwsection,% + tocbeforeskip=\sectiontbs,% + tocentryformat=\supernormalsize\sffamily\bfseries,% + tocentrynumberformat=\supernormalsize\sffamily\bfseries,% + tocpagenumberformat=\supernormalsize\sffamily\bfseries% +]% +{section} + +\RedeclareSectionCommand[% + tocindent=\tisubsection,% + tocnumwidth=\tnwsubsection,% + tocbeforeskip=\subsectiontbs,% + tocentryformat=\subnormalsize,% + tocentrynumberformat=\subnormalsize,% + tocpagenumberformat=\subnormalsize% +]% +{subsection} + +\RedeclareSectionCommand[% + tocindent=\tisubsubsection,% + tocnumwidth=\tnwsubsubsection,% + tocbeforeskip=\sectiontbs% +]% +{subsubsection} + +\RedeclareSectionCommand[% + afterskip=\paragraphas,% + beforeskip=\paragraphbs,% + tocindent=\tiparagraph,% + tocnumwidth=\tnwparagraph,% + tocbeforeskip=\sectiontbs% +]% +{paragraph} + +\linespread{1.1} + +\newcommand*{\hs}{\hspace{.45em}} + +\usepackage{fontspec} + +\directlua{ + + fonts.handlers.otf.addfeature { + name = "onumkern", + type = "kern", + data = { + ["v"] = { ["zero.taboldstyle"] = 80 }, + ["two.taboldstyle"] = { ["zero.taboldstyle"] = 30, ["/"] = 50 }, + ["five.taboldstyle"] = { ["/"] = 20 }, + ["»"] = { ["I"] = 50 }, + }, + } + +} + +\setmainfont{Tangent}[ + BoldFont = *-Medium, + ItalicFont = *-Italic, + Ligatures = {Common, TeX}, + Numbers = OldStyle, + RawFeature = +onumkern +] + +\setsansfont{SegoeUI}[ + BoldFont = seguisb.ttf, + Ligatures = {Discretionary, TeX}, + Numbers = OldStyle +] + +\setmonofont{Consolas}[ + ItalicFont = *-Italic, + Numbers = OldStyle +] + +\newcommand*{\mono}[1]{% + {\subnormalsize\texttt{#1}}% +} + +\newcommand*{\monofn}[1]{% + {\subfootnotesize\texttt{#1}}% +} + +\usepackage{babel} +\usepackage{realscripts} +\usepackage[paper=a4paper,marginratio={2:1,3:4}]{geometry} +\usepackage[noshortf,makemarks]{ligtype} +\usepackage{spacekern} +\usepackage{hyperref} +\usepackage{bookmark} +\usepackage{microtype} + +\hypersetup{% + pdflang=en,% + unicode=true,% + pdfborder={0 0 0},% + bookmarksopen=true,% + bookmarksopenlevel=0,% + bookmarksnumbered=true,% + pdftitle={The ligtype package}, + pdfsubject={Comprehensive ligature suppression functionalities}, + pdfauthor={Thomas Kelkel}, + pdfkeywords={tex, latex, ligatures} +} + +\setlength{\parindent}{0pt} +\setlength{\parskip}{.4\baselineskip} + +\newcommand*{\q}[1]{% + ›% + #1% + ‹% +} +\newcommand*{\qq}[1]{% + »% + #1% + «% +} + +\setlength{\footnotesep}{.8em} + +\deffootnote[0em]{0em}{1em}{} + +\newcommand*{\fn}[1]{% + \footnotemark% + \footnotetext{% + \textbf{\addfontfeature{Numbers = Lining, BoldFont = Tangent-Bold}\thefootnote}% + \hs% + #1% + }% +} + +\newcommand*{\textnote}[1]{% + {% + \ttfamily% + \char174{}% + #1% + \char174{}% + }% +} + +\usepackage{luacode} + +\begin{luacode} + +local FLOOR = math.floor + +local function round ( num, dec ) + return FLOOR ( num * 10^dec + 0.5 ) / 10^dec +end + +local p_array = {false, false, false, false, false} +local p_counter = 0 +local ID = node.id +local NEW = node.new +local COPY = node.copy +local REM = node.remove +local PREV = node.prev +local NEXT = node.next +local TAIL = node.tail +local T_ID = node.traverse_id +local T_GLYPH = node.traverse_glyph +local INS_B = node.insert_before +local GLYPH = ID ( "glyph" ) +local GLUE = ID ( "glue" ) +local KERN = ID ( "kern" ) +local HLIST = ID ( "hlist" ) +local SWAPPED = table.swapped +local SUBTYPES = node.subtypes +local SPACESKIP = SWAPPED ( SUBTYPES ("glue") )["spaceskip"] +local WIDTH = round ( tex.sp ( "1.6em" ), 0 ) +local ipairs = ipairs +local page_counter = 0 +local INS_A = node.insert_after +local p_counter_x = 0 +local ATC = luatexbase.add_to_callback + +local function make_marks ( head, char, id, array, counter ) + for n in T_GLYPH ( head ) do + if n.char == char then + counter = counter + 1 + array[counter] = {false, false, false} + head = INS_B ( head, n, NEW ( GLYPH ) ) + PREV ( n ).data = id + local NEXT = n.next + local inside_counter = 0 + while NEXT.char ~= char do + inside_counter = inside_counter + 1 + array[counter][inside_counter] = COPY ( NEXT ) + NEXT = NEXT.next + REM ( head, NEXT.prev ) + end + head = REM ( head, NEXT ) + head = REM ( head, n ) + end + end + return head, array, counter +end + +local function mark_notes ( head ) + head, p_array, p_counter = make_marks ( head, 174, 427956, p_array, p_counter ) + return head +end + +local function make_margin_notes ( head, id, array, counter ) + for n in T_ID ( HLIST, head ) do + local first_kern = 0 + local first_width = 0 + for glyph_node in T_GLYPH ( n.head ) do + if glyph_node.data == id then + counter = counter + 1 + local tail_node = TAIL ( n.head ) + local glue_node = NEW ( GLUE ) + glue_node.subtype = SPACESKIP + glue_node.width = WIDTH + local NEXT + local switch_counter = 1 -- page_counter + n.head = INS_A ( n.head, TAIL ( n.head ), glue_node ) + if ( switch_counter % 2 == 0 ) then + NEXT = glue_node + else + NEXT = tail_node + end + local kern_value = 0 + for _, value in ipairs ( array[counter] ) do + if value ~= false then + local NUMBER = COPY ( value ) + n.head = INS_A ( n.head, NEXT, NUMBER) + if NEXT.next then + NEXT = NEXT.next + end + if NUMBER.width then + kern_value = kern_value - NUMBER.width + end + end + end + local kern_node = NEW ( KERN ) + kern_node.kern = kern_value - glue_node.width + if switch_counter % 2 ~= 0 then + kern_node.kern = kern_node.kern - tex.hsize + first_kern + n.head = INS_A ( n.head, tail_node, kern_node ) + end + if ( switch_counter % 2 == 0 ) and ( first_kern < 0 ) then + kern_node.kern = kern_node.kern - first_kern + first_width - kern_value + n.head = INS_A ( n.head, tail_node, kern_node ) + end + first_kern = kern_node.kern + first_width = kern_value + end + end + end + return head, counter +end + +local function make_text_notes ( head ) + page_counter = page_counter + 1 + head, p_counter_x = make_margin_notes ( head, 427956, p_array, p_counter_x ) + return head +end + + ATC ( "ligaturing", mark_notes , "mark notes" ) + ATC ( "pre_output_filter", make_text_notes , "count pages" ) + +\end{luacode} + +\flushbottom + +\nolig{ligtype}{lig|type} + +\begin{document} + +\title{The ligtype package\vspace{.25\baselineskip}\\\superlarge{}Comprehensive ligature suppression functionalities}% +\author{\sublarge{}Thomas Kelkel\vspace{-.25\baselineskip}\\\sublarge{}kelkel@emaileon.de\vspace{-.25\baselineskip}}% +\date{\addfontfeature{LetterSpace=2}\sublarge{}2022/06/13\quad{}v0.1b}% +\maketitle + +\ligtypeoff + +\tableofcontents + +\addvspace{3em} +\hfill\textit{\qq{I don't think you would ever do this in English}}\par +\addvspace{-.25\baselineskip} +\hfill {\small\textbf{David Carlisle}\quad} +\vspace{-2\baselineskip} + +\section{Introduction} + +The main feature of this package is the selective suppression of typographic ligatures. + +There’s already the \mono{selnolig} package by Mico Loretan providing such capability. However, it has some significant shortcomings that render it barely applicable in many use cases. The \mono{ligtype} package steps in to address these deficiencies. The main improvements are: + +\paragraph{Kerning} + +The \mono{ligtype} package applies kerning for the glyphs of the suppressed ligatures. Both font and user kerning are applied in the usual way. + +\paragraph{Short-armed f} + +If available, it automatically replaces the f-glyphs of suppressed ligatures with their short-arm variant. + +\paragraph{Speed} + +It is about ten times faster on a typical document, thanks to its completely different architecture.\fn{This factor increases with the length of the paragraphs. On a 150-page paragraph, \monofn{ligtype} runs about a hundred times faster.} + +\addvspace{\paragraphbs} + +Another, rather minor, difference is that it does not require \mono{fontspec}. + +\addvspace{\paragraphbs} + +\noindent The \mono{ligtype} package provides built-in suppression of inappropriate ligatures for \textbf{\addfontfeature{BoldFont = Tangent-Bold}German language documents.} (\kern.05emFor this purpose it makes use of the corresponding suppression rules provided by the \mono{selnolig} package, which cover all common f-ligatures\fn{Details can be taken from the \monofn{selnolig} documentation.}.) Using the \mono{nodefault} option and the \mono{\textbackslash{}nolig} and \mono{\textbackslash{}keeplig} macros it can also be used for other languages. + +Please note that Lua{\addfontfeature{LetterSpace = 2}\LaTeX} is required to use this package. + +Finally, a quick word regarding the code: It is optimized for speed throughout. It would have been much easier to provide a significantly shorter, clearer, more straightforward one. Unfortunately, with this software such code would not have been the fastest one. + +\section{Basic usage} + +To load the package, simply add the following line to the preamble of the document: + +\begin{quote} + \mono{\textbackslash{}usepackage\{ligtype\}} +\end{quote} + +If the glyphs forming the ligatures are already properly kerned and a German language document is typeset, loading the package without any options should be sufficient for most use cases. + +However, most of the time it will be the case that the corresponding glyphs have to be kerned first. For this task, the \mono{kerntest} option is extremely helpful. + +\section{Package options} + +Options can be loaded by adding them comma separated within square brackets: + +\begin{quote} + \mono{\textbackslash{}usepackage[\textit{<option1>,<option2>,…}]\{ligtype\}} +\end{quote} + +\addcontentsline{toc}{subsection}{kerntest} + +\textnote{kerntest}This option prints all glyph combinations that comprise the ligatures \mono{ligtype} is looking for in Regular, Italic, Bold and Italic Bold for both the Roman and the Sans font on the last page of the document. This gives you an overview of all kerning pairs that are relevant when breaking ligatures, and you can inspect the kerning values accordingly. + +\addcontentsline{toc}{subsection}{makemarks} + +\textnote{makemarks}Marks each point where a ligature was suppressed with a blue triangle below the baseline. + +\addcontentsline{toc}{subsection}{noshortf} + +\textnote{noshortf}Various use cases are conceivable with this option. + +It is primarily intended to suppress the use of short-armed f if they are not desired. + +In addition, it may be useful to load this option when using fonts that do not offer short-armed f, since there is a small gain in speed if \mono{ligtype} does not look for them. + +Finally, this option could be used to prevent \qq{false positives}. (Even though such are not known to occur.) + +\addcontentsline{toc}{subsection}{allshortf} + +\textnote{allshortf}In some cases it may be desirable to use short-armed f without having different f-glyphs in the document. This option can be used for such purpose, since it replaces all long-armed f with their short-arm variant (if available). + +This option has priority over the \mono{noshortf} option, i.\,e. if both are loaded, \mono{allshortf} is applied. + +\addcontentsline{toc}{subsection}{nodefault} + +\textnote{nodefault}Disables the built-in (German language) suppression rules. With this option and the \mono{\textbackslash{}nolig} and \mono{\textbackslash{}keeplig} macros, \mono{ligtype} can be used for other languages. + +\section{Macros} + +\addcontentsline{toc}{subsection}{nolig} + +\addcontentsline{toc}{subsection}{keeplig} + +\textnote{\textbackslash{}nolig}The first macro defines a rule for suppressing ligatures, the second one for keeping them. Both macros take two arguments.\textnote{\textbackslash{}keeplig} The first one specifies the string to search for. In the second, a marker of the breaking point is added to this string using a vertical bar.\fn{The architecture of the \monofn{ligtype} package differs quite significantly from that of the \monofn{selnolig} package. To allow current users of \monofn{selnolig} to continue using existing macros for creating suppression rules as far as possible without changes, the syntax has been largely adopted. For the \monofn{\textbackslash{}nolig} macro it is identical. However, in contrast to the \monofn{selnolig} syntax, the breakpoint must be specified as a second argument for the \monofn{\textbackslash{}keeplig} macros, since \monofn{ligtype} requires this for every rule application.} For example: + +\begin{quote} + \mono{\textbackslash{}nolig\{flich\}\{f|lich\}}\\ + \mono{\textbackslash{}keeplig\{flicht\}\{f|licht\}} +\end{quote} + +A list of alternatives that can be located at the end of the string can be specified within square brackets: + +\begin{quote} + \mono{\textbackslash{}nolig\{Auff[aeiloruyäöü]\}\{Auf|f\}} +\end{quote} + +It is important to note that macros are processed in the order in which they are defined, which means that strings defined later have priority over strings defined earlier. Accordingly, strings defined later should not be included in strings defined earlier, otherwise the earlier ones will have no effect. + +\addcontentsline{toc}{subsection}{ligtypeon} + +\addcontentsline{toc}{subsection}{ligtypeoff} + +\textnote{\textbackslash{}ligtypeon}With the help of these macros the features of the \mono{ligtype} package can be switched on and off within the document.\textnote{\textbackslash{}ligtypeoff} + +\section{Acknowledgements} + +The \mono{ligtype} package makes use of the German language ligature suppression rules of the \mono{selnolig} package by Mico Loretan. The \mono{selnolig} package can be downloaded at + +\begin{quote} + \mono{https://www.ctan.org/pkg/selnolig} +\end{quote} + +and may be distributed and/or modified under the conditions of the LaTeX Project Public License. + +Please see the \qq{License and acknowledgments} section of the \mono{selnolig} documentation to learn about all the people who contributed to the creation of the suppression rules. + +In general, the truly excellent \mono{selnolig} documentation is highly recommended for further information on the subject of this package. + +\section{License} + +This package is copyright © 2022 Thomas Kelkel. It may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this license or (at your option) any later version. This work has the LPPL maintenance status \qq{author maintained}. + \end{document}
\ No newline at end of file diff --git a/macros/luatex/latex/showhyphenation/showhyphenation.lua b/macros/luatex/latex/showhyphenation/showhyphenation.lua index ff763be250..72f964932c 100644 --- a/macros/luatex/latex/showhyphenation/showhyphenation.lua +++ b/macros/luatex/latex/showhyphenation/showhyphenation.lua @@ -10,7 +10,7 @@ -- and version 1.3c or later is part of all distributions of -- LaTeX version 2009/09/24 or later. --- Version: 0.1 +-- Version: 0.1a local FLOOR = math.floor @@ -128,7 +128,11 @@ local function find_glyph ( n, d, kern_value ) if line_end and n.user_id == 848485 then ligtype_mark = true end - n = d ( n ) + if d ( n ) then + n = d ( n ) + else + return false + end end if n.replace then local REPLACE = n.replace @@ -214,7 +218,9 @@ local function hyphenation_points ( head ) end local prev_next_glyph = n local ligtype_mark = nil - prev_next_glyph, prev_next_kern, ligtype_mark = find_glyph ( prev_next_glyph, DIR, 0 ) + if find_glyph ( prev_next_glyph, DIR, 0 ) then + prev_next_glyph, prev_next_kern, ligtype_mark = find_glyph ( prev_next_glyph, DIR, 0 ) + end head = AB ( head, prev_next_glyph, NEW ( WI, pdfliteral ) ) lig_add = lig_add + ( prev_next_kern + prev_next_kern_lig ) * f DIR ( prev_next_glyph ).mode = 0 diff --git a/macros/luatex/latex/showhyphenation/showhyphenation.pdf b/macros/luatex/latex/showhyphenation/showhyphenation.pdf Binary files differindex bbcefb44b5..a0ce34f5e5 100644 --- a/macros/luatex/latex/showhyphenation/showhyphenation.pdf +++ b/macros/luatex/latex/showhyphenation/showhyphenation.pdf diff --git a/macros/luatex/latex/showhyphenation/showhyphenation.sty b/macros/luatex/latex/showhyphenation/showhyphenation.sty index 866d39c9db..ee088450a0 100644 --- a/macros/luatex/latex/showhyphenation/showhyphenation.sty +++ b/macros/luatex/latex/showhyphenation/showhyphenation.sty @@ -10,7 +10,7 @@ % and version 1.3c or later is part of all distributions of % LaTeX version 2009/09/24 or later. -\ProvidesPackage{showhyphenation}[2022/04/17 v0.1 Show hyphenation points] +\ProvidesPackage{showhyphenation}[2022/06/13 v0.1a Marking of hyphenation points] \RequirePackage{ifluatex,luatexbase} \ifluatex diff --git a/macros/luatex/latex/showhyphenation/showhyphenation.tex b/macros/luatex/latex/showhyphenation/showhyphenation.tex index d0c376bf80..84dba3622d 100644 --- a/macros/luatex/latex/showhyphenation/showhyphenation.tex +++ b/macros/luatex/latex/showhyphenation/showhyphenation.tex @@ -352,7 +352,7 @@ end \title{The showhyphenation package\vspace{.25\baselineskip}\\\superlarge{}\directlua{luatexbase.remove_from_callback ( "post_linebreak_filter", "show hyphenation points in postline" ) luatexbase.remove_from_callback ( "hpack_filter", "show hyphenation points in hpack" )}Marking of hyphenation points}% \author{\sublarge{}Thomas Kelkel\vspace{-.25\baselineskip}\\\sublarge{}kelkel@emaileon.de\vspace{-.25\baselineskip}}% -\date{\addfontfeature{LetterSpace=2}\sublarge{}2022/05/31\quad{}v0.1}% +\date{\addfontfeature{LetterSpace=2}\sublarge{}2022/06/13\quad{}v0.1a}% \maketitle \hyphenation{pack-age} diff --git a/macros/plain/graphics/README.md b/macros/plain/graphics/README.md index aa297989fe..2b2086cdd7 100644 --- a/macros/plain/graphics/README.md +++ b/macros/plain/graphics/README.md @@ -21,10 +21,10 @@ David Carlisle 2018/01/16 2020/03/02 2020/10/30 -2021/11/15 +2021/11/15 +2022/06/13 - -Copyright 1995 1996 2016 2017 2018 2020 2021 David Carlisle +Copyright 1995 1996 2016 2017 2018 2020 2021 2022 David Carlisle All the files in this directory may be redistributed and/or modified under the terms of the LaTeX Project Public License distributed from diff --git a/macros/plain/graphics/miniltx.tex b/macros/plain/graphics/miniltx.tex index 6f4085dbc0..8a747790bf 100644 --- a/macros/plain/graphics/miniltx.tex +++ b/macros/plain/graphics/miniltx.tex @@ -2,7 +2,7 @@ %%% %%% Parts of LaTeX: Slightly changed/simplified in places. %%% Changes -%%% Copyright 1996-2021 David Carlisle LaTeX3 Project +%%% Copyright 1996-2022 David Carlisle LaTeX3 Project %%% Original Code %%% Copyright 1993-1996 LaTeX3 Project and original authors %%% @@ -28,6 +28,8 @@ % 2019/07/20 more updates for latex drivers % 2020/03/02 move to own git repository and add newcommand fix from issue #2 % 2021/11/15 Define \@backslashchar for issue #4 +% 2022/06/13 Define \@ehd error help (usedby color errors) +% Define fallback \mathcolor so color package does not require expl3 \edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax} @@ -325,6 +327,8 @@ \def\on@line{ on input line \the\inputlineno} \ifx\@ehc\@undefined\def\@ehc{}\fi +% 2022/06/13 +\ifx\@ehd\@undefined\def\@ehd{}\fi \def\PackageError#1#2#3{{% \newlinechar`\^^J\def\MessageBreak{^^J\space\space#1: }% @@ -537,3 +541,10 @@ \def\set@curr@file#1{\xdef\@curr@file{#1}} \fi +% 2022/06/13 +\ifx\mathcolor\@undefined + % simplified version of \mathcolor + \protected\def\mathcolor{\begingroup\@ifnextchar[\mlx@mathcolora\mlx@mathcolorb} + \long\def\mlx@mathcolora[#1]#2#3{\color[#1]{#2}#3\endgroup} + \long\def\mlx@mathcolorb#1#2{\color{#1}#2\endgroup} +\fi diff --git a/macros/xetex/latex/bidi/README b/macros/xetex/latex/bidi/README index c5f606b013..14fd5f3dee 100644 --- a/macros/xetex/latex/bidi/README +++ b/macros/xetex/latex/bidi/README @@ -1,6 +1,6 @@ ___________________ The bidi package -v38.0 +v38.2 This package provides a convenient interface for typesetting bidirectional texts in Plain TeX and LaTeX, using XeTeX engine. @@ -25,7 +25,7 @@ The announcements for the new releases of the package will also appear in the Discussions space under the Announcements category. -Current version release date: 2022/06/11 +Current version release date: 2022/06/13 ___________________________________________ Vafa Khalighi diff --git a/macros/xetex/latex/bidi/bidi-doc-intro.ltx b/macros/xetex/latex/bidi/bidi-doc-intro.ltx index 2da5e03afc..cd02720ccc 100644 --- a/macros/xetex/latex/bidi/bidi-doc-intro.ltx +++ b/macros/xetex/latex/bidi/bidi-doc-intro.ltx @@ -20,7 +20,7 @@ If you use \textsf{bidi} package to write any input \TeX\ document, and then run * Copyright (c) 2007--2022 Vafa Khalighi * Copyright (c) 2018--2020 bidi-tex GitHub Organization * -* v38.0, 2022/06/11 +* v38.2, 2022/06/13 * * License: LaTeX Project Public License, version * 1.3c or higher (your choice) diff --git a/macros/xetex/latex/bidi/bidi-doc-title.ltx b/macros/xetex/latex/bidi/bidi-doc-title.ltx index 4fd6264b86..a394e908fe 100644 --- a/macros/xetex/latex/bidi/bidi-doc-title.ltx +++ b/macros/xetex/latex/bidi/bidi-doc-title.ltx @@ -3,7 +3,7 @@ \begin{document} \title{\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}\\ \LARGE Bidirectional typesetting in plain \TeX{} and \LaTeX, using \XeTeX{} engine\\[5pt] -\large User documentation for \textcolor{blue!65!black}{version 38.0}} +\large User documentation for \textcolor{blue!65!black}{version 38.2}} \author{Vafa Khalighi\thanks{Thanks to the bidi-tex GitHub organization consisted of David Carlisle and other members of the {\LaTeX} team to maintain the package in the period 2018--2020.}} \setcounter{page}{0} \thispagestyle{empty} @@ -13,7 +13,7 @@ \textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}} \Large -User documentation for \textcolor{blue!65!black}{version 38.0}} +User documentation for \textcolor{blue!65!black}{version 38.2}} \vskip 0pt plus 3fill \textit{\large to my Master, \textbf{Ferdowsi The Great}} diff --git a/macros/xetex/latex/bidi/bidi-doc.ltx b/macros/xetex/latex/bidi/bidi-doc.ltx index 7884c88358..7d0f645539 100644 --- a/macros/xetex/latex/bidi/bidi-doc.ltx +++ b/macros/xetex/latex/bidi/bidi-doc.ltx @@ -1,7 +1,7 @@ \documentclass{ltxdoc} \input{bidi-doc-preamble.ltx} \hypersetup{% - pdftitle={User documentation for version 38.0 of the bidi + pdftitle={User documentation for version 38.2 of the bidi package}% } \begin{document} diff --git a/macros/xetex/latex/bidi/bidi-doc.pdf b/macros/xetex/latex/bidi/bidi-doc.pdf Binary files differindex 430e095aa7..7217e88902 100644 --- a/macros/xetex/latex/bidi/bidi-doc.pdf +++ b/macros/xetex/latex/bidi/bidi-doc.pdf diff --git a/macros/xetex/latex/bidi/bidi.dtx b/macros/xetex/latex/bidi/bidi.dtx index 2d3b5d2497..7195bcf250 100644 --- a/macros/xetex/latex/bidi/bidi.dtx +++ b/macros/xetex/latex/bidi/bidi.dtx @@ -5,7 +5,7 @@ %<*readme> ___________________ The bidi package -v38.0 +v38.2 This package provides a convenient interface for typesetting bidirectional texts in Plain TeX and LaTeX, using XeTeX engine. @@ -30,7 +30,7 @@ The announcements for the new releases of the package will also appear in the Discussions space under the Announcements category. -Current version release date: 2022/06/11 +Current version release date: 2022/06/13 ___________________________________________ Vafa Khalighi @@ -93,11 +93,15 @@ by Vafa Khalighi. \generate{\file{beamerbaseoverlay-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerbaseoverlay-xetex-bidi.def}}} \generate{\file{beamerinnerthemedefault-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemedefault-xetex-bidi.def}}} \generate{\file{beamerinnerthemecircles-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemecircles-xetex-bidi.def}}} +\generate{\file{beamerinnerthemefocus-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemefocus-xetex-bidi.def}}} \generate{\file{beamerinnerthemeinmargin-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemeinmargin-xetex-bidi.def}}} +\generate{\file{beamerinnerthememetropolis-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthememetropolis-xetex-bidi.def}}} \generate{\file{beamerinnerthemerectangles-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemerectangles-xetex-bidi.def}}} \generate{\file{beamerinnerthemerounded-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerinnerthemerounded-xetex-bidi.def}}} \generate{\file{beamerouterthemedefault-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemedefault-xetex-bidi.def}}} +\generate{\file{beamerouterthemefocus-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemefocus-xetex-bidi.def}}} \generate{\file{beamerouterthemeinfolines-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemeinfolines-xetex-bidi.def}}} +\generate{\file{beamerouterthememetropolis-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthememetropolis-xetex-bidi.def}}} \generate{\file{beamerouterthememiniframes-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthememiniframes-xetex-bidi.def}}} \generate{\file{beamerouterthemesidebar-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemesidebar-xetex-bidi.def}}} \generate{\file{beamerouterthemesplit-xetex-bidi.def}{\from{\jobname.dtx}{table,beamerouterthemesplit-xetex-bidi.def}}} @@ -259,7 +263,7 @@ by Vafa Khalighi. \documentclass{ltxdoc} \input{bidi-doc-preamble.ltx} \hypersetup{% - pdftitle={Source documentation for version 38.0 of the bidi + pdftitle={Source documentation for version 38.2 of the bidi package}% } \EnableCrossrefs @@ -278,7 +282,7 @@ by Vafa Khalighi. % \GetFileInfo{\jobname.dtx} % \title{\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}\\ %\LARGE Bidirectional typesetting in plain \TeX{} and \LaTeX, using \XeTeX{} engine\\[5pt] -%\large Source documentation for \textcolor{blue!65!black}{version 38.0}} +%\large Source documentation for \textcolor{blue!65!black}{version 38.2}} % \author{Vafa Khalighi\thanks{Thanks to the bidi-tex GitHub organization consisted of David Carlisle and other members of the {\LaTeX} team to maintain the package in the period 2018--2020.}} %\setcounter{page}{0} %\thispagestyle{empty} @@ -288,7 +292,7 @@ by Vafa Khalighi. %\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}} % %\Large -%Source documentation for \textcolor{blue!65!black}{version 38.0}} +%Source documentation for \textcolor{blue!65!black}{version 38.2}} % %\vskip 0pt plus 3fill %\textit{\large to my Master, \textbf{Ferdowsi The Great}} @@ -337,7 +341,7 @@ by Vafa Khalighi. %\iffalse %<*table> %\fi -%% \CheckSum{53812} +%% \CheckSum{54318} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z @@ -2411,7 +2415,7 @@ by Vafa Khalighi. %\fi % \section{File \texttt{beamerbaseframecomponents-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{beamerbaseframecomponents-xetex-bidi.def}[2022/06/09 v0.3 bidi adaptations for beamerbaseframecomponents package for XeTeX engine] +\ProvidesFile{beamerbaseframecomponents-xetex-bidi.def}[2022/06/13 v0.4 bidi adaptations for beamerbaseframecomponents package for XeTeX engine] \renewcommand{\setbeamersize}[1]{% \beamer@dogeometryfalse% \setkeys{beamer@margin}{#1}% @@ -2555,6 +2559,27 @@ by Vafa Khalighi. }}\hfil% } +\def\ps@empty{% + \let\@mkboth\@gobbletwo% + \def\@oddhead{\begingroup% + \setbox\beamer@tempbox=\hbox{\usebeamertemplate***{background canvas}\hyper@pagetransition\hyper@pageduration}% + \beamer@tempdim=\ht\beamer@tempbox% + \setbox\beamer@tempbox=\hbox{\lower\beamer@tempdim\hbox{\box\beamer@tempbox}}% + \wd\beamer@tempbox=0pt\ht\beamer@tempbox=0pt\dp\beamer@tempbox=0pt% + \setbox\@tempboxa=\hbox{\usebeamertemplate***{background}}% + \beamer@tempdim=\ht\@tempboxa% + \setbox\@tempboxa=\hbox{\lower\beamer@tempdim\hbox{\box\@tempboxa}}% + \wd\@tempboxa=0pt\ht\@tempboxa=0pt\dp\@tempboxa=0pt% + \vbox{\hbox{\hskip-\Gm@lmargin\raise\headheight\box\beamer@tempbox\raise\headheight\box\@tempboxa}\hfil}% + \endgroup% + } + \def\@oddfoot{{\normalcolor{\hfil% + \setbox\beamer@tempbox=\hbox{\usebeamertemplate***{navigation symbols}\hskip-\Gm@rmargin\hskip2pt}% + \ht\beamer@tempbox=0pt% + \dp\beamer@tempbox=0pt% + \box\beamer@tempbox}}} + \let\@evenhead\@oddhead\let\@evenfoot\@oddfoot} + \renewcommand<>\beamer@columncom[2][\beamer@colmode]{% \beamer@colclose% \def\beamer@colclose{\end{minipage}\hfill\end{actionenv}\ignorespaces}% @@ -3112,6 +3137,80 @@ by Vafa Khalighi. % \end{macrocode} % \iffalse %</beamerinnerthemecircles-xetex-bidi.def> +%<*beamerinnerthemefocus-xetex-bidi.def> +%\fi +% \section{File \texttt{beamerinnerthemefocus-xetex-bidi.def}} +% \begin{macrocode} +\ProvidesFile{beamerinnerthemefocus-xetex-bidi.def}[2022/06/13 v0.1 bidi adaptations for beamerinnerthemefocus package for XeTeX engine] +\setbeamertemplate{section in toc}[square] +\setbeamertemplate{subsection in toc}[square] + +\setbeamertemplate{itemize items}[square] +\setbeamertemplate{itemize subitem}[triangle] + +\bidi@csundef{beamer@@tmpop@title page@focus} + +\defbeamertemplate*{title page}{focus}{% + {% + \usebeamercolor{frametitle}\colorlet{focus@@temp}{bg}% + \begin{tikzpicture}[overlay, remember picture] + \fill[color=focus@@temp] (current page.north west) rectangle ([shift = {(0, -0.45\paperheight)}] current page.north east); + \end{tikzpicture} + } + + \vspace{-1.65\baselineskip} + \begin{minipage}[b][0.35\paperheight]{\textwidth} + \vspace{\baselineskip} + \usebeamerfont{title} + \usebeamercolor[fg]{frametitle} + \inserttitle + \end{minipage} + + \begin{minipage}[t][0.1\paperheight]{\textwidth} + \usebeamerfont{subtitle} + \usebeamercolor[fg]{frametitle} + \insertsubtitle + \end{minipage} + + % Set the title graphic in a zero-height box, so that + % the position of other elements is not affected. + {\vfuzz=9999pt\vbox to 0pt { + \if@RTL + \raggedright + \else + \raggedleft + \fi + \inserttitlegraphic + }} + + \begin{minipage}[t]{\textwidth} + \usebeamerfont{author} + \insertauthor + \end{minipage} + + \vspace*{\baselineskip} + \begin{minipage}[t]{\textwidth} + \usebeamerfont{institute} + \insertinstitute + \end{minipage} + + \vspace*{\baselineskip} + \begin{minipage}[t]{\textwidth} + \usebeamerfont{date} + \insertdate + \end{minipage} + + \vspace*{0pt plus 100fill} + + \addtocounter{framenumber}{-1} + \addtocounter{realframenumber}{-1} +} + + + +% \end{macrocode} +% \iffalse +%</beamerinnerthemefocus-xetex-bidi.def> %<*beamerinnerthemeinmargin-xetex-bidi.def> %\fi % \section{File \texttt{beamerinnerthemeinmargin-xetex-bidi.def}} @@ -3214,6 +3313,138 @@ by Vafa Khalighi. % \end{macrocode} % \iffalse %</beamerinnerthemeinmargin-xetex-bidi.def> +%<*beamerinnerthememetropolis-xetex-bidi.def> +%\fi +% \section{File \texttt{beamerinnerthememetropolis-xetex-bidi.def}} +% \begin{macrocode} +\ProvidesFile{beamerinnerthememetropolis-xetex-bidi.def}[2022/06/13 v0.1 bidi adaptations for beamerinnerthememetropolis package for XeTeX engine] +\setbeamertemplate{title}{ + \bidi@beamer@ragged% + \linespread{1.0}% + \inserttitle% + \par% + \vspace*{0.5em} +} + +\setbeamertemplate{subtitle}{ + \bidi@beamer@ragged% + \insertsubtitle% + \par% + \vspace*{0.5em} +} + +\bidi@csundef{beamer@@tmpop@section page@progressbar} + +\defbeamertemplate{section page}{progressbar}{ + \centering + \begin{minipage}{22em} + \bidi@beamer@ragged + \usebeamercolor[fg]{section title} + \usebeamerfont{section title} + \insertsectionhead\\[-1ex] + \usebeamertemplate*{progress bar in section page} + \par + \ifx\insertsubsectionhead\@empty\else% + \usebeamercolor[fg]{subsection title}% + \usebeamerfont{subsection title}% + \insertsubsectionhead + \fi + \end{minipage} + \par + \vspace{\baselineskip} +} + +\setbeamertemplate{progress bar in section page}{ + \setlength{\metropolis@progressonsectionpage}{% + \textwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}% + }% + \begin{tikzpicture} + \fill[bg] (0,0) rectangle (\textwidth, \metropolis@progressonsectionpage@linewidth); +\if@RTLmain + \fill[fg] (\textwidth-\metropolis@progressonsectionpage,0) rectangle (\textwidth, \metropolis@progressonsectionpage@linewidth); +\else + \fill[fg] (0,0) rectangle (\metropolis@progressonsectionpage, \metropolis@progressonsectionpage@linewidth); +\fi + \end{tikzpicture}% +} + +\renewcommand{\metropolis@block}[1]{ + \par\vskip\medskipamount% + \setlength{\parskip}{0pt} + \ifbeamercolorempty[bg]{block title#1}{% + \if@RTL + \begin{beamercolorbox}[leftskip=0pt plus 4em]{block title#1}% + \else + \begin{beamercolorbox}[rightskip=0pt plus 4em]{block title#1}% + \fi + }{% + \ifbeamercolorempty[bg]{block title}{% + \if@RTL + \begin{beamercolorbox}[leftskip=0pt plus 4em]{block title#1}% + \else + \begin{beamercolorbox}[rightskip=0pt plus 4em]{block title#1}% + \fi + }% + {% + \if@RTL + \begin{beamercolorbox}[ + sep=\dimexpr\metropolis@blocksep-\metropolis@blockadjust\relax, + rightskip=\metropolis@blockadjust, + leftskip=\dimexpr\metropolis@blockadjust plus 4em\relax + ]{block title#1}% + \else + \begin{beamercolorbox}[ + sep=\dimexpr\metropolis@blocksep-\metropolis@blockadjust\relax, + leftskip=\metropolis@blockadjust, + rightskip=\dimexpr\metropolis@blockadjust plus 4em\relax + ]{block title#1}% + \fi + }}% + \usebeamerfont*{block title#1}% + \metropolis@strut% + \insertblocktitle% + \metropolis@strut% + \end{beamercolorbox}% + \nointerlineskip% + \ifbeamercolorempty[bg]{block body#1}{% + \begin{beamercolorbox}[vmode]{block body#1}}{ + \ifbeamercolorempty[bg]{block body}{% + \begin{beamercolorbox}[vmode]{block body#1}% + }{% + \begin{beamercolorbox}[sep=\metropolis@blocksep, vmode]{block body#1}% + \vspace{-\metropolis@parskip} + }}% + \usebeamerfont{block body#1}% + \setlength{\parskip}{\metropolis@parskip}% +} + + +\setbeamertemplate{footnote}{% + \parindent 0em\noindent% + \bidi@beamer@ragged + \usebeamercolor{footnote}\hbox to 0.8em{\hfil\insertfootnotemark}\insertfootnotetext\par% +} + +\setbeamertemplate{RTLfootnote}{% + \parindent 0em\noindent% + \raggedleft + \usebeamercolor{footnote}\hbox to 0.8em{\hfil\insertfootnotemark}\insertfootnotetext\par% +} + +\setbeamertemplate{LTRfootnote}{% + \parindent 0em\noindent% + \raggedright + \usebeamercolor{footnote}\hbox to 0.8em{\hfil\insertfootnotemark}\insertfootnotetext\par% +} + +\setbeamertemplate{itemize items}{\textbullet} + +\setbeamertemplate{section page}[progressbar] + + +% \end{macrocode} +% \iffalse +%</beamerinnerthememetropolis-xetex-bidi.def> %<*beamerinnerthemerectangles-xetex-bidi.def> %\fi % \section{File \texttt{beamerinnerthemerectangles-xetex-bidi.def}} @@ -3256,6 +3487,85 @@ by Vafa Khalighi. % \end{macrocode} % \iffalse %</beamerouterthemedefault-xetex-bidi.def> +%<*beamerouterthemefocus-xetex-bidi.def> +%\fi +% \section{File \texttt{beamerouterthemefocus-xetex-bidi.def}} +% \begin{macrocode} +\ProvidesFile{beamerouterthemefocus-xetex-bidi.def}[2022/06/13 v0.1 bidi adaptations for beamerouterthemefocus package for XeTeX engine] +\bidi@undef\beamer@@tmpop@footline@progressbar + +\defbeamertemplate*{footline}{progressbar}{% + % If not appendix. + \ifnum\mainend<0% From package appendixnumberbeamer. + % + \settowidth{\focus@pbar@leftoffset}{1}% + \addtolength{\focus@pbar@leftoffset}{1.5em}% + % + \ifx\beamer@focus@totalframenumbering\no% + \settowidth{\focus@pbar@rightoffset}{}% + \addtolength{\focus@pbar@rightoffset}{0.5em}% + \else% + \settowidth{\focus@pbar@rightoffset}{\inserttotalframenumber}% + \addtolength{\focus@pbar@rightoffset}{1.5em}% + \fi% + % + % If not title page. + \ifnum\value{realframenumber}>0% + \ifnum\value{framenumber}<\inserttotalframenumber% + \begin{tikzpicture}[inner xsep=0.5em, inner ysep=0.5ex]\usebeamerfont{footline} + \pgfmathsetmacro{\focus@pbar@progress}% + {(\paperwidth-\focus@pbar@leftoffset-\focus@pbar@rightoffset)*(\insertframenumber/\inserttotalframenumber)} + + \clip (0,0) rectangle ++(\paperwidth,\the\focus@pbar@height); +\if@RTLmain + \fill[footline.bg] (\paperwidth,0) rectangle ++(-\the\focus@pbar@leftoffset,\the\focus@pbar@height); + \fill[footline.bg] (\paperwidth-\the\focus@pbar@leftoffset,0) rectangle ++(-\focus@pbar@progress pt,\the\focus@pbar@height) + ++(0,{-0.5*\the\focus@pbar@height}) node[anchor=west, text=footline.fg] {\strut\insertframenumber}; +\else + \fill[footline.bg] (0,0) rectangle ++(\the\focus@pbar@leftoffset,\the\focus@pbar@height); + \fill[footline.bg] (\the\focus@pbar@leftoffset,0) rectangle ++(\focus@pbar@progress pt,\the\focus@pbar@height) + ++(0,{-0.5*\the\focus@pbar@height}) node[anchor=east, text=footline.fg] {\strut\insertframenumber}; +\fi + \ifx\beamer@focus@totalframenumbering\no% + \else% +\if@RTLmain + \fill[footline.bg] (0,0) rectangle ++(\the\focus@pbar@rightoffset,\the\focus@pbar@height) + ++(0,{-0.5*\the\focus@pbar@height}) node[anchor=east, text=footline.fg] {\strut\inserttotalframenumber}; +\else + \fill[footline.bg] (\paperwidth,0) rectangle ++(-\the\focus@pbar@rightoffset,\the\focus@pbar@height) + ++(0,{-0.5*\the\focus@pbar@height}) node[anchor=west, text=footline.fg] {\strut\inserttotalframenumber}; +\fi + \fi% + \end{tikzpicture}% + \else% + \begin{tikzpicture}[inner xsep=0.5em, inner ysep=0.5ex] + \clip (0,0) rectangle ++(\paperwidth,\the\focus@pbar@height); + \fill[footline.bg] (0,0) rectangle ++(\paperwidth,\the\focus@pbar@height); +\if@RTLmain + \node[anchor=west, footline.fg] at ({\the\focus@pbar@rightoffset},{0.5*\focus@pbar@height}) {\strut\insertframenumber}; +\else + \node[anchor=east, footline.fg] at ({\paperwidth-\the\focus@pbar@rightoffset},{0.5*\focus@pbar@height}) {\strut\insertframenumber}; +\fi + \ifx\beamer@focus@totalframenumbering\no% + \else% +\if@RTLmain + \node[footline.fg] at ({\the\focus@pbar@rightoffset},{0.5*\focus@pbar@height}) {\strut/}; + \node[anchor=east, footline.fg] at ({\the\focus@pbar@rightoffset},{0.5*\focus@pbar@height}) {\strut\inserttotalframenumber}; +\else + \node[footline.fg] at ({\paperwidth-\the\focus@pbar@rightoffset},{0.5*\focus@pbar@height}) {\strut/}; + \node[anchor=west, footline.fg] at ({\paperwidth-\the\focus@pbar@rightoffset},{0.5*\focus@pbar@height}) {\strut\inserttotalframenumber}; +\fi + \fi% + \end{tikzpicture}% + \fi% + \fi% + \fi% +} + + +% \end{macrocode} +% \iffalse +%</beamerouterthemefocus-xetex-bidi.def> %<*beamerouterthemeinfolines-xetex-bidi.def> %\fi % \section{File \texttt{beamerouterthemeinfolines-xetex-bidi.def}} @@ -3317,6 +3627,36 @@ by Vafa Khalighi. % \end{macrocode} % \iffalse %</beamerouterthemeinfolines-xetex-bidi.def> +%<*beamerouterthememetropolis-xetex-bidi.def> +%\fi +% \section{File \texttt{beamerouterthememetropolis-xetex-bidi.def}} +% \begin{macrocode} +\ProvidesFile{beamerouterthememetropolis-xetex-bidi.def}[2022/06/13 v0.1 bidi adaptations for beamerouterthememetropolis package for XeTeX engine] +\setbeamertemplate{progress bar in head/foot}{ + \nointerlineskip + \setlength{\metropolis@progressinheadfoot}{% + \paperwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}% + }% + \begin{beamercolorbox}[wd=\paperwidth]{progress bar in head/foot} + \begin{tikzpicture} + \fill[bg] (0,0) rectangle (\paperwidth, \metropolis@progressinheadfoot@linewidth); +\if@RTLmain + \fill[fg] (\paperwidth-\metropolis@progressinheadfoot,0) rectangle (\paperwidth, \metropolis@progressinheadfoot@linewidth); +\else + \fill[fg] (0,0) rectangle (\metropolis@progressinheadfoot, \metropolis@progressinheadfoot@linewidth); +\fi + \end{tikzpicture}% + \end{beamercolorbox} +} + +\AtBeginDocument{% + \setbeamertemplate{frametitle}[plain]% +} + + +% \end{macrocode} +% \iffalse +%</beamerouterthememetropolis-xetex-bidi.def> %<*beamerouterthememiniframes-xetex-bidi.def> %\fi % \section{File \texttt{beamerouterthememiniframes-xetex-bidi.def}} @@ -3885,8 +4225,8 @@ by Vafa Khalighi. % \section{File \texttt{bidi.sty}} % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} -\def\bididate{2022/06/11} -\def\bidi@version{38.0} +\def\bididate{2022/06/13} +\def\bidi@version{38.2} \ProvidesPackage{bidi}[\bididate\space v\bidi@version\space Bidirectional typesetting in plain TeX and LaTeX] \edef\@bidi@info{****************************************************^^J% @@ -3974,7 +4314,7 @@ Bidirectional typesetting in plain TeX and LaTeX] } \newcommand*{\@bidi@pdfcustomproperties}{% This is the bidi package, Version \bidi@version, - Released June 11, 2022. + Released June 13, 2022. } \newcommand*{\bidi@beamer@ragged}{} \@RTLmainfalse @@ -4218,9 +4558,9 @@ Bidirectional typesetting in plain TeX and LaTeX] %\fi % \section{File \texttt{bidi.tex}} % \begin{macrocode} -\def\bididate{2022/06/11} +\def\bididate{2022/06/13} \catcode`@=11 -\def\bidi@version{38.0} +\def\bidi@version{38.2} \let \protect \relax \newlinechar`\^^J \edef\@bidi@info{****************************************************^^J% @@ -4322,7 +4662,7 @@ Bidirectional typesetting in plain TeX and LaTeX] } \def\@bidi@pdfcustomproperties{% This is the bidi package, Version \bidi@version, - Released June 11, 2022. + Released June 13, 2022. } \def\bidi@pdfm@mark{% \special{pdf:% @@ -24642,14 +24982,14 @@ to\rtside{\box\bslice\hfil}} %\fi % \section{File \texttt{xcolor-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{xcolor-xetex-bidi.def}[2013/04/08 v0.2 bidi adaptations for xcolor package for XeTeX engine] +\ProvidesFile{xcolor-xetex-bidi.def}[2022/06/13 v0.3 bidi adaptations for xcolor package for XeTeX engine] \long\def\color@b@x#1#2#3% {\leavevmode\ifmmode\else\if@RTL\beginL\fi\fi \setbox\z@\hbox{\kern\fboxsep{\set@color\if@RTL\beginR\fi#3\if@RTL\endR\fi}\kern\fboxsep}% \dimen@\ht\z@\advance\dimen@\fboxsep\ht\z@\dimen@ \dimen@\dp\z@\advance\dimen@\fboxsep\dp\z@\dimen@ {#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}\ifmmode\else\if@RTL\endL\fi\fi} -\def\normalcolor{\let\current@color\default@color\ifhmode\if@RTL\beginL\aftergroup\endR\fi\fi\set@color\ifhmode\if@RTL\beginR\aftergroup\endL\fi\fi} +\protected\def\normalcolor{\let\current@color\default@color\ifhmode\if@RTL\beginL\aftergroup\endR\fi\fi\set@color\ifhmode\if@RTL\beginR\aftergroup\endL\fi\fi} \DeclareRobustCommand\color {\ifhmode\if@RTL\beginL\aftergroup\endR\fi\fi\@ifnextchar[\@undeclaredcolor\@declaredcolor} \def\@undeclaredcolor[#1]#2% @@ -24753,7 +25093,7 @@ to\rtside{\box\bslice\hfil}} %\fi % \section{File \texttt{latex-xetex-bidi.def}} % \begin{macrocode} -\ProvidesFile{latex-xetex-bidi.def}[2022/06/10 v1.4.6 bidi adaptations for `latex.ltx' for XeTeX engine] +\ProvidesFile{latex-xetex-bidi.def}[2022/06/13 v1.4.7 bidi adaptations for `latex.ltx' for XeTeX engine] \newcommand{\TeXXeTOn}{\TeXXeTstate\@ne} \newcommand{\TeXXeTOff}{\TeXXeTstate\z@} \TeXXeTOn @@ -25715,11 +26055,15 @@ $\@@underline{\hbox{#1}}\m@th$\relax\fi\fi} \@ifpackageloaded{beamerbaseoverlay}{\input{beamerbaseoverlay-xetex-bidi.def}}{} \@ifpackageloaded{beamerinnerthemedefault}{\input{beamerinnerthemedefault-xetex-bidi.def}}{} \@ifpackageloaded{beamerinnerthemecircles}{\input{beamerinnerthemecircles-xetex-bidi.def}}{} +\@ifpackageloaded{beamerinnerthemefocus}{\input{beamerinnerthemefocus-xetex-bidi.def}}{} \@ifpackageloaded{beamerinnerthemeinmargin}{\input{beamerinnerthemeinmargin-xetex-bidi.def}}{} +\@ifpackageloaded{beamerinnerthememetropolis}{\input{beamerinnerthememetropolis-xetex-bidi.def}}{} \@ifpackageloaded{beamerinnerthemerectangles}{\input{beamerinnerthemerectangles-xetex-bidi.def}}{} \@ifpackageloaded{beamerinnerthemerounded}{\input{beamerinnerthemerounded-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemedefault}{\input{beamerouterthemedefault-xetex-bidi.def}}{} +\@ifpackageloaded{beamerouterthemefocus}{\input{beamerouterthemefocus-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemeinfolines}{\input{beamerouterthemeinfolines-xetex-bidi.def}}{} +\@ifpackageloaded{beamerouterthememetropolis}{\input{beamerouterthememetropolis-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthememiniframes}{\input{beamerouterthememiniframes-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemesidebar}{\input{beamerouterthemesidebar-xetex-bidi.def}}{} \@ifpackageloaded{beamerouterthemesplit}{\input{beamerouterthemesplit-xetex-bidi.def}}{} diff --git a/macros/xetex/latex/bidi/bidi.pdf b/macros/xetex/latex/bidi/bidi.pdf Binary files differindex 7363c240ad..bee319c421 100644 --- a/macros/xetex/latex/bidi/bidi.pdf +++ b/macros/xetex/latex/bidi/bidi.pdf |