diff options
author | Norbert Preining <norbert@preining.info> | 2024-05-08 03:00:45 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-05-08 03:00:45 +0000 |
commit | 5212716ef44f8ffc4e9fc21540cf5e6472f22f9d (patch) | |
tree | 72a2adb43cdfcc24259274163925ab68c1d75a51 /macros | |
parent | 183e0a342c2d76377b644e9e09493a870d858cc7 (diff) |
CTAN sync 202405080300
Diffstat (limited to 'macros')
102 files changed, 17399 insertions, 236 deletions
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx index 9a3be61a81..73a8bf7d11 100644 --- a/macros/latex/contrib/easybook/easybook.dtx +++ b/macros/latex/contrib/easybook/easybook.dtx @@ -14,7 +14,7 @@ % This work has the LPPL maintenance status `maintained'. %<*class> \NeedsTeXFormat{LaTeX2e}[2021/11/15] -\ProvidesExplClass{easybook}{2024/05/06}{2024bj} +\ProvidesExplClass{easybook}{2024/05/07}{2024bk} {Easily typesetting Chinese theses or books} \bool_new:N \l__eb_compile_draft_bool @@ -301,7 +301,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e}[2021/11/15] \RequirePackage{etoolbox} -\ProvidesExplPackage{easybase}{2024/05/06}{2024bj} +\ProvidesExplPackage{easybase}{2024/05/07}{2024bk} {Easily typesetting Chinese theses or books} \cs_generate_variant:Nn \dim_set:Nn { NV } @@ -1663,7 +1663,7 @@ \c__ctex_headings_seq \RegisterTocName \eb_seq_map_inline:nn { - tocformat,tocformat+,tocformat~+, + tocformat,tocformat+,tocformat~+,tocformat*,toclabel, tocindent,tocrule,tocline,tocafter,between } { @@ -1752,6 +1752,13 @@ \IfHookEmptyTF{starttoc/after}{} {\iow_now:Nn \@mainaux { \RemoveFromHook{starttoc/after}[aux] }} } +\cs_set_protected:Npn \AllotPartialExt #1#2 + { + \tl_set:cn { ttl@partial#1 } {#2} + \AddToHookWithArguments{cmd/ttl@writepartial/before} + {\ttl@topartial{#1}{##1}{##2}} + } +\AllotPartialExt{lol}{pll} \cs_set_eq:NN \eb@ctexsetii \ctex_set:nn \cs_new_protected:Npn \SetTocStyle #1#2#3 @@ -2152,6 +2159,7 @@ \theoremstyle{default} \cs_undefine:N \proof \DeclareFloatList{theorem}{loe} + \AllotPartialExt{loe}{ple} \eb_preto_cmd:nn { listoftheorems } { \group_begin: @@ -2534,7 +2542,7 @@ } %</package> %<*tcolorbox> -\ProvidesExplFile{eb-tcolorbox.cfg}{2024/05/06}{2024bj} +\ProvidesExplFile{eb-tcolorbox.cfg}{2024/05/07}{2024bk} {Customization of tcolorbox for easybook} \cs_set_protected:Npn \addtotcbstyle #1#2 diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf Binary files differindex a2114bab15..803f92113a 100644 --- a/macros/latex/contrib/easybook/easybook.pdf +++ b/macros/latex/contrib/easybook/easybook.pdf diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex index 46e37747a0..cde9d6a75d 100644 --- a/macros/latex/contrib/easybook/easybook.tex +++ b/macros/latex/contrib/easybook/easybook.tex @@ -23,8 +23,8 @@ name = easybook, color-scheme = blue, title = EASYBOOK使用手册, - version = v2024bj, - date = 2024/05/06, + version = v2024bk, + date = 2024/05/07, authors = 瞿毅, info = 简便地排版中文学位论文或书籍, email = toquyi@163.com, @@ -928,6 +928,15 @@ \AllotCaptionExt{table}{lof} \newcommand{\listoffiguretables}{\listoffigures} % 同时输出图表目录的命令 \end{ctexexam} + \command{AllotPartialExt}[\marg{扩展名1}\marg{扩展名2}]\newtagv{2024bk} + 给目录文件扩展名为 \meta{扩展名1} 的目录分配扩展名为 \meta{扩展名2} 的局部目录,预注册的条目均无需再分配。用于搭配题注标题 \cs{caption} 命令和 \pkg*{titletoc} 宏包的局部题注目录命令。 + \begin{ctexexam} + \AllotPartialExt{loa}{pla} + \startlist[fancy]{loa} + \captionof{algorithm}{算法标题} + \stoplist[fancy]{loa} + \printlist[fancy]{loa}{}{} + \end{ctexexam} \command{SetTocStyle}[\marg{条目名}\marg{风格名}\marg{键值列表}] 定义条目类型名称为 \meta{风格名} 的目录风格。使用 \cs*{ctexset} 命令设置目录样式时,除了条目标题定义选项 \option{tocline},其它选项只有在目录输出命令前设置才有效,定义完目录风格后用 \cs{UseTocStyle} 命令可以在正文中任意位置生效。如果是没有 \ding{73} 符号的选项,\meta{条目名} 设置为 \module*{toc}。 \command{UseTocStyle}[\marg{条目名}\marg{风格名}\marg{扩展名}] @@ -959,9 +968,9 @@ \keyval{bibetween}{代码钩子} 与选项 \option{between} 类似,是英文章节标题目录(如果启用)标题代码钩子。 \keychoice{dotalign}{\fbox{true},false} - 引导线选项 \option{dotalign} 可以使目录引导线右端对齐并与页码保持一定间距,否则会与页码相连。 + 将目录页码装进一个右对齐的水平盒子里。这样可以使目录引导线右端对齐并与页码保持一定间距,否则会与页码相连。 \keyval{pagenumwd}{刚性长度}\Default{1.55em} - 目录条目页码的宽度。开启 \option{dotalign} 选项时宽度越大引导线与页码的距离就越大。 + 设置开启 \option{dotalign} 选项时页码水平盒子的宽度。 \keyval{tocafter-every}{距离命令}\Default{\cs*{hspace}\Marg{1em}} 统一设置所有类型条目编号与标题间的代码(仅支持上述预注册的条目)。 \keyval{tocindent-every}{刚性长度} @@ -1507,6 +1516,7 @@ \end{version} \shortversion{v = 2024aw,date = 2022/04/22,changes = 新增新建章节标题命令 \cs{NewTitleCommand} 和 \cs{NewTitleEntryCommand}。} \shortversion{v = 2024bb,date = 2022/04/26,changes = 增加对 \pkg*{thmtools} 宏包定理环境目录 \cs{listoftheorems} 的支持。} + \shortversion{v = 2024bk,date = 2022/05/07,changes = 新增局部题注目录分配命令 \cs{AllotPartialExt}。} \end{changelog} \nocite{*} diff --git a/macros/latex/contrib/frenchmath/frenchmath.dtx b/macros/latex/contrib/frenchmath/frenchmath.dtx index 6af5bc2038..4b042e9ef6 100644 --- a/macros/latex/contrib/frenchmath/frenchmath.dtx +++ b/macros/latex/contrib/frenchmath/frenchmath.dtx @@ -20,7 +20,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e}[2005/12/01] \ProvidesPackage{frenchmath} - [2024/05/04 v3.0 .dtx Typesetting mathematics according to French rules] + [2024/05/07 v3.1 .dtx Typesetting mathematics according to French rules] %</package> %<*driver> \documentclass{ltxdoc} @@ -65,7 +65,7 @@ %</driver> % \fi % -% \CheckSum{320} +% \CheckSum{322} % % \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 @@ -192,12 +192,15 @@ % - Développement et intégration de l'extension mathgreeks % - Mise à jour de la documentation} % +% \changes{v3.1}{07/05/2024}{ +% - Correction de bug pour les macros varnothing et AMSvarnothing} +% % \GetFileInfo{frenchmath.sty} % % \title{L'extension \textsf{frenchmath}\thanks{Ce document -% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 04/05/2024.}} +% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 07/05/2024.}} % \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}} -% \date{4 mai 2024} +% \date{7 mai 2024} % \maketitle % \tableofcontents % @@ -616,6 +619,7 @@ % $\phi$. % } % qui se marie particulièrement bien avec la police usuelle Latin Modern. +% Ainsi les options précédentes de \textsf{frenchmath} fonctionnent toujours. % % Les commandes |\alpha|, |\beta|, \ldots |\pi|, etc. % produisent alors les lettres en forme droite $\alpha$, $\beta$, \ldots, $\pi$, etc. @@ -851,8 +855,9 @@ they will not be redefined} } \@ifundefined{varnothing}{% de amssymb + \@ifundefined{text}{\RequirePackage{amstext}}{} \newcommand\varnothing{% \usefont évite de déclarer AMSb - \mathord{\text{\usefont{U}{AMSb}{m}{n}\symbol{"3F}}}} + \mathord{\text{\usefont{U}{msb}{m}{n}\symbol{"3F}}}} }{ \PackageWarningNoLine{frenchmath}{\string\varnothing\space already defined, @@ -881,7 +886,7 @@ \newcommand\AMSvarnothing{% doit être appelé après \setmathfont ? \AtEndPreamble{\AtBeginDocument{% après actions de unicode-math \renewcommand\varnothing{% - \mathord{\text{\usefont{U}{AMSb}{m}{n}\symbol{"3F}}}} + \mathord{\text{\usefont{U}{msb}{m}{n}\symbol{"3F}}}} }} } % \end{macrocode} diff --git a/macros/latex/contrib/frenchmath/frenchmath.pdf b/macros/latex/contrib/frenchmath/frenchmath.pdf Binary files differindex 390f22cede..070aec4914 100644 --- a/macros/latex/contrib/frenchmath/frenchmath.pdf +++ b/macros/latex/contrib/frenchmath/frenchmath.pdf diff --git a/macros/latex/contrib/litesolution/doc/litesolution.pdf b/macros/latex/contrib/litesolution/doc/litesolution.pdf Binary files differindex f22da56fc8..8d9efb2ba3 100644 --- a/macros/latex/contrib/litesolution/doc/litesolution.pdf +++ b/macros/latex/contrib/litesolution/doc/litesolution.pdf diff --git a/macros/latex/contrib/litesolution/doc/litesolution.tex b/macros/latex/contrib/litesolution/doc/litesolution.tex index 901dd4c49a..678e4cd4aa 100644 --- a/macros/latex/contrib/litesolution/doc/litesolution.tex +++ b/macros/latex/contrib/litesolution/doc/litesolution.tex @@ -1,20 +1,22 @@ -\documentclass[mtpro2]{litesolution} +\documentclass[mtpro2,twoside,openany]{litesolution} \usepackage[listings]{tcolorbox} \lstset{language=[LaTeX]TeX,basicstyle=\small\ttfamily,breaklines=true,columns=flexible} \title{\sffamily The \pkg{LiteSolution} Class} \subtitle{\sffamily\scshape Hangzhou Dianzi University} -\bioinfo{Mingyu Hsia (\mailto{xiamyphys@hdu.edu.cn})\quad|\quad\today\quad|\quad Version 2.2a} +\bioinfo{Mingyu Hsia (\mailto{xiamyphys@hdu.edu.cn})\quad|\quad\today\quad|\quad Version 2.2b} \cover[checkerboard]{schrodinger}\coverhead[3]{universe} \begin{document} -\maketitle[DarkSlateGray] +\maketitle[DarkSlateGray] +\frontmatter\tableofcontents\mainmatter \chapterimage{\UPFadingImage*[trim={0 {.9\paperheight} 0 0},clip]{Beautiful-realities}} -\chapter{User Manual For The \pkg{LiteSolution} Class} -\section{Introduction} +\chapter{Introduction to the \pkg{LiteSolution} Class} + +\section{Preface} This is the document for the \pkg{LiteSolution} class, which is designed for typesetting solutions of problems in exams, textbooks, etc. @@ -48,12 +50,14 @@ The \mode{hideanswer} mode can hide contents in \cmd{solution} environment and \ The \mode{mtpro2}, \mode{newtx} and \mode{newtxsf} modes can format the font of formulas in the document. Please check if mtpro2 font has been installed on your computer correctly before using \mode{mtpro2} mode. -\section{Related packages} +\section{Related Packages} \begin{description} \item[Package \pkg{notebeamer}] provides macros for inputting slides on note papers quickly. \item[Package \pkg{fadingimage}] provides macros for inputting full width picture at the edges of pages quickly. \end{description} +\chapter{Settings \& Usages of this Class} + \section{Cover Configurations} \subsection{The cover page configurations} @@ -70,7 +74,7 @@ The \mode{mtpro2}, \mode{newtx} and \mode{newtxsf} modes can format the font of \title{\sffamily The \pkg{LiteSolution} Class} \subtitle{\sffamily\scshape Hangzhou Dianzi University} \bioinfo{Mingyu Hsia (\mailto{xiamyphys@hdu.edu.cn}) - \quad|\quad\today\quad|\quad Version 2.2a} + \quad|\quad\today\quad|\quad Version 2.2b} \cover[checkerboard]{schrodinger} \coverhead[5]{universe} \begin{document} \maketitle[Midnightblue] @@ -84,6 +88,32 @@ The \mode{mtpro2}, \mode{newtx} and \mode{newtxsf} modes can format the font of This command can assign the format of the image at every chapters begin and you can adjust the format of the image with the \pkg{fadingimage} package. +\section{Preset Packages} + +This template has preset many packages. The following packages are the common ones + +\begin{table}[htbp] + \centering\small + \begin{tabular}{l l l l l l l l} + \toprule + \pkg{amsthm} & \pkg{amssymb} & \pkg{bm} & \pkg{booktabs} & + \pkg{cancel} & \pkg{caption} & \pkg{circuitikz} & \pkg{datetime} \\ + \midrule + \pkg{derivative} & \pkg{diagbox} & \pkg{esvect} & \pkg{extarrows} & + \pkg{fadingimage} & \pkg{fancyhdr} & \pkg{fixdif} & \pkg{fontawesome5} \\ + \midrule + \pkg{geometry} & \pkg{graphics} & \pkg{graphicx} & \pkg{hyperref} & + \pkg{indentfirst} & \pkg{lipsum} & \pkg{mathtools} & \pkg{multicol} \\ + \midrule + \pkg{multirow} & \pkg{nicematrix} & \pkg{notebeamer} & \pkg{paracol} & + \pkg{pgfplots} & \pkg{physics2} & \pkg{qrcode} & \pkg{refstyle} \\ + \midrule + \pkg{setspace} & \pkg{siunitx} & \pkg{tabularx} & \pkg{tasks} & + \pkg{wallpaper} & \pkg{xcolor} & \pkg{xeCJK} & \pkg{xfrac} \\ + \bottomrule + \end{tabular} +\end{table} + \section{Preset Commands} \subsection{The \cmd{ans} command} @@ -92,7 +122,7 @@ This command can assign the format of the image at every chapters begin and you \ans {<contents>} \end{verbatim} -This command can underline the answer, and if mode \mode{noans} is enabled, the answer will be hidden. +This command can underline the answer, and if mode \mode{noans} is enabled the answer will be hidden. \subsection{The \cmd{solute} command} @@ -114,7 +144,7 @@ This command can create a fixable answer box when the mode \mode{noans} is enabl \subsection{The \cmd{problem} environment} \begin{tcblisting}{sidebyside,colback=DarkGreen!5,colframe=DarkGreen!80} -\begin{problem}[Keywords]\leavevmode +\begin{problem}[<Keywords>]\leavevmode \begin{tasks}(2) \task Choice A \task[\true] Choice B \task Choice C \task Choice D @@ -140,39 +170,14 @@ This command can create a fixable answer box when the mode \mode{noans} is enabl \end{tcblisting} \end{minipage} -\subsection{Equation test} - -\[\i\hbar\partial_t\psi(\mathbf x,t)=-(\i\hbar c\bm\alpha\cdot\bm\nabla+\beta mc^2)\psi(\mathbf x,t)\] - -\section{Preset packages} - -This template has preset many packages. The following packages are the common ones - -\begin{table}[htbp] - \centering\small - \begin{tabular}{l l l l l l l l} - \toprule - \pkg{amsthm} & \pkg{amssymb} & \pkg{bm} & \pkg{booktabs} & - \pkg{cancel} & \pkg{caption} & \pkg{circuitikz} & \pkg{datetime} \\ - \midrule - \pkg{derivative} & \pkg{diagbox} & \pkg{esvect} & \pkg{extarrows} & - \pkg{fadingimage} & \pkg{fancyhdr} & \pkg{fixdif} & \pkg{fontawesome5} \\ - \midrule - \pkg{geometry} & \pkg{graphics} & \pkg{graphicx} & \pkg{hyperref} & - \pkg{indentfirst} & \pkg{lipsum} & \pkg{mathtools} & \pkg{multicol} \\ - \midrule - \pkg{multirow} & \pkg{nicematrix} & \pkg{notebeamer} & \pkg{paracol} & - \pkg{pgfplots} & \pkg{physics2} & \pkg{qrcode} & \pkg{refstyle} \\ - \midrule - \pkg{setspace} & \pkg{siunitx} & \pkg{tabularx} & \pkg{tasks} & - \pkg{wallpaper} & \pkg{xcolor} & \pkg{xeCJK} & \pkg{xfrac} \\ - \bottomrule - \end{tabular} -\end{table} +\section{Equation test} -\clearpage\appendix\def\thesection{Appendix} +\[\begin{cases} + \i\hbar\partial_t\psi(\mathbf x,t)=\ab(-\frac{\hbar^2}{2m}\bm\nabla^2+V)\\ + \i\hbar\partial_t\psi(\mathbf x,t)=-(\i\hbar c\bm\alpha\cdot\bm\nabla+\beta mc^2)\psi(\mathbf x,t) +\end{cases}\] -\section{Original code for the cover head} +\section*{Original Code for the Cover Head} \setstretch{1.15} \lstinputlisting{figure/universe.tex} diff --git a/macros/latex/contrib/litesolution/tex/litesolution.cls b/macros/latex/contrib/litesolution/tex/litesolution.cls index 96d68b2164..0f59d89630 100644 --- a/macros/latex/contrib/litesolution/tex/litesolution.cls +++ b/macros/latex/contrib/litesolution/tex/litesolution.cls @@ -21,7 +21,7 @@ \NeedsTeXFormat{LaTeX2e} \PassOptionsToPackage{no-math}{fontspec} \PassOptionsToPackage{svgnames}{xcolor} -\ProvidesClass{litesolution}[2024/05/06 v2.2a LiteSolution document class] +\ProvidesClass{litesolution}[2024/05/07 v2.2b LiteSolution document class] \RequirePackage{kvoptions} \RequirePackage{etoolbox} \SetupKeyvalOptions{family=LITE, prefix=LITE@, setkeys=\kvsetkeys} @@ -37,16 +37,9 @@ \DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{book}} \ProcessKeyvalOptions*\relax -\LoadClass[letterpaper,11pt,openany]{book} +\LoadClass[letterpaper,11pt]{book} \RequirePackage{setspace,datetime,caption,booktabs,multicol,diagbox,paracol} -\RequirePackage[inline]{enumitem} -\RequirePackage[notelinecolor=MidnightBlue,notemargin=.75in]{notebeamer} -\RequirePackage[nokeyprefix]{refstyle} -\newref{eq}{refcmd=(\ref{#1}),name={\sffamily eq.~},Name={\sffamily Eq.~}} -\newref{fig}{name={\sffamily fig.~},Name={\sffamily Fig.~}} -\newref{tab}{name={\sffamily tab.~},Name={\sffamily Tab.~}} -\geometry{margin=1in} \linespread{1.3} \ddmmyyyydate \captionsetup{labelsep=period,labelfont={bf,sf},font=small} @@ -55,8 +48,15 @@ \AtBeginEnvironment{paracol}{\nointerlineskip} \AfterEndEnvironment{paracol}{\nointerlineskip} \columnratio{.64} +\RequirePackage[inline]{enumitem} \setlist[enumerate]{itemsep=.5ex} \setlist[itemize]{itemsep=.5ex} +\RequirePackage[notelinecolor=MidnightBlue,notemargin=.75in]{notebeamer} +\geometry{margin=1in} +\RequirePackage[nokeyprefix]{refstyle} +\newref{eq}{refcmd=(\ref{#1}),name={\sffamily eq.~},Name={\sffamily Eq.~}} +\newref{fig}{name={\sffamily fig.~},Name={\sffamily Fig.~}} +\newref{tab}{name={\sffamily tab.~},Name={\sffamily Tab.~}} \RequirePackage{graphics,graphicx,wallpaper,pagecolor} \graphicspath{{./figure/}{./figures/}{./image/}{./images/}{./graphics/}{./graphic/}{./pictures/}{./picture/}} @@ -73,12 +73,10 @@ \let\Bbbk\relax \RequirePackage[mono=false]{libertine} }{\relax} - \ifdefstring{\LITE@math}{newtx}{% \RequirePackage[libertine,mono=false]{newtx} \let\Bbbk\relax }{\relax} - \ifdefstring{\LITE@math}{newtxsf}{% \RequirePackage{newtxsf,mathrsfs} \RequirePackage[mono=false]{libertine} @@ -113,7 +111,7 @@ \RequirePackage{circuitikz,pgfplots,fadingimage} \usetikzlibrary{arrows,tikzmark,patterns,calc,angles,quotes,intersections} \tikzset{>=stealth', -every picture/.append style={% + every picture/.append style={% line join=round,line cap=round,thick }} \pgfplotsset{compat=1.8} @@ -144,17 +142,18 @@ every picture/.append style={% \IfValueT{#1}{\gdef\@coverpattern{#1}} \gdef\@cover{#2}} \RenewDocumentCommand\maketitle{O{MidnightBlue}}{ - \newgeometry{margin=0in}\newpagecolor{#1!10} + \begin{titlepage} + \newgeometry{margin=0in}\newpagecolor{#1!15} \tikz[remember picture,overlay]{ \ifcsname @coverhead\endcsname - \node[rotate=\@coverheadrotate] at ($(current page.center)+(0,.35*\paperheight)$) {\includegraphics[width=\paperwidth]{\@coverhead}}; + \node [rotate=\@coverheadrotate] at ($(current page.center)+(0,.35*\paperheight)$) {\includegraphics[width=\paperwidth]{\@coverhead}}; \fi \fill [white,opacity=.5] ($(current page.south west)+(.2*\paperwidth,.6*\paperheight)$) rectangle (current page.south east); \fill [white,opacity=.5] ($(current page.south west)+(.3*\paperwidth,.7*\paperheight)$) rectangle (current page.south east); \ifcsname @cover\endcsname \node [opacity=.5] at ($(current page.south west)+(.65*\paperwidth,.3*\paperheight)$) {\includegraphics[height=.3\paperheight]{\@cover}}; \ifcsname @coverpattern\endcsname - \fill [pattern=\@coverpattern,pattern color=#1!10!white!50!white!50] ($(current page.south west)+(.3*\paperwidth,0)$) rectangle ++ (.7*\paperwidth,.6\paperheight); + \fill [pattern=\@coverpattern,pattern color=#1!15!white!25] ($(current page.south west)+(.3*\paperwidth,0)$) rectangle ++ (.7*\paperwidth,.6\paperheight); \fi\fi \node [darkgray] at ($(current page.south west)+(.65*\paperwidth,.65*\paperheight)$) {\Huge\bfseries\@title}; \ifcsname @subtitle\endcsname @@ -162,9 +161,24 @@ every picture/.append style={% \fi \ifcsname @bioinfo\endcsname \node [gray,opacity=.4] at ($(current page.south)+(.15*\paperwidth,.075*\paperheight)$) {\large\@bioinfo}; - \fi}\restoregeometry\restorepagecolor + \fi} + \end{titlepage} + \restoregeometry\restorepagecolor + \if@twoside + \clearpage% + \newpagecolor{#1!15!white!50} + \thispagestyle{empty}% + \null\clearpage + \fi\restorepagecolor } +\RequirePackage{tocloft} +\setlength{\cftbeforetoctitleskip}{6\p@} +\setlength{\cftaftertoctitleskip}{24\p@} +\setlength{\cftbeforesecskip}{3\p@} +\def\contentsname{\sffamily\scshape\hfill Contents\hfill} +\setcounter{tocdepth}{1} + \let\@chapapptmp\@chapapp \def\@chapapp{\textsc{\@chapapptmp}} \def\chapterimage#1{\gdef\@chapterimage{#1}} @@ -180,7 +194,7 @@ every picture/.append style={% \fi \ifnum \c@secnumdepth >\m@ne \if@mainmatter - \parbox{2cm} + \parbox{6em} {\centering\HUGE\normalfont\bfseries\textcolor{darkgray}\thechapter\vskip4\p@\normalsize\bfseries\textcolor{darkgray}{\bfseries\sffamily\@chapapp}}% \fi \fi @@ -201,18 +215,42 @@ every picture/.append style={% \interlinepenalty\@M \huge \bfseries #1\par\nobreak \vskip 28\p@}} +\let\cleardoublepage=\clearpage +\renewcommand*{\cleardoublepage}{\clearpage\if@twoside \ifodd\c@page\else +\ifnum \thechapter=0 + \vspace*{\fill} + {\centering\itshape\Large This page was intentionally left blank.\par} + \vspace{\fill} +\else + \clearpage% + \thispagestyle{empty}% + \null\clearpage +\fi +\thispagestyle{empty}\newpage +\if@twocolumn\hbox{}\newpage\fi\fi\fi} \RequirePackage{fancyhdr} \pagestyle{fancy} \let\oldheadrule\headrule \renewcommand{\headrule}{{\color{gray}\oldheadrule}} - \renewcommand{\headrulewidth}{1pt}\cfoot{} - \fancyhead[OL]{\color{darkgray}\nouppercase\leftmark} - \fancyhead[OR]{\color{darkgray}\sffamily\thepage} - \fancyhead[ER]{\color{darkgray}\nouppercase\rightmark} - \fancyhead[EL]{\color{darkgray}\sffamily\thepage} + \renewcommand{\headrulewidth}{1pt} + \if@twoside\cfoot{} + \fancyhead[OL]{\color{darkgray}\nouppercase\leftmark} + \fancyhead[OR]{\color{darkgray}\sffamily\thepage} + \fancyhead[ER]{\color{darkgray}\nouppercase\rightmark} + \fancyhead[EL]{\color{darkgray}\sffamily\thepage} + \else + \fancyhead[L]{\color{darkgray}\nouppercase\leftmark} + \fancyhead[R]{\color{darkgray}\nouppercase\rightmark} + \cfoot{\color{darkgray}\sffamily\thepage} + \fi \setlength{\headheight}{14pt} +\theoremstyle{definition} +\newtheorem{problem}{\color{DarkGreen}\faIcon{pen-square}~\textsc{\textsf{Problem}}}[chapter] +\newtheorem*{solution}{\color{MidnightBlue}\faIcon{check-square}~\textsc{\textsf{Solution}}} +\newtheorem*{scratch}{\color{MidnightBlue}\faIcon{check-square}~\textsc{\textsf{Scratch}}} +\newtheorem*{note}{\color{DarkRed}\faIcon{info-circle}~\textsc{\textsf{Note}}} \RequirePackage{comment} \ifdefstring{\LITE@answer}{hideanswer}{% \def\ans#1{\underline{\phantom{#1}}} @@ -232,9 +270,5 @@ every picture/.append style={% \def\true{\addtocounter{task}{1}\faIcon{check-circle}} } \DeclareRobustCommand\solute{\@ifstar\s@solute\@solute} - -\theoremstyle{definition} -\newtheorem{problem}{\color{DarkGreen}\faIcon{pen-square}~\textsc{\textsf{Problem}}}[chapter] -\newtheorem*{solution}{\color{MidnightBlue}\faIcon{check-square}~\textsc{\textsf{Solution}}} -\newtheorem*{scratch}{\color{MidnightBlue}\faIcon{check-square}~\textsc{\textsf{Scratch}}} -\newtheorem*{note}{\color{DarkRed}\faIcon{info-circle}~\textsc{\textsf{Note}}}
\ No newline at end of file +%% +%% End of file `litesolution.cls'. diff --git a/macros/latex/contrib/mathgreeks/mathgreeks.dtx b/macros/latex/contrib/mathgreeks/mathgreeks.dtx index e6df4bc3d1..1290c1a7fd 100644 --- a/macros/latex/contrib/mathgreeks/mathgreeks.dtx +++ b/macros/latex/contrib/mathgreeks/mathgreeks.dtx @@ -20,7 +20,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e}[2005/12/01] \ProvidesPackage{mathgreeks} - [2024/05/04 v1.1 .dtx Math Greek letters] + [2024/05/07 v1.2 .dtx Math Greek letters] %</package> %<*driver> \documentclass[11pt]{article} @@ -94,6 +94,7 @@ % % \changes{v1.0}{2024/04/30}{Initial version} % \changes{v1.1}{2024/05/04}{Adding the libsans option; a few changes in the doc} +% \changes{v1.2}{2024/05/07}{A clarification in the documentation about the option shape=it} % % \GetFileInfo{mathgreeks.sty} % @@ -199,7 +200,7 @@ % cmbright \\ % \hline % \end{tabular} -% \caption{font options\label{table:font}} +% \caption{\normalfont{font options}\label{table:font}} % \end{center} % \end{table} % @@ -342,8 +343,9 @@ % and the \texttt{Euler} font does not have the variants "\varrho" and "\varsigma". % The \texttt{Symbolsmallscale} font is identical to Symbol but reduced in size by 90\,\%; % \texttt{Symbol} and \texttt{Symbolsmallscale} have no bold version. -% \texttt{mathdesign=Garamond} yields a virtual font -% that may not always work. +% ^^A\texttt{mathdesign=Garamond} yields a virtual font that may not always work. +% For several fonts, the upright shape is obtained with the attribute \texttt{shape=it} +% and not \texttt{shape=n}. % % \newlength\legendwidth % \setlength\legendwidth{3.2cm} @@ -352,7 +354,7 @@ % \begin{center} % \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{\:}c|} % \hline -% \makebox[\legendwidth][l]{\textbf{upgreek=...}} & \makebox[8.4cm]{Résult} +% \makebox[\legendwidth][l]{\textbf{upgreek=...}} & \makebox[8.4cm]{Result} % & \makebox[1cm]{enc} & \makebox[1cm]{fam} & shape \\ % \hline % \textbf{Symbol} @@ -373,7 +375,7 @@ % \begin{center} % \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{}c|} % \hline -% \textbf{mathdesign=...} & \makebox[8.4cm]{Résult} & enc & fam & shape \\ +% \textbf{mathdesign=...} & \makebox[8.4cm]{Result} & enc & fam & shape \\ % \hline % \doublerows{Utopia} % & \mathgreeksfont{enc=OML,fam=mdput} \greektable @@ -399,7 +401,7 @@ % \begin{center} % \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{}c|} % \hline -% \textbf{kpfonts=...} & \makebox[8.4cm]{Résult} & enc & fam & shape \\ +% \textbf{kpfonts=...} & \makebox[8.4cm]{Result} & enc & fam & shape \\ % \hline % \doublerows{normal} % & \mathgreeksfont{enc=OML,fam=jkp} \greektable @@ -419,7 +421,7 @@ % \begin{center} % \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{}c|} % \hline -% Boolean options & \makebox[8.2cm]{Résult} & enc & fam & shape \\ +% Boolean options & \makebox[8.2cm]{Result} & enc & fam & shape \\ % \hline % \doublerows{fourier} % & \mathgreeksfont{enc=FML,fam=futmi} \greektable @@ -493,7 +495,7 @@ % \begin{center} % \begin{tabular}{|l|c|} % \hline -% \textbf{lgrmath=...} & Résult \\ +% \textbf{lgrmath=...} & Result \\ % \hline % \lgrtbl{Alegreya-LF} % \lgrtbl{Cochineal-LF} @@ -527,7 +529,7 @@ % \begin{center} % \begin{tabular}{|l|c|} % \hline -% \textbf{fontspec=...} & Résult \\ +% \textbf{fontspec=...} & Result \\ % \hline % \fontspectbl{DejaVu Serif} % \fontspectbl{DejaVu Sans} @@ -543,7 +545,7 @@ % \begin{center} % \begin{tabular}{|l|c|} % \hline -% \textbf{fontspec=...} & Résult \\ +% \textbf{fontspec=...} & Result \\ % \hline % \fontspectbl{Linux Libertine O} % ^^A\fontspectbl{Linux Biolinum O} @@ -560,7 +562,7 @@ % \begin{center} % \begin{tabular}{|l|c|} % \hline -% \textbf{unicode-math=...} & Résult \\ +% \textbf{unicode-math=...} & Result \\ % \hline % \fontspectbl[unicode-math]{Latin Modern Math} % \fontspectbl[unicode-math]{STIX Two Math} diff --git a/macros/latex/contrib/mathgreeks/mathgreeks.pdf b/macros/latex/contrib/mathgreeks/mathgreeks.pdf Binary files differindex 284c293b56..5addc4ecb1 100644 --- a/macros/latex/contrib/mathgreeks/mathgreeks.pdf +++ b/macros/latex/contrib/mathgreeks/mathgreeks.pdf diff --git a/macros/latex/contrib/synthslant/LICENSE b/macros/latex/contrib/synthslant/LICENSE new file mode 100644 index 0000000000..f8b699e6eb --- /dev/null +++ b/macros/latex/contrib/synthslant/LICENSE @@ -0,0 +1,415 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2008-05-04 + +Copyright 1999 2002-2008 LaTeX3 Project + Everyone is allowed to distribute verbatim copies of this + license document, but modification of it is not allowed. + + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under +which the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright +and which you wish to distribute. This license may be particularly +suitable if your work is TeX-related (such as a LaTeX package), but +it is written in such a way that you can use it even if your work is +unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', +below, gives instructions, examples, and recommendations for authors +who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed +and modified, as well as conditions under which modified versions of +that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you +the freedom to make and distribute modified versions of your work +that conform with whatever technical specifications you wish while +maintaining the availability, integrity, and reliability of +that work. If you do not see how to achieve your goal while +meeting these conditions, then read the document `cfgguide.tex' +and `modguide.tex' in the base LaTeX distribution for suggestions. + + +DEFINITIONS +=========== + +In this license document the following terms are used: + + `Work' + Any work being distributed under this License. + + `Derived Work' + Any work that under any applicable law is derived from the Work. + + `Modification' + Any procedure that produces a Derived Work under any applicable + law -- for example, the production of a file containing an + original file associated with the Work or a significant portion of + such a file, either verbatim or with modifications and/or + translated into another language. + + `Modify' + To apply any procedure that produces a Derived Work under any + applicable law. + + `Distribution' + Making copies of the Work available from one person to another, in + whole or in part. Distribution includes (but is not limited to) + making any electronic components of the Work accessible by + file transfer protocols such as FTP or HTTP or by shared file + systems such as Sun's Network File System (NFS). + + `Compiled Work' + A version of the Work that has been processed into a form where it + is directly usable on a computer system. This processing may + include using installation facilities provided by the Work, + transformations of the Work, copying of components of the Work, or + other activities. Note that modification of any installation + facilities provided by the Work constitutes modification of the Work. + + `Current Maintainer' + A person or persons nominated as such within the Work. If there is + no such explicit nomination then it is the `Copyright Holder' under + any applicable law. + + `Base Interpreter' + A program or process that is normally needed for running or + interpreting a part or the whole of the Work. + + A Base Interpreter may depend on external components but these + are not considered part of the Base Interpreter provided that each + external component clearly identifies itself whenever it is used + interactively. Unless explicitly specified when applying the + license to the Work, the only applicable Base Interpreter is a + `LaTeX-Format' or in the case of files belonging to the + `LaTeX-format' a program implementing the `TeX language'. + + + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work +are not covered by this license; they are outside its scope. In +particular, the act of running the Work is not restricted and no +requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you +received it. Distribution of only part of the Work is considered +modification of the Work, and no right to distribute such a Derived +Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a +complete, unmodified copy of the Work as distributed under Clause 2 +above, as long as that Compiled Work is distributed in such a way that +the recipients may install the Compiled Work on their system exactly +as it would have been installed if they generated a Compiled Work +directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without +restriction, modify the Work, thus creating a Derived Work. You may +also distribute the Derived Work without restriction, including +Compiled Works generated from the Derived Work. Derived Works +distributed in this manner by the Current Maintainer are considered to +be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify +your copy of the Work, thus creating a Derived Work based on the Work, +and compile this Derived Work, thus creating a Compiled Work based on +the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may +distribute a Derived Work provided the following conditions are met +for every component of the Work unless that component clearly states +in the copyright notice that it is exempt from that condition. Only +the Current Maintainer is allowed to add such statements of exemption +to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement + for a component of the Work when that component is used with the + Base Interpreter, then, wherever this component of the Work + identifies itself to the user when used interactively with that + Base Interpreter, the replacement component of this Derived Work + clearly and unambiguously identifies itself as a modified version + of this component to the user when used interactively with that + Base Interpreter. + + b. Every component of the Derived Work contains prominent notices + detailing the nature of the changes to that component, or a + prominent reference to another file that is distributed as part + of the Derived Work and that contains a complete and accurate log + of the changes. + + c. No information in the Derived Work implies that any persons, + including (but not limited to) the authors of the original version + of the Work, provide any support, including (but not limited to) + the reporting and handling of errors, to recipients of the + Derived Work unless those persons have stated explicitly that + they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; + if your distribution of a modified component is made by + offering access to copy the modified component from a + designated place, then offering equivalent access to copy + the Work from the same or some similar place meets this + condition, even though third parties are not compelled to + copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, + unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may +distribute a Compiled Work generated from a Derived Work, as long as +the Derived Work is distributed to all recipients of the Compiled +Work, and as long as the conditions of Clause 6, above, are met with +regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not +apply to, the modification, by any method, of any component so that it +becomes identical to an updated version of that component of the Work as +it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative +format, where the Work or that Derived Work (in whole or in part) is +then produced by applying some process to that format, does not relax or +nullify any sections of this license as they pertain to the results of +applying that process. + +10. a. A Derived Work may be distributed under a different license + provided that license itself honors the conditions listed in + Clause 6 above, in regard to the Work, though it does not have + to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under a different license, that + Derived Work must provide sufficient documentation as part of + itself to allow each recipient of that Derived Work to honor the + restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to +the Work, nor does this license place any restrictions on aggregating +such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent +complete compliance by all parties with all applicable laws. + + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in +writing, the Copyright Holder provides the Work `as is', without +warranty of any kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and fitness for a +particular purpose. The entire risk as to the quality and performance +of the Work is with you. Should the Work prove defective, you assume +the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing +will The Copyright Holder, or any author named in the components of the +Work, or any other party who may distribute and/or modify the Work as +permitted above, be liable to you for damages, including any general, +special, incidental or consequential damages arising out of any use of +the Work or out of inability to use the Work (including, but not limited +to, loss of data, data being rendered inaccurate, or losses sustained by +anyone as a result of any failure of the Work to operate with any other +programs), even if the Copyright Holder or said author or said other +party has been advised of the possibility of such damages. + + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder +explicitly and prominently states near the primary copyright notice in +the Work that the Work can only be maintained by the Copyright Holder +or simply that it is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer +who has indicated in the Work that they are willing to receive error +reports for the Work (for example, by supplying a valid e-mail +address). It is not required for the Current Maintainer to acknowledge +or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there +is no Current Maintainer, or the person stated to be Current +Maintainer of the work cannot be reached through the indicated means +of communication for a period of six months, and there are no other +significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with +any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of +the Work through the following steps: + + 1. Make a reasonable attempt to trace the Current Maintainer (and + the Copyright Holder, if the two differ) through the means of + an Internet or similar search. + + 2. If this search is successful, then enquire whether the Work + is still maintained. + + a. If it is being maintained, then ask the Current Maintainer + to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active + maintenance is taken by the Current Maintainer, then announce + within the pertinent community your intention to take over + maintenance. (If the Work is a LaTeX work, this could be + done, for example, by posting to comp.text.tex.) + + 3a. If the Current Maintainer is reachable and agrees to pass + maintenance of the Work to you, then this takes effect + immediately upon announcement. + + b. If the Current Maintainer is not reachable and the Copyright + Holder agrees that maintenance of the Work be passed to you, + then this takes effect immediately upon announcement. + + 4. If you make an `intention announcement' as described in 2b. above + and after three months your intention is challenged neither by + the Current Maintainer nor by the Copyright Holder nor by other + people, then you may arrange for the Work to be changed so as + to name you as the (new) Current Maintainer. + + 5. If the previously unreachable Current Maintainer becomes + reachable once more within three months of a change completed + under the terms of 3b) or 4), then that Current Maintainer must + become or remain the Current Maintainer upon request provided + they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact +that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should +immediately provide, within the Work, a prominent and unambiguous +statement of your status as Current Maintainer. You should also +announce your new status to the same pertinent community as +in 2b) above. + + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and +recommendations for authors who are considering distributing their +works under this license. These authors are addressed as `you' in +this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* +conditions that differ significantly from those in this license, then +do not refer to this license anywhere in your work but, instead, +distribute your work under a different license. You may use the text +of this license as a model for your own license, but your license +should not refer to the LPPL or otherwise give the impression that +your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains +the motivation behind the conditions of this license. It explains, +for example, why distributing LaTeX under the GNU General Public +License (GPL) was considered inappropriate. Even if your work is +unrelated to LaTeX, the discussion in `modguide.tex' may still be +relevant, and authors intending to distribute their works under any +license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own +personal use, without also meeting the above conditions for +distributing the modified component. While you might intend that such +modifications will never be distributed, often this will happen by +accident -- you may forget that you have modified that component; or +it may not occur to you when allowing others to access the modified +version that you are thus distributing it and violating the conditions +of this license in ways that could have legal implications and, worse, +cause problems for the community. It is therefore usually in your +best interest to keep your copy of the Work identical with the public +one. Many works provide ways to control the behavior of that work +without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both +an explicit copyright notice including your name and the year the work +was authored and/or last substantially modified. Include also a +statement that the distribution and/or modification of that +component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2005 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.3 or later is part of all distributions of LaTeX + % version 2005/12/01 or later. + % + % This work has the LPPL maintenance status `maintained'. + % + % The Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins + % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions +given in this license document would apply, with the `Work' referring +to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being +generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' +referring to any `LaTeX-Format', and both `Copyright Holder' and +`Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your +Work, change `maintained' above into `author-maintained'. +However, we recommend that you use `maintained', as the Maintenance +section was added in order to ensure that your Work remains useful to +the community even when you can no longer maintain and support it +yourself. + +Derived Works That Are Not Replacements +--------------------------------------- + +Several clauses of the LPPL specify means to provide reliability and +stability for the user community. They therefore concern themselves +with the case that a Derived Work is intended to be used as a +(compatible or incompatible) replacement of the original Work. If +this is not the case (e.g., if a few lines of code are reused for a +completely different task), then clauses 6b and 6d shall not apply. + + +Important Recommendations +------------------------- + + Defining What Constitutes the Work + + The LPPL requires that distributions of the Work contain all the + files of the Work. It is therefore important that you provide a + way for the licensee to determine which files constitute the Work. + This could, for example, be achieved by explicitly listing all the + files of the Work near the copyright notice of each file or by + using a line such as: + + % This work consists of all files listed in manifest.txt. + + in that place. In the absence of an unequivocal list it might be + impossible for the licensee to determine what is considered by you + to comprise the Work and, in such a case, the licensee would be + entitled to make reasonable conjectures as to which files comprise + the Work. diff --git a/macros/latex/contrib/synthslant/Makefile b/macros/latex/contrib/synthslant/Makefile new file mode 100644 index 0000000000..d8de419230 --- /dev/null +++ b/macros/latex/contrib/synthslant/Makefile @@ -0,0 +1,302 @@ +### name: Makefile +### synopsis: Build `synthslant' style file and documentation +### author: Dr. Christoph L. Spiel +### GNU make version: 4.3 + + +SHELL := /bin/sh + + +BASE64 := base64 +BASE64_FLAGS := + + +DVIPDFMX := dvipdfmx +DVIPDFMX_FLAGS := + + +DVIPS := dvips +DVIPS_FLAGS := -d1 # debug \special{} + + +LATEX := /usr/bin/env max_print_line=2147483647 pdflatex +LATEX_FLAGS := -file-line-error -halt-on-error -interaction=nonstopmode +LATEX_RERUN_TRIGGER := '^Package rerunfilecheck Warning: File [^ ]* has changed' +LATEX_WARNING := '^LaTeX (|[A-Za-z0-9_]* )Warning:' + + +MAKEINDEX := makeindex +MAKEINDEX_FLAGS := -q + + +METAPOST := mpost +METAPOST_FLAGS := -file-line-error -interaction=nonstopmode -tex=latex + + +SPELLCHECK := aspell +SPELLCHECK_FLAGS := \ + --add-tex-command='citenum p' --add-tex-command='code p' \ + --add-tex-command='Cref p' --add-tex-command='cref p' \ + --add-tex-command='cs p' \ + --add-tex-command='DescribeEnv p' --add-tex-command='DescribeMacro p' \ + --add-tex-command='marg p' --add-tex-command='meta p' \ + --add-tex-command='oarg p' \ + --lang=en_US --mode=tex + + +SOURCE_FILES := LICENSE Makefile synthslant.dtx synthslant.ins + + + +.PHONY: all +all: sty pdf + + +.PHONY: sty +sty: synthslant.sty + + +.PHONY: pdf +pdf: doc gauge + + +.PHONY: doc +doc: synthslant.pdf + + +.PHONY: gauge +gauge: synthslant-gauge.pdf + + +.PHONY: cpio +cpio: + cd ..; \ + echo $(addprefix synthslant/,$(SOURCE_FILES)) | \ + cpio -o | \ + gzip > "synthslant-$$(date +%Y-%m-%d).cpio.gz" + + +.PHONY: tar +tar: + cd ..; \ + tar czf "synthslant-$$(date +%Y-%m-%d).tar.gz" \ + $(addprefix synthslant/,$(SOURCE_FILES)) + + +.PHONY: clean +clean: + $(RM) ./*.aux ./*.brf ./*.dvi ./*.glg ./*.glo ./*.gls + $(RM) ./*.hd ./*.idx ./*.ilg ./*.ind ./*.loe ./*.lof ./*.log ./*.lot + $(RM) ./*.mp ./*.mps ./*.mpx ./*.out ./*.pdf ./*.ps ./*.toc + $(RM) mptextmp.* mpxerr.tex + $(RM) README README.html RELEASE-HOWTO RELEASE-HOWTO.html + $(RM) compare-with-the-gimp.eps compare-with-the-gimp.png + + +.PHONY: mostlyclean +mostlyclean: clean + + +.PHONY: maintainer-clean +maintainer-clean: mostlyclean + $(RM) ./*.base64 ./*.ist ./*.mp ./*.sty ./*.tex + + +.PHONY: perf +perf: synthslant-gauge.tex synthslant.sty + perf stat --repeat=10 -- $(LATEX) $(LATEX_FLAGS) -interaction batchmode -draftmode $< + + +.PHONY: tool-check +tool-check: + @printf '*** LATEX = "%s"\n' '$(LATEX)' + $(LATEX) --version + @printf '\n\n*** MAKEINDEX = "%s"\n' '$(MAKEINDEX)' + $(MAKEINDEX) < /dev/null + @printf '\n\n*** METAPOST = "%s"\n' '$(METAPOST)' + $(METAPOST) --version + @printf '\n*** BASE64 = "%s"\n' '$(BASE64)' + $(BASE64) --version + @printf '\n\nTool check passed.\n' + + +.PHONY: spell-check +spell-check: + @sed -e '\#<DISABLE-SPELL-CHECK/>#d' \ + -e '\#<DISABLE-SPELL-CHECK>#,\#</DISABLE-SPELL-CHECK>#d' < synthslant.dtx | \ + sed -e 's/^ *%%*//' | \ + sed -e 's/\\-//g' -e 's/|[^|]*|/ /g' | \ + $(SPELLCHECK) $(SPELLCHECK_FLAGS) list | \ + sort | uniq | fmt | sed -e 's/ / /g' + + +.PHONY: update-docs +update-docs: pdf + cp -f synthslant.pdf synthslant-gauge.pdf docs + + +define HELP_SCREEN +Selected Phony Targets +---------------------- +all: Make everything there is to make. This is the .DEFAULT_GOAL. + +clean: Remove some products. + +cpio: In the parent directory create a cpio(1) archive of the + project source files whose name is time-stamped. + +doc: Build "synthslant.pdf" the Syntslant documentation. + +gauge: Build "synthslant-gauge.pdf" the Syntslant gauge and example + file. + +maintainer-clean: Remove every product file that can be rebuilt even + if uncommon tools are necessary. + +mostlyclean: Remove some more products than clean:. + +pdf: Build doc: and gauge:. + +sty: Only extract "synthslant.sty" from "synthslant.dtx". This + operation requires LaTeX (-> $(LATEX)) and nothing else. + +tar: In the parent directory create a tar(1) file of the project + source files whose name is time-stamped. + +tool-check: Check whether some of the required tools to build the + project are available. + + +Selected Implicit Rules +----------------------- +%.dvi %.pdf: %.dtx + Run LaTeX or pdfLaTeX (-> $(LATEX)) on dtx source until a + fix-point is reached. + +%.dvi %.pdf: %.tex + Run LaTeX or pdfLaTeX (-> $(LATEX)) on tex file until a + fix-point is reached. + +%.mx.pdf: %.dvi + Convert dvi to pdf via dvipdfmx (-> $(DVIPDFMX)). + +%.ps: %.dvi + Convert dvi to ps via dvips (-> $(DVIPS)). + + +Some Explicit Rules +------------------- +README.html: + Convert "README.md" to html. Requires markdown(1). + +README: Convert "README.html" to plain text. Requires w3m(1). + +endef + +.PHONY: help +help: + $(info $(HELP_SCREEN)) + + + +.PRECIOUS: %.mps + + + +define MAKE_INDEX_AND_GLOSSARY +sed -e '/@/d' < $*.idx > ,$*.idx; mv ,$*.idx $*.idx; \ +$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s synthslant.ist -t $*.ilg -o $*.ind $*.idx; \ +$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s gglo.ist -t $*.glg -o $*.gls $*.glo +endef + +define GREP_LATEX_WARNINGS +test -e $*.log && grep -E $(LATEX_WARNING) $*.log | uniq +endef + +%.dvi %.pdf: %.dtx + $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.gls ./$*.glo ./$*.lof ./$*.lot ./$*.toc + $(LATEX) $(LATEX_FLAGS) -draftmode $< + $(MAKE_INDEX_AND_GLOSSARY) + $(LATEX) $(LATEX_FLAGS) $< + $(MAKE_INDEX_AND_GLOSSARY) + while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \ + do \ + $(LATEX) $(LATEX_FLAGS) $<; \ + $(MAKE_INDEX_AND_GLOSSARY); \ + done + $(GREP_LATEX_WARNINGS) + + +%.dvi: LATEX=latex + + +%.dvi %.pdf: %.tex + $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.lof ./$*.lot ./$*.toc + $(LATEX) $(LATEX_FLAGS) -draftmode $< + $(LATEX) $(LATEX_FLAGS) $< + while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \ + do \ + $(LATEX) $(LATEX_FLAGS) $<; \ + done + $(GREP_LATEX_WARNINGS) + + +%.mx.pdf: %.dvi + $(DVIPDFMX) $(DVIPDFMX_FLAGS) -o $@ $< + + +%.ps: %.dvi + $(DVIPS) $(DVIPS_FLAGS) -o $@ $< + + +%.mps: %.mp + $(METAPOST) -s 'outputtemplate="%j.mps"' $(METAPOST_FLAGS) $< + + +%.eps: %.png + convert $< -compress lzw eps2:$@ + + +%.html: %.md + markdown $< > $@ + +%: %.html + w3m -cols 79 $< > $@ + + + +synthslant.sty synthslant.ist synthslant-gauge.tex \ +compare-with-the-gimp.png.base64 shear-transform.mp title.mp: \ + synthslant.ins synthslant.dtx + $(LATEX) $(LATEX_FLAGS) $< + + +synthslant.pdf: \ + synthslant.dtx \ + compare-with-the-gimp.png \ + shear-transform.mps \ + title.mps \ + | synthslant.sty + +synthslant.dvi: \ + synthslant.dtx \ + compare-with-the-gimp.eps \ + shear-transform.mps \ + title.mps + + +compare-with-the-gimp.png: compare-with-the-gimp.png.base64 + $(BASE64) $(BASE64_FLAGS) --decode $< > $@ + + +shear-transform.mps: shear-transform.mp + + +title.mps: title.mp + + +## compare-with-the-gimp.png: compare-with-the-gimp.orig.png +## convert $< -depth 8 -resize 50% -set colorspace Gray -separate -average $@ +## +## compare-with-the-gimp.png.base64: compare-with-the-gimp.png +## $(BASE64) $(BASE64_FLAGS) $< > $@ diff --git a/macros/latex/contrib/synthslant/README.md b/macros/latex/contrib/synthslant/README.md new file mode 100644 index 0000000000..1b1c719189 --- /dev/null +++ b/macros/latex/contrib/synthslant/README.md @@ -0,0 +1,64 @@ +# SynthSlant – Synthetic slanting of glyphs + +LaTeX package `synthslant` slants short pieces of text to the right or to the left. + + +## Installation + +The minimally necessary files to install synthslant are *synthslant.ins* and *synthslant.dtx*. +Running LaTeX on *synthslant.ins* in particular produces *synthslant.sty*: + + latex synthslant.ins + +After extraction from *synthslant.dtx* place *synthslant.sty* in a directory mentioned in your +TEXINPUTS paths or copy it into one of the directories for your LaTeX installation's *sty*-files +and run **mktexlsr** or equivalent. + +To build the documentation it is easier to use the GNU *Makefile*: + + make + +LuaLaTeX users will want to override the default LaTeX command **pdflatex** with **lualatex** by +saying + + make LATEX=lualatex + +To construct the manual *synthslant.pdf* a working [MetaPost](https://tug.org/metapost.html) +installation is required. Moreover, besides the usual POSIX utilities +[**base64**](https://www.gnu.org/software/coreutils/manual/html_node/base64-invocation.html) is +needed to recover the graphics file stored as printable ASCII characters inside of +*synthslant.dtx*. Cautious users can run + + make tool-check + +ahead to verify that the required utilities are installed and working. +For an overview over the most important *Makefile* targets use + + make help + + +## Usage + +Load the package with the usual incantation + + \usepackage{synthslant} + +See Section 2 of the package documentation for available options. + + +## Documentation + +The package documentation can be found +[online](https://cspiel.github.io/synthslant/). + + +## Credits + +Synthslant is written by Ch. L. Spiel <cspiel@users.sourceforge.org>. + + +## License + +Released under the +[LaTeX Project Public License v1.3c](https://www.latex-project.org/lppl.txt) +or later. diff --git a/macros/latex/contrib/synthslant/RELEASE-HOWTO.md b/macros/latex/contrib/synthslant/RELEASE-HOWTO.md new file mode 100644 index 0000000000..13435ef66d --- /dev/null +++ b/macros/latex/contrib/synthslant/RELEASE-HOWTO.md @@ -0,0 +1,51 @@ +# How to prepare a new release + +... and not make too many mistakes. + + +1. Check that the work-area is clean with respect to **git**-tracked + files. + + ``` git status ``` + +1. Update the date stamp of `\ProvidesPackage`. + +1. (Temporarily) Zero the `\overfullrule`s of the documentation and + the example files. + +1. Thoroughly clean the work-area: + + ```make maintainer-clean``` + +1. Rebuild: + + ```make``` + +1. Check that all _*.sty_ and _*.pdf_ files are in good shape. + +1. Push the documentation files created in the previous step down into + the *docs* directory: + + ```make update-docs``` + +1. Undo the `\overfullrule` change. + +1. Commit the changes: + + ``` + git add . + ``` + + and finally + + ``` + git commit + ``` + +1. Tag the commit with the version string of `\ProvidesPackage`: + + ```git tag v1.23``` + +1. Push the changes to the public repository: + + ```git push origin master --tags``` diff --git a/macros/latex/contrib/synthslant/docs/index.md b/macros/latex/contrib/synthslant/docs/index.md new file mode 100644 index 0000000000..c8c312f388 --- /dev/null +++ b/macros/latex/contrib/synthslant/docs/index.md @@ -0,0 +1,4 @@ +### Package Documentation + +- Comprehensive `synthslant` documentation: [synthslant.pdf](https://cspiel.github.io/synthslant/synthslant.pdf) +- `synthslant` test and demonstration: [synthslant-gauge.pdf](https://cspiel.github.io/synthslant/synthslant-gauge.pdf) diff --git a/macros/latex/contrib/synthslant/docs/synthslant-gauge.pdf b/macros/latex/contrib/synthslant/docs/synthslant-gauge.pdf Binary files differnew file mode 100644 index 0000000000..425e7944ef --- /dev/null +++ b/macros/latex/contrib/synthslant/docs/synthslant-gauge.pdf diff --git a/macros/latex/contrib/synthslant/docs/synthslant.pdf b/macros/latex/contrib/synthslant/docs/synthslant.pdf Binary files differnew file mode 100644 index 0000000000..9b034b86c3 --- /dev/null +++ b/macros/latex/contrib/synthslant/docs/synthslant.pdf diff --git a/macros/latex/contrib/synthslant/synthslant.dtx b/macros/latex/contrib/synthslant/synthslant.dtx new file mode 100644 index 0000000000..f5424cf7fa --- /dev/null +++ b/macros/latex/contrib/synthslant/synthslant.dtx @@ -0,0 +1,5264 @@ +% \iffalse +% +% Copyright (C) 2024 by Ch. L. Spiel +% +% This work may be distributed and/or modified under the conditions +% of the LaTeX Project Public License, either version 1.3 of this +% license or (at your option) any later version. The latest version +% of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2003/12/01 or later. +% +% \fi +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} + +\tracingonline=0 + +%--\OnlyDescription +\EnableCrossrefs +\CodelineIndex +\RecordChanges + + +\PassOptionsToClass{a4paper}{article} +\PassOptionsToPackage{hyperfootnotes=false}{hyperref} +\PassOptionsToPackage{charter, scale=1.06}{newtxmath} +\PassOptionsToPackage{dvipsnames}{xcolor} + +\usepackage{amsmath} +\usepackage{booktabs} +\usepackage{caption} +\usepackage{dtk-logos} +\usepackage{enumitem} +\usepackage{etoolbox}%--\tracingpatches +\usepackage{fancyhdr} +\usepackage[T1]{fontenc} +\usepackage{fullwidth} +\usepackage{hypdoc} +\usepackage{hyphenat} +\usepackage{mathtools} +\iftrue + \usepackage[letterspace=0, shrink=10, stretch=10, tracking=true]{microtype} + \DeclareMicrotypeSet[tracking]{italics} + {encoding=*, font={SourceSerifPro-LF/m/it/*}} + \UseMicrotypeSet[tracking]{italics} + \SetTracking[context=synthnegslant, no ligatures={f}, spacing={10*,,}] + {encoding=*, shape=it}{10} +\else + \newcommand*{\textls}[2][]{#2} +\fi +\usepackage{needspace} +\usepackage{ragged2e} +\usepackage{setspace} +\usepackage[slant=.18, negslant=-.16]{synthslant} +\usepackage{titlesec} +\usepackage{tcolorbox} +\usepackage{titlesec}\renewcommand*{\bottomtitlespace}{.15\textheight}%nobottomtitles* +\usepackage{wrapfig} +\usepackage{xcolor} + + +\usepackage[default, lining, proportional, regular, semibold]{sourceserifpro} +\usepackage[lining, proportional, regular, semibold]{sourcesanspro} +\usepackage[lining, regular]{sourcecodepro} +\usepackage[xcharter]{newtxmath} +\setstretch{1.04166}% \baselineskip: 12.5pt + + +\makeatletter +\def\@get@fontclan#1-#2\relax{#1} +\newcommand*{\fontclan}{\expandafter\@get@fontclan\f@family\relax} +\makeatother + +\newcommand*{\proportionalliningfigures}{\fontfamily{\fontclan-LF}\selectfont} +\newcommand*{\proportionaloldstylefigures}{\fontfamily{\fontclan-OsF}\selectfont} +\newcommand*{\tabularliningfigures}{\fontfamily{\fontclan-TLF}\selectfont} +\newcommand*{\tabularoldstylefigures}{\fontfamily{\fontclan-TOsF}\selectfont} + +\newcommand*{\textdenominator}[1]{{\fontfamily{\fontclan-Dnom}\selectfont #1}} +\newcommand*{\textinferior}[1]{{\fontfamily{\fontclan-Inf}\selectfont #1}} +\newcommand*{\textnumerator}[1]{{\fontfamily{\fontclan-Numr}\selectfont #1}} +\newcommand*{\textsuperior}[1]{{\fontfamily{\fontclan-Sup}\selectfont #1}} + +\newcommand*{\nativetextfraction}[2] + {\mbox{\textnumerator{#1}\textfractionsolidus\textdenominator{#2}}} + +\makeatletter +\renewcommand*{\@makefnmark}{\hbox{\sf\textsuperior{\@thefnmark}}} +\newenvironment*{tabfigures} + {\edef\rmdefault{\fontclan-T\sourceserifpro@figurestyle}\rm\ignorespaces} + {\ignorespacesafterend} + +\newcommand*{\elseries}{\def\mdseries@rm{el}\def\mdseries@sf{el}\def\mdseries@tt{el}} +\newcommand*{\textel}[1]{{\elseries\textmd{#1}}} +\newcommand*{\lseries}{\def\mdseries@rm{l}\def\mdseries@sf{l}\def\mdseries@tt{l}} +\newcommand*{\textl}[1]{{\lseries\textmd{#1}}} +%%--\newcommand*{\mdseries}{\def\mdseries@rm{m}\def\mdseries@sf{m}\def\mdseries@tt{m}} +%%--\newcommand*{\textmd}[1]{{\mdseries\textmd{#1}}} +\newcommand*{\sbseries}{\def\bfseries@rm{sb}\def\bfseries@sf{sb}\def\bfseries@tt{sb}} +\newcommand*{\textsb}[1]{{\sbseries\textbf{#1}}} +\newcommand*{\bseries}{\def\bfseries@rm{b}\def\bfseries@sf{b}\def\bfseries@tt{b}} +\newcommand*{\textb}[1]{{\bseries\textbf{#1}}} +\newcommand*{\ebseries}{\def\bfseries@rm{k}\def\bfseries@sf{eb}\def\bfseries@tt{k}} +\newcommand*{\texteb}[1]{{\ebseries\textbf{#1}}} +\makeatother + + +\usepackage{cleveref} + + +\expandafter\GetFileInfo\expandafter{\jobname.sty} +\def\aspdfdate#1/#2/#3\relax{D:#1#2#3} +\edef\pdffiledate{\expandafter\aspdfdate\filedate\relax} + +\hypersetup{ + citecolor = blue, + colorlinks = true, + linkcolor = blue, + linktocpage = false, + pdfauthor={Dr. Christoph L. Spiel}, + pdfcreationdate={\pdffiledate}, + pdfkeywords={LaTeX, font, italic, oblique, slant, upright}, + pdflang=en-US, + pdfsubject={Synthetic generation of slanted glyphs in LaTeX}, + pdftitle={Package synthslant \fileversion}, + raiselinks = false, + urlcolor = [rgb]{0, 0, .5}% = navy +} + + +\makeatletter +\renewcommand*{\@dotsep}{10000} % suppress leaders +\patchcmd{\@dottedtocline}{\normalfont}{\bfseries}{\relax}{\PatchingFailed} +\makeatother + + +\Crefname{equation}{Equation}{Equations} +\crefname{equation}{Equ.}{Equs.} +\creflabelformat{equation}{#2#1#3} + +\Crefname{figure}{Figure}{Figures} +\crefname{figure}{Fig.}{Figs.} + +\Crefname{page}{Page}{Pages} +\crefname{page}{p.}{p.} + +\Crefname{section}{Section}{Sections} +\crefname{section}{Sec.}{Secs.} + +\Crefname{table}{Table}{Tables} +\crefname{table}{Tab.}{Tabs.} + + +\newcommand*{\floatcaptionwidth}{.79\textwidth} + +\captionsetup[figure]{font=small, justification=centerlast, labelfont=sc, width=\floatcaptionwidth} +\captionsetup[table]{font=small, justification=centerlast, labelfont=sc, width=\floatcaptionwidth} + + +\newsavebox{\listlabelbox} + +\sbox{\listlabelbox}{---} +\SetEnumitemKey{noindent}{ + label={---}, + labelwidth=\wd\listlabelbox, + leftmargin=! +} + +\SetEnumitemKey{nestedinspecialsection}{ + leftmargin=10pt +} + +\SetEnumitemKey{notopsep}{ + after=\vskip.8em plus .2em minus .4em, + partopsep=0pt, + topsep=0pt +} + + +\newlength{\marginindicatorsep} +\setlength{\marginindicatorsep}{10pt} + +\newcommand*{\marginalizesectionnumber}[1] + {\makebox[0pt][r]{#1\hspace{\marginindicatorsep}}} + + +\fancypagestyle{pagenumberonly}{ + \fancyhead[L]{} + \fancyhead[R]{\thepage} +} +\pagestyle{fancy} +\fancyhf{} +\fancyhead[L]{\rightmark} +\fancyhead[R]{\textsf{\thepage}} +\newcommand*{\resetfancyhead} + {\fancyhead[L]{\textsf{\textsc{\textls[20]{\nouppercase\rightmark}}}}} + +\renewcommand*{\headrulewidth}{0pt} +\renewcommand*{\sectionmark}[1] + {\def\truesectionname{#1}% + \markright{\textsf{\marginalizesectionnumber{\thesection}% + \textsc{\textls[20]{#1}}}}} +\renewcommand*{\subsectionmark}[1] + {\markright{\textsf{\marginalizesectionnumber{\thesubsection}% + \textsc{\textls[20]{\truesectionname:\enspace}}#1}}} + + +\titleformat{\section}[hang] + {\sffamily\Large\bfseries}{\marginalizesectionnumber{\thesection}}{0pt}{} +\titleformat{\subsection}[hang] + {\sffamily\large\bfseries}{\marginalizesectionnumber{\thesubsection}}{0pt}{} +\titleformat{\subsubsection}[hang] + {\sffamily\normalsize\bfseries}{\marginalizesectionnumber{\thesubsubsection}}{0pt}{} +\titleformat{\paragraph}[runin] + {\sffamily\normalsize\bfseries}{\theparagraph}{1em}{} + + +\let\footnoterule=\relax% suppress footnote rule +\interfootnotelinepenalty=10000 + +\makeatletter +\renewcommand*{\@makefntext}[1] + {\noindent + \llap{\let\@textsuperscript=\relax% use "normal" figures for the footnote numbers + \let\textsuperior=\relax + \@makefnmark + \hspace{\marginindicatorsep}}% separate the footnote number and the body + #1} +\makeatother + + +\pretocmd{\DescribeEnv}{\needspace{25pt}}{\relax}{\PrependingFailed} +\pretocmd{\DescribeMacro}{\needspace{25pt}}{\relax}{\PrependingFailed} + + +\setcounter{IndexColumns}{2} + + +\setlength{\columnsep}{20pt} +\setlength{\skip\footins}{25pt} +\setlength{\overfullrule}{3pt} + + + +\newrobustcmd*{\acronym}[1]{\mbox{\scshape\MakeLowercase{#1}}} + +\newcommand*{\application}[1]{\mbox{\sffamily #1}} + +\renewcommand*{\arraystretch}{1.12} + +\newcommand*{\bibauthor}[1]{\mbox{\textsc{#1}}} +\newcommand*{\bibtitle}[1]{\textit{#1}} +\newcommand*{\biburl}[1]{\url{#1}} + +\newcommand*{\bottomstrut}{\rule[-.5em]{0pt}{0pt}} + +\newenvironment*{codeexample} + {\vspace{.5\smallskipamount} + \par + \centering + \begin{minipage}{\linewidth} + \ttfamily + \begin{tabbing}} + {\end{tabbing} + \end{minipage} + \par + \vspace{.5\smallskipamount}} + +\makeatletter +\newcommand*{\citenum}[1]{\@nameuse{b@#1}} +\makeatother + +\def\code#1{\texttt{#1}} + +\newrobustcmd*{\command}[1]{\mbox{\textbf{#1}}} + +\newcommand*{\degree}{{}^\circ} + +\newcommand*{\doublequotes}[1]{\guillemetright\kern-.03333em #1\guillemetleft} + +\newcommand*{\dumpmacro}[1]{\texttt{\detokenize\expandafter{#1}}} + +\newcommand*{\filesystem}[1]{\mbox{\textit{#1\/}}} + +\newcommand*{\filledrectangle}[2]{\rule{#1}{#2}} +\newcommand*{\filledsquare}[1]{\filledrectangle{#1}{#1}} + +\newcommand*{\foreignphrase}[1]{\textsl{#1}} + +\makeatletter +\renewcommand*{\fps@figure}{htbp} +\renewcommand*{\fps@table}{htbp} +\makeatother + +\newcommand*{\hollowrectangle}[2] + {\setlength{\fboxrule}{.5pt}% + \setlength{\fboxsep}{0pt}% + \framebox{\rule{#1}{0pt}\rule{0pt}{#2}}} +\newcommand*{\hollowsquare}[1]{\hollowrectangle{#1}{#1}} + +\newcommand*{\logmacro}[1] + {\ifdef{#1} + {\message{^^JDump of macro \string#1 follows.^^J} + \message{\detokenize\expandafter{#1}} + \message{^^JEnd macro dump.^^J}} + {\message{^^JMacro \string#1 is not defined.^^J}}} + +\newenvironment*{maxipage} + {\fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth, + width=\textwidth + \marginparsep + \marginparwidth}% + \begin{fullwidth}} + {\end{fullwidth}} + +\newenvironment*{multilinecodeexample} + {\begin{quote}\tt + \def\indent{\mbox{}\hspace{25pt}}% + \def\pushright{\mbox{}\hfill}% + \ignorespaces} + {\end{quote}} + +\newcommand*{\needtocspace}[1][3] + {\addtocontents{toc}{\protect\needspace{#1\baselineskip}}} + +\newcommand*{\numberset}[1]{\mathbb{#1}} + +\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}} +\newcommand*{\programname}[1]{\mbox{\textbf{#1}}} +\newcommand*{\propername}[1]{\mbox{\textsc{#1}}} + +\newcommand*{\pstrickslogo}{\mbox{PSTricks}} + +\newcommand*{\quarterspace}{\hspace{.25em}} + +\newcommand*{\sample}[1] + {\setbox0=\hbox{#1}% H: 6.19849pt, /: 7.49817 + \mbox{\raisebox{\dimexpr -.15em - \dp0}{\tiny$\llcorner$}% + \kern-.15em\copy0\kern-.15em + \raisebox{\ifdim\ht0>.7em\dimexpr\ht0 - .1em\else .45em\fi}{\tiny$\urcorner$}}} + +\newcommand*{\sinceversion}[1]{% modeled after \NewIn of "doc.dtx" + \leavevmode + \marginpar{\hfill\textcolor{\markercolor}{\sf\proportionaloldstylefigures\scshape #1}}% + \ignorespaces +} + +\newcommand*{\singlequotes}[1]{\mbox{\guilsinglright #1\guilsinglleft}} + +\definecolor{customred1}{rgb}{.890, .282, .282}%-- https://paletton.com/ +\definecolor{customred2}{rgb}{.831, .110, .110} +\definecolor{customred3}{rgb}{.686, .043, .043} +\definecolor{customred4}{rgb}{.569, .000, .000} +\definecolor{customred5}{rgb}{.420, .000, .000} +\newcommand*{\specialsectionheading}[1]{\textcolor{\markercolor}{\textit{\textbf{#1}}}} +\newcommand*{\markercolor}{customred4} +\newcommand*{\specialsectionmarker}{\color{\markercolor}\filledsquare{5pt}} +\newcommand*{\specialsectionbegin} + {\llap{\raisebox{1pt}{\specialsectionmarker}% + \hspace{\marginindicatorsep}}} +\newcommand*{\specialsectionend} + {\ifmmode + \specialsectionmarker + \else + \leavevmode + \unskip + \penalty9999\mbox{}\nobreak + \hfill + \quad + \mbox{\specialsectionmarker}% + \fi} +\newtoggle{printspecialsectionmarker} +\NewDocumentEnvironment{specialsection}{m m} + {\Needspace{4\baselineskip}% + \toggletrue{printspecialsectionmarker}% + \begin{list} + {\specialsectionheading{#1\ifblank{#2}{}{\textup{\space---\space#2}}}} + {\itemindent=0pt + \labelwidth=10pt + \leftmargin=15pt + \listparindent=15pt + \parsep=0pt + \topsep=\medskipamount} + \newcommand*{\specialsectionendhere} + {\specialsectionend + \global\togglefalse{printspecialsectionmarker}} + \item + \nointerlineskip + \leavevmode\par + \noindent} + {\iftoggle{printspecialsectionmarker}{\specialsectionend}{\relax}% + \end{list}} + + \newenvironment*{caution}[1][]{\begin{specialsection}{Caution}{#1}}{\end{specialsection}} + \newenvironment*{example}[1][]{\begin{specialsection}{Example}{#1}}{\end{specialsection}} + \newenvironment*{futuredirection}[1][] + {\begin{specialsection}{Anticipated Changes \& Possible Extensions}{#1}\small} + {\end{specialsection}} + \newenvironment*{important}[1][]{\begin{specialsection}{Important}{#1}}{\end{specialsection}} + \newenvironment*{note}[1][]{\begin{specialsection}{Note}{#1}}{\end{specialsection}} + \newenvironment*{notes}[1][]{\begin{specialsection}{Notes}{#1}}{\end{specialsection}} + \newenvironment*{tip}[1][]{\begin{specialsection}{Tip}{#1}}{\end{specialsection}} + \newenvironment*{tips}[1][]{\begin{specialsection}{Tips}{#1}}{\end{specialsection}} + \newenvironment*{usecase}[1][]{\begin{specialsection}{Use Case}{#1}\small}{\end{specialsection}} + \newenvironment*{usecases}[1][]{\begin{specialsection}{Use Cases}{#1}\small}{\end{specialsection}} + +\newcommand*{\specialcodesectionheading}[1]{\textcolor{\markercolor}{\textbf{\textit{#1}}}} +\newenvironment*{specialcodesection}[1] + {\Needspace{4\baselineskip}% + \begin{tcolorbox}[colback=white, colframe=\markercolor, + bottomrule=0pt, leftrule=5pt, rightrule=0pt, toprule=0pt] + \sffamily + \begin{list} + {\specialcodesectionheading{#1}} + {\itemindent=0pt + \labelwidth=20pt + \leftmargin=25pt + \listparindent=15pt + \parsep=0pt + \topsep=\medskipamount} + \item + \nointerlineskip + \leavevmode\par + \noindent} + {\end{list} + \end{tcolorbox}} + \newenvironment*{anticipatedchange} + {\begin{specialcodesection}{Anticipated Change}} + {\end{specialcodesection}} + \newenvironment*{implementationnote} + {\begin{specialcodesection}{Implementation Note}} + {\end{specialcodesection}} + \newenvironment*{knownbug} + {\begin{specialcodesection}{Known Bug}} + {\end{specialcodesection}} + +\newenvironment*{suspendshortverb} + {\DeleteShortVerb{\|}} + {\MakeShortVerb{\|}} + +\definecolor{cold-silver}{cmyk}{.08, 0, 0, .18} +\newenvironment*{synopsis} + {\begin{tcolorbox}[boxrule=.25pt, colback=cold-silver]% + \phantomsection} + {\end{tcolorbox}} + +\newcommand*{\synthslantlogo} + {{\sf + S\hspace{-.06em}\synthslantbox{.15}{y}\hspace{.04em}nth% + \hspace{-.02em}% + Slant}} + +\newenvironment*{tablenotes} + {\medskip + \centering + \begin{minipage}{\floatcaptionwidth}} + {\end{minipage}} +\newcommand*{\tablenotemark}[1]{\smash{\textsuperscript{#1}}} + +\newcommand*{\termparbox}[1]{\parbox[t]{\linewidth}{#1\bottomstrut}} + +\newcommand*{\thousandsseparator}{\mbox{,}} + +\newcommand*{\tikzlogo}{\textrm{Ti\textit{k\/}Z}} + +\newcommand*{\topstrut}{\rule{0pt}{1.3em}} + +\newcommand*{\transpose}[1]{{#1}^{\text{T}}} + +\newlength{\ttellipsisgap} +\setlength{\ttellipsisgap}{.4em} +\newcommand*{\ttdots} + {\setbox0=\hbox{.}% + \wd0=0pt% + \copy0\kern\ttellipsisgap + \copy0\kern\ttellipsisgap + \box0\kern\ttellipsisgap} + +\newcommand*{\visualpar}{\textcolor{\markercolor}{\P}\linebreak[1]\enspace} + +\newenvironment*{widecodeexample} + {\begin{maxipage} + \flushright + \begin{minipage}{\textwidth} + \ttfamily + \begin{tabbing}} + {\end{tabbing} + \end{minipage} + \end{maxipage}} + + +\hyphenation{% https://hyphenateit.com/en-us +} + + +\newcommand*{\librecaslonmapline} + {LibreCsln-Italic-osf-t1--base LibreCsln-Italic + " -0.12 SlantFont AutoEnc_etzx2kxblronahmbt4swbkr7jb ReEncodeFont " + <[lcsln_etzx2k.enc <LibreCsln-Italic.pfb} +\ifdefined\pdfoutput + \ifnum\pdfoutput>0 + \pdfmapline{=\librecaslonmapline} + \else + \special{pdf:mapline \librecaslonmapline} + \fi +\else + \special{pdf:mapline \librecaslonmapline} +\fi + + +\begin{document} + \DocInput{synthslant.dtx} +\end{document} +%</driver> +%<*index-style> +actual '=' +heading_prefix "\\pagebreak[3]\\smallskip\n\n{\\sffamily\\bfseries\\large " +heading_suffix "}\\nopagebreak\n" +headings_flag 1 +level '>' +quote '!' +%</index-style> +% \fi +% +% +% \DoNotIndex{\-} +% \DoNotIndex{\begingroup,\bool,\box} +% \DoNotIndex{\DeclareOptionX,\def,\dim,\dimen,\discretionary,\draw} +% \DoNotIndex{\edef,\else} +% \DoNotIndex{\endgroup,\endmicrotypecontext,\endnegslantenvironment,\endslantenvironment} +% \DoNotIndex{\expandafter,\ExplSyntaxOff,\ExplSyntaxOn} +% \DoNotIndex{\fi,\font,\fontdimen,\fontspec,\fp} +% \DoNotIndex{\hbox,\hskip} +% \DoNotIndex{\ifcase,\ifcsdef,\ifdefined,\ifluatex,\ifmmode,\ifnum,\ifpdftex,\ifx,\itshape} +% \DoNotIndex{\kern} +% \DoNotIndex{\l,\let,\llap} +% \DoNotIndex{\mbox,\microtypecontext} +% \DoNotIndex{\NeedsTeXFormat} +% \DoNotIndex{\newbox,\newcommand,\NewDocumentCommand,\NewDocumentEnvironment,\newenvironment,\newrobustcmd} +% \DoNotIndex{\node,\nolinebreak} +% \DoNotIndex{\or} +% \DoNotIndex{\PackageInfo,\PackageWarning,\ProcessOptionsX,\providecommand,\ProvidesPackage} +% \DoNotIndex{\pdfoutput,\pdfrestore,\pdfsave,\pdfsetmatrix,\pstilt} +% \DoNotIndex{\relax,\RequirePackage} +% \DoNotIndex{\sbox,\skip,\space} +% \DoNotIndex{\tikz} +% \DoNotIndex{\upshape,\usebox} +% \DoNotIndex{\wd} +% +% +% \changes{v0.1}{2024-2-12}{Initial version} +% +% +% \pagenumbering{roman} +% +% \title{\synthslantlogo{} -- Synthetically Slanted Glyphs} +% \author{Ch.~L.~Spiel\footnote{\quarterspace\texttt{cspiel@users.sourceforge.org}}} +% \date{\fileversion\qquad \filedate} +% \maketitle +% \thispagestyle{empty} +% +% +% \begingroup +% \let\small=\normalsize +% \begin{abstract} +% \noindent +% Package~\packagename{synthslant} provides macros to slant arbitrary glyphs in both +% directions. It can be used to fake a real slanted font for \emph{short} pieces of text +% and it can generate startling effects, like, for example, upright italics. +% \end{abstract} +% \endgroup +% +% +% \iffalse +%<*title> +prologues := 3; + +string roman_font; +roman_font := "pplr8r"; % URW Palladio L - Roman + +string italics_font; +italics_font := "pplri8r"; % URW Palladio L - Italic + +string sample_text; +sample_text := "fga"; + +u := 70; + +font_scale := 7; + +color light_gray; +light_gray := .8 white; + +color original_color, slanted_color; +original_color := light_gray; +slanted_color := black; + +pair loc[]; +loc[1] := (0, 0); % roman +loc[2] := (1.9u, 0); % italics +loc[3] := (2.03u, 1.1u); % slanted roman +loc[4] := (-.1u, -1.1u); % upright italics + +picture roman; +roman := thelabel.rt(sample_text infont roman_font scaled font_scale, loc[1]); + +picture italics; +italics := thelabel.rt(sample_text infont italics_font scaled font_scale, loc[2]); + +picture slanted_roman; +slanted_roman := thelabel.rt(sample_text infont roman_font scaled font_scale slanted .2, loc[3]); + +picture upright_italics; +upright_italics := thelabel.rt(sample_text infont italics_font scaled font_scale slanted -.2, loc[4]); + + +beginfig(1); + draw roman withcolor original_color; + draw italics withcolor original_color; + draw slanted_roman withcolor slanted_color; + draw upright_italics withcolor slanted_color; +endfig; +end +%</title> +% \fi +% +% +% \begin{center} +% \includegraphics{title.mps} +% \end{center} +% +% \vfill +% +% \begingroup +% \footnotesize +% \noindent +% This package is copyright \textcopyright~2024 Ch.~L.~Spiel. It may be distributed and/or +% modified under the conditions of the \LaTeX{} Project Public License \acronym{(LPPL)}, +% either version~1.3c of this license or --~at your option~-- any later version. This work +% has the \acronym{LPPL} maintenance status \doublequotes{author-maintained}.\par +% \endgroup +% +% +% \clearpage +% \thispagestyle{pagenumberonly} +% \tableofcontents +% +% \vspace{\fill} +% +% \begingroup +% \footnotesize +% \singlespacing +% \noindent +% The font samples~\singlequotes{fga} on the title page +% were generated with the help of \MP{} using \doublequotes{\acronym{URW} Palladio~L} +% in styles~\singlequotes{roman} and~\singlequotes{italic}. +% The affine transformations were \code{slanted .2} for the slanted roman and +% \code{slanted -.2} for the upright italics.\par +% \endgroup +% +% +% \clearpage +% \thispagestyle{pagenumberonly} +% \listoftables +% \bigskip +% \listoffigures +% +% +% \clearpage +% \pagenumbering{arabic} +% \section{Introduction}\label{sec:introduction} +% +% The \packagename{synthslant} package provides a translator (e.\,g.~\LaTeX, \pdfLaTeX, or +% \LuaLaTeX) independent interface to shearing glyphs. It implements a generic operation where +% a short piece of text gets slanted forward or backward. Moreover, specialized macros for the +% two most important use cases are provided, namely slanting an upright font forward and making +% an italics font upright. Unbeknown to some users, \pdfTeX{} performs a similar operation +% under the hood: of the 40\thousandsseparator210~map lines in my \filesystem{pdftex.map} +% currently 1\thousandsseparator236 instruct \pdfTeX{} to artificially slant a font. This +% means some three percent of the shapes are generated this way. +% +% Similar transformations can be achieved by other means. I elaborate on one of the +% alternatives in \cref{sec:alternative} on \cpageref{sec:alternative}. +% Package~\packagename{synthslant} however focuses on ease of use and strict locality of the +% glyph manipulation. +% +% +% \subsection{Appeal for Artificially Slanted Type}\label{sec:appleal-for-artificially-slanted} +% +% Artificially slanted type have a bad reputation. Whenever there is an order to round up the +% usual font suspects synthetically slanted, bolded\footnote{Package~\packagename{amsbsy} +% defines a \doublequotes{Poor Man's Bold} macro~\cs{pmb} that works by +% \singlequotes{overprinting}. The authors of \packagename{amsbsy} recommend to prefer +% package~\packagename{bm} for bold mathematical symbols, though.}, and condensed type along +% with artificial small-caps swiftly are stuffed into the black Maria.\footnote{See for example +% Ref.~\citenum{strizver:2014}, p.~97, but compare p.~142 and also +% Ref.~\citenum{middendorp:2014}, p.~68n, for a more nuanced assessment.} I can retrace this +% condescension for synthetic bold and condensed variants. They spoil the glyphs' outline +% because they do not (and cannot) conserve the necessary proportions. For small-caps the +% problems are somewhat minor and I wonder how far one could get with an +% \propername{OpenType}~font that supports a \code{size}~axis\index{font>axis>size=\code{size}} +% as well as an \code{opsz}~axis\index{font>axis>opsz=\code{opsz}} in the necessary ranges to +% construct convincing small-caps out of the multiple-master font. +% +% In my view artificial slanting keeps much of the font's character intact. In fact one +% accusation of synthetically slanted type is that is creates less contrast than a proper +% italic~\cite[p.~141]{strizver:2014} to which I object that less contrast can in fact be +% enough contrast in a particular setting. Moreover, small contrast with respect to the main +% type is a problem of second order. It does not devalue the shape \foreignphrase{per se} as +% is true for artificial bold and condensed fonts. +% +% What seems to have gotten lost in the discussion is the shapes of true italics that were +% designed alongside with the roman type. If we have an unbiased look at it --~for example at +% the title~page of this manual~-- the italic versions of the upright characters are so +% markedly different that I would like to ask whether they match the upright shape in a strict +% sense. For the double-storey~\sample{a} becomes single-storey, the start of the loop +% of~\sample{g} moves from the far left into the middle. Alongside, the aspect ratio of both +% of the counters change. These defy the common guidelines~\cite[Ch.~6]{stamm:2020} of font +% pairing. We can make sense of the seeming contradiction by recognizing that the italics +% shape is not simply slanted, but creates tension in respect to the upright type by a variety +% of additional design features. A famous quote of \propername{Zuzana Li\v{c}ko} applies once +% again: +% +% \begin{quote} +% The most popular typefaces are the easiest to read; their popularity has made them +% disappear from conscious cognition. It becomes impossible to tell if they are easy to read +% because they are commonly used, or if they are commonly used because they are easy to read. +% \end{quote} +% +% +% \subsection{Some History}\label{sec:history} +% +% Italics accompanying a roman font date back to one of the earliest print shops, namely that +% of \href{https://it.wikipedia.org/wiki/Aldo_Manuzio}{\propername{Aldus Manutius}} around +% 1500\:A.\,C\@. Artificially slanted, also known as \singlequotes{oblique}, versions of +% upright fonts appear in the twentieth century, when type designers and foundries start to +% save time and money by automatically constructing a slanted version of a given roman +% type~\cite[p.~68n]{middendorp:2014}. \packagename{Synthslant} closely follows on their +% steps. +% +% Some fonts in current \LaTeX{} distributions offer slanted series right out of the box. +% \foreignphrase{Eureka!} In particular the oldest (and once upon a time the only) font family +% shipping with \TeX, \href{https://tug.org/FontCatalogue/cmrfonts.html}{Computer Modern +% Roman}\index{font>Computer Modern Roman} --~nowadays member of the \acronym{CM}-Super +% family~-- is available in a deluge of almost thirty shapes. It covers not just slanted roman +% or slanted smallcaps but also slanted typewriter and somewhat surprisingly upright italics. +% Furthermore, the \LaTeXe{} font selection scheme provisions \singlequotes{\code{sl}} for +% slanted shapes and \singlequotes{\code{ui}} for upright italics~\cite{fntguide}. The former +% is accompanied by the macros~\cs{slshape} and~\cs{textsl}. +% +% \begin{wraptable}{r}{.382\textwidth} +% \renewcommand*{\floatcaptionwidth}{\textwidth} +% \small +% \centering +% \caption[Variable fonts with slant-axis] +% {A short list of some variable fonts with a slant axis (\code{slnt}).} +% \label{tab:open-type-slant-feature} +% +% \begin{tabular}{@{}l@{}} +% \toprule +% Font Name \\ +% \midrule +% Cairo\index{font>Cairo} \\ +% Commissioner\index{font>Commissioner} \\ +% Geologica\index{font>Geologica} \\ +% Gluten\index{font>Gluten} \\ +% Inter\index{font>Inter} \\ +% Recursive\index{font>Recursive} \\ +% Roboto Flex\index{font>Roboto Flex} \\ +% \bottomrule +% \end{tabular} +% \end{wraptable} +% +% Refer to \cref{tab:open-type-slant-feature} on the right for a brief list of variable +% fonts\footnote{See also the \LaTeX~Font Catalogue for +% \href{https://tug.org/FontCatalogue/opentypefonts.html}% +% {Fonts with \propername{OpenType} or \propername{TrueType}~Support} +% and search \href{https://fonts.google.com/}{Google Fonts} for families of +% \href{https://fonts.google.com/variablefonts?vfaxis=slnt}{variable fonts with a +% \code{slnt}-axis} or fonts with an \href{https://v-fonts.com/tags/C5}{unusual variation} at +% \href{https://v-fonts.com/}{Variable Fonts}.} that offer a slant-axis\footnote{The +% registered axis is called \code{slnt} and it is not to be confused with the +% \code{ital}~axis.}\index{font>axis>slant=\code{slant}}\index{font>axis>ital=\code{ital}} that +% can be controlled with \packagename{fontspec}'s\index{package>\packagename{fontspec}} +% \code{Slant}\footnote{Since \packagename{fontspec} version~2.9a as of 2024/2/13.}~key and +% \cref{tab:slanted-series-fonts} for a rather incomplete list of fonts that are shipped with +% slanted shapes. For these fonts \packagename{synthslant} is largely superfluous unless +% e.\,g.~they also come with an italics shape that is to be typeset upright. +% +% \begin{table} +% \small +% \centering +% \caption[Fonts with slanted series] +% {Selected fonts that come with their own slanted series.~\visualpar{} The table on +% the left-hand side shows serif fonts, the one on the right-hand side sans-serif +% fonts.} +% \label{tab:slanted-series-fonts} +% +% \newcommand*{\itshapemark}{\tablenotemark{\dag}}% +% +% \begin{tabular}[t]{@{}p{12em}@{}} +% \toprule +% Font Name \\ +% \midrule +% Arvo\index{font>Arvo} \\ +% Computer Modern Roman\index{font>Computer Modern Roman} \\ +% Domitian\index{font>Domitian} \\ +% Droid Serif\index{font>Droid Serif} \\ +% Erewhon\index{font>Erewhon} \\ +% Extended Charter\index{font>Extended Charter} \\ +% \acronym{GFS} Artemisia\index{font>GFS Artemisia=\acronym{GFS} Artemisia} \\ +% \acronym{GFS} Bodoni\index{font>GFS Bodoni=\acronym{GFS} Bodoni} \\ +% \acronym{GFS} Didot\index{font>GFSDidot=\acronym{GFS} Didot} \\ +% \\ +% \bottomrule +% \end{tabular} +% \qquad +% \begin{tabular}[t]{@{}p{12em}@{}} +% \toprule +% Font Name \\ +% \midrule +% Cabin\index{font>Cabin} \\ +% Clear Sans\index{font>Clear Sans} \\ +% Cuprum\index{font>Cuprum} \\ +% Fira Sans\index{font>Fira Sans} \\ +% Gandhi Sans\index{font>Gandhi Sans} \\ +% \acronym{Inria} Sans\index{font>Inria Sans=\acronym{Inria} Sans} \\ +% Lato\index{font>Lato}\itshapemark \\ +% Montserrat\index{font>Montserrat} \\ +% \acronym{PT} Sans\index{font>PT Sans=\acronym{PT} Sans} \\ +% Source Sans Pro\index{font>Source Sans Pro} \\ +% \bottomrule +% \end{tabular} +% +% \begin{tablenotes} +% \itshapemark\enspace The shape is activated with \cs{itshape}. +% \end{tablenotes} +% \end{table} +% +% It seems that the original idea of automatically shearing text in \LaTeX{} to simulate a +% slanted shape goes back to \propername{David Carlisle} who suggested to use the +% \pdfTeX-primitive \cs{pdfliteral} for shearing~\cite{tex-stackexchange-2013-12-7}. Shortly +% thereafter \propername{Bruno Le Floch} pointed to another \pdfTeX-primitive, namely +% \cs{pdfsetmatrix}, available with (in 2013) more recent +% \pdfTeX~versions~\cite{pdftex}.\footnote{The user-level manipulation of the transformation +% matrix has been part of the \acronym{PDF}-standard since its initial publication in +% 1993~\cite[Secs.~3.8 and~3.9]{adobe-pdf-1.0} in the form of operator~\code{cm} +% (\singlequotes{concat}~-- concatenate matrix to current transformation matrix).~\visualpar{} +% The primitive~\cs{pdfliteral} was implemented already in the first release of \pdfTeX{} +% in~1998~\cite{baskerville-pdftex-8-1:1998} and the primitive~\cs{pdfsetmatrix} joined 2007 in +% \pdfTeX~version~1.40.0~\cite{schroeder:2007}.} With the help of the latter affine +% transformations of arbitrary content can be coded directly by setting the transformation +% matrix. A slight variant of his code is used in this package for the \acronym{PDF}- and +% \packagename{l3draw}\index{package>\packagename{l3draw}}-slant~engines. The implementations +% for \pstrickslogo, \tikzlogo{}, and \packagename{fontspec}\packagename{fontspec} are trivial +% as they build upon shear~functions supplied by the respective packages. +% +% +% \subsection{Shear Transformation, Slant, and Angle}\label{sec:shear-transformation} +% +% \index{slant>operation} +% \index{shear>transformation} +% Mathematically the slant operation is a shear transformation, which can be expressed with the +% equation +% \begin{equation}\label{equ:shear-transformation} +% \begin{pmatrix} +% x' \\ +% y' +% \end{pmatrix} +% = +% \begin{pmatrix} +% 1 & \sin\alpha \\ +% 0 & 1 +% \end{pmatrix} +% \mathbin{} +% \begin{pmatrix} +% x \\ +% y +% \end{pmatrix}, +% \end{equation} +% +% \noindent +% where the vector~\(\transpose{(x, y)}\) is mapped to \(\transpose{(x'\!, y')}\) and both are +% elements of the two-dimensional drawing plane~\(\numberset{E}^2\)\!. Compare with +% \Cref{fig:shear-transform}. +% +% +% \iffalse +%<*shear-transform> +verbatimtex +%&latex +\documentclass{amsart} +\usepackage[default, lining, proportional, regular, semibold]{sourceserifpro} +\usepackage[lining, proportional, semibold]{sourcesanspro} +\usepackage[semibold]{sourcecodepro} +\usepackage[xcharter]{newtxmath} +\newcommand*{\numberset}[1]{\mathbb{#1}} +\newcommand*{\transpose}[1]{{#1}^{\text{T}}} +\begin{document} +etex + + +prologues := 3; + + +phi := .618; + +u := 80; + + +numeric line_thickness[]; +line_thickness[1] := .25 * 72/25.4; +line_thickness[2] := .35 * 72/25.4; +line_thickness[3] := .5 * 72/25.4; +line_thickness[4] := .7 * 72/25.4; + +narrow_width := line_thickness[1]; +medium_width := line_thickness[2]; +wide_width := line_thickness[3]; + + +%% / x' \ / 1 slant \ / x \ +%% | | = | | | | +%% \ y' / \ 0 1 / \ y / +def slant_point(expr a_point, a_slant) = + (xpart a_point + ypart a_point * a_slant, ypart a_point) +enddef; + + +pair original_rectangle[]; +original_rectangle[1] := (0, 0); +original_rectangle[2] := (u, 0); +original_rectangle[3] := (u, phi * u); +original_rectangle[4] := (0, phi * u); + +slant := .2; + +pair slanted_rectangle[]; +slanted_rectangle[1] := slant_point(original_rectangle[1], slant); +slanted_rectangle[2] := slant_point(original_rectangle[2], slant); +slanted_rectangle[3] := slant_point(original_rectangle[3], slant); +slanted_rectangle[4] := slant_point(original_rectangle[4], slant); + +pair offset[]; +offset[0] := (0, 0); +offset[1] := (1.75u, 0); + + +beginfig(1); + drawarrow (-.2u, 0) + offset[0] -- (1.25u, 0) + offset[0] + withpen pencircle scaled narrow_width; + drawarrow (0, -.2u) + offset[0] -- (0, u) + offset[0] + withpen pencircle scaled narrow_width; + + label.llft(btex \(\numberset{E}^2\) etex, offset[0]); + label.llft(btex \(x\) etex, (1.25u, 0) + offset[0] + (0, -2)); + label.lft(btex \(y\) etex, (0, u) + offset[0]); + + draw original_rectangle[1] + offset[0] -- + original_rectangle[2] + offset[0] -- + original_rectangle[3] + offset[0] -- + original_rectangle[4] + offset[0] -- + cycle + withpen pencircle scaled wide_width; + drawdot original_rectangle[4] + offset[0] withpen pencircle scaled 4pt; + label.urt(btex \(\transpose{(x, y)}\) etex, original_rectangle[4] + offset[0] + (1, 1)); + + + drawarrow (-.2u, 0) + offset[1] -- (1.25u, 0) + offset[1] + withpen pencircle scaled narrow_width; + drawarrow (0, -.2u) + offset[1] -- (0, u) + offset[1] + withpen pencircle scaled narrow_width; + + label.llft(btex \(\numberset{E}^2\) etex, offset[1]); + label.llft(btex \(x\) etex, (1.25u, 0) + offset[1] + (0, -2)); + label.lft(btex \(y\) etex, (0, u) + offset[1]); + + draw slanted_rectangle[1] + offset[1] -- + slanted_rectangle[2] + offset[1] -- + slanted_rectangle[3] + offset[1] -- + slanted_rectangle[4] + offset[1] -- + cycle + withpen pencircle scaled wide_width; + drawdot slanted_rectangle[4] + offset[1] withpen pencircle scaled 4pt; + label.urt(btex \(\transpose{(x'\!, y')}\) etex, slanted_rectangle[4] + offset[1] + (3, 1)); + + + pair p; + p := slanted_rectangle[1] + offset[1]; + draw p -- (1.5slanted_rectangle[4] + offset[1]) + withpen pencircle scaled narrow_width; + + path angle_indicator; + angle_indicator := fullcircle scaled 1.6u shifted offset[1]; + draw angle_indicator + cutbefore (p -- (1.5slanted_rectangle[4] + offset[1])) + cutafter (offset[1] -- (0, u) + offset[1]); + label.rt(btex \(\alpha\) etex, 1.4original_rectangle[4] + offset[1] + (1, 0)); +endfig; +end +%</shear-transform> +% \fi +% +% +% \begin{figure} +% \centering +% \includegraphics{shear-transform.mps} +% +% \caption[Shear transform] +% {Shear transform of a rectangle by the angle~\(\alpha\). The left-hand side shows +% the original figure the right-hand side the one sheared by~\(\alpha\). The +% \(x\)-axis can be identified with the baseline of the +% text.}\label{fig:shear-transform} +% \end{figure} +% +% +% For \(\alpha = 0\) the shear matrix becomes the identity matrix. Throughout of +% \packagename{synthslant} we work with the \meta{slant} which is \(\sin \alpha\) in +% \cref{equ:shear-transformation} and avoid converting back and forth to the +% \index{shear>angle}shear angle~\(\alpha\).\footnote{At least one slant engine currently +% requires such a conversion, namely~\pstrickslogo. The math is hidden from the user, though.} +% Some values for orientation: \mbox{\(\sin 5.74\degree \approx .1\)}, \mbox{\(\sin 11.5\degree +% \approx .2\)}, and \mbox{\(\sin 17.5\degree \approx .3\)}.\footnote{For small +% angles~\(\lvert\alpha\rvert\) measured in radians the sine is approximately linear: \(\sin +% \alpha \approx \alpha\).} For real-life serif fonts \meta{slant} is in the range of~\(.1\) +% to~\(.45\) and a value of~\(.2\) seems to be quite common. My \filesystem{pdftex.map} lists +% negative \meta{slant} values in the range~\(-.4\) to~\(-.05\) and positive \meta{slant} +% values in the range~\(.14\) up to~\(.45\). See \Cref{tab:slant-values} on +% \cpageref{tab:slant-values} for some actual values of serif fonts in \LaTeX. +% +% +% \subsection{Usage Ideas}\label{sec:usage-ideas} +% +% Automatic slanting both forward and reverse can be applied in a variety of typographic +% occasions. Here are some ideas. +% +% \begin{enumerate} +% \item\label{it:no-italics} +% Generate a slanted serif in the unfortunate situation when a serif font comes without +% italics such as \singlequotes{\acronym{URW}~Antiqua}\index{font>URW Antiqua=\acronym{URW} +% Antiqua}. +% +% Here, the user is relatively free to choose a \meta{slant}, for there are no italics whose +% angle must be matched. \packagename{Synthslant}'s default of~.2 should be a good starting +% point. +% +% \item\label{it:upright-italics} +% Augment a serif font that features an italics shape with upright italics. +% +% In nearly all cases it is desirable not to remove all forward-slant of the italics but +% retain some 1\textdegree{} to~2\textdegree{} of residual angle. +% +% \item\label{it:correct-italics-angle} +% An italics shape that has an excessive slant angle, as +% e.\,g.~\singlequotes{Libre~Caslon}\index{font>Libre Caslon} may be corrected, i.\,e., +% partially un-slanted. +% +% In this case, and generally if a font as a whole needs to be corrected, an alternative +% approach like the one sketched in \cref{sec:alternative} on \cpageref{sec:alternative} may +% be warranted. +% +% \item\label{it:generate-sole-obliques} +% Generate an oblique sans-serif if a sans-serif font comes without an oblique shape as, +% e.\,g., \singlequotes{\acronym{URW}~Grotesk}.\index{font>URW Grotesk=\acronym{URW} Grotesk} +% +% \item\label{it:generate-extra-obliques} +% Supply a slanted sans-serif shape for sans-serif fonts with designed, this is \emph{true} +% obliques as e.\,g.~\singlequotes{Open Sans}.\index{font>Open Sans} +% +% \item\label{it:slant-typewriter} +% Fixed-width --~also called \singlequotes{typewriter} or \singlequotes{teletype}~-- fonts +% without obliques (Yes, I am looking at you, Inconsolata!)\index{font>Inconsolata} finally +% get an oblique shape. +% +% \item\label{it:slanted-small-caps} +% Small caps without accompanying italics can be slanted, too. +% +% \item\label{it:slant-in-math-mode} +% As \packagename{synthslant} also works in \TeX's math-mode, it is possible to give +% math-italics even more of a heeling. +% +% \item\label{it:correct-math-script} +% If the slant of the math script font is at odds with the slant of the usual math italics, +% it may be possible to apply \packagename{synthslant} on the script symbols for matching +% angles. +% +% \item\label{it:slant-big-math-operators} +% Big mathematical operators like the sigma can be slanted and others, like the integral +% sign, can have their inclination adjusted. +% \end{enumerate} +% +% It is possible to obtain slants that run against the reading direction, so called +% \singlequotes{backslanted} glyphs, but I have rarely seen an +% \href{https://fontsinuse.com/tags/2044/left-leaning-italics-backslanted}{example} where the +% typography of a document could benefit from that. +% +% +% \clearpage +% \section{Package Options}\label{sec:package-options} +% +% \begin{synopsis} +% |\usepackage[|\meta{option}\dots|]{synthslant}| +% \end{synopsis} +% +% This is a list of \meta{option}s that \packagename{synthslant} understands. The package +% options allow to predefine the forward and backward slant angles as well as the selection of +% a particular slanting engine. +% +% \begingroup +% \newcommand*{\indexpackageoption}[1] +% {\index{package option>#1=\code{#1}}\index{#1=\code{#1}~(option)}\ignorespaces} +% \begin{description} +% [before={\let\oldmakelabel=\makelabel +% \renewcommand{\makelabel}[1] +% {\oldmakelabel{\termparbox{##1}}\phantomsection}}, +% font=\normalfont, +% style=nextline] +% \item[|auto|]\label{item:auto} +% \indexpackageoption{auto} +% Let the package choose a slant engine. This is the default. +% +% For \pdfLaTeX{} package \packagename{synthslant} selects the \acronym{PDF}-engine, for +% \LuaLaTeX{} the \packagename{fontspec}-engine, and in all other cases the +% \packagename{l3draw}-layer handles the shear transformation. +% +% \item[|disable|]\label{item:disable} +% \indexpackageoption{disable} +% Disable slanting completely. +% +% \item[|fontspec|]\label{item:fontspec} +% \indexpackageoption{fontspec} +% Use \packagename{fontspec}\index{package>\packagename{fontspec}} as slanting +% back-end.\footnote{Requires \filesystem{fontspec.sty.}} +% +% \item[|l3draw|]\label{item:l3draw} +% \indexpackageoption{l3draw} +% Select the \singlequotes{draw} layer\index{package>\packagename{l3draw}} of \LaTeXIII{} as +% base for the slanting engine.\footnote{This option requires \filesystem{l3draw.sty.}} +% +% \begin{caution} +% This engine is experimental and the \singlequotes{draw} layer of \LaTeXIII{} itself is +% still experimental, too. See \cref{sec:limitations} on \cpageref{sec:limitations} for +% details. +% \end{caution} +% +% \item[|negslant=|\meta{slant-expr}]\label{item:negslant} +% \indexpackageoption{negslant} +% Set the default value for \hyperref[syn:synthnegslant]{\cs{synthnegslant}} \emph{only.} +% The argument \meta{slant-expr} is a floating-point expression. Note that for this option +% \meta{slant-expr} must evaluate to a non-positive value. +% +% \item[|PDF|, |pdf|]\label{item:pdf} +% \indexpackageoption{pdf} +% Select the \acronym{PDF}-slant engine. This requires the document is translated with +% \pdfLaTeX{} or a compatible program. +% +% \item[|posslant=|\meta{slant-expr}]\label{item:posslant} +% \indexpackageoption{posslant} +% Set the default value for \hyperref[syn:synthslant]{\cs{synthslant}} \emph{only.} The +% argument \meta{slant-expr} is a floating-point expression. Note that for this option +% \meta{slant-expr} must evaluate to a non-negative value. +% +% \item[|PS|, |ps|]\label{item:postscript} +% \index{ps} +% Use \pstrickslogo\index{package>\packagename{pstricks}} to delegate slanting to the +% PostScript\index{PostScript} interpreter. Obviously requires \pstrickslogo\footnote{The +% package actually required is \filesystem{pst-3d.sty.}} and \acronym{DVI}-to-PostScript +% translation. +% +% \begin{caution} +% This engine is still experimental and produces low-quality output! See +% \cref{sec:limitations} on \cpageref{sec:limitations} for details. +% \end{caution} +% +% \item[|slant=|\meta{slant-expr}]\label{item:slant} +% \indexpackageoption{slant} +% Set the default values for both \hyperref[syn:synthslant]{\cs{synthslant}} and +% \hyperref[syn:synthnegslant]{\cs{synthnegslant}}, this is, behave as if the two package +% options \(\code{posslant} = \meta{slant-expr}\) and \(\code{negslant} = +% -(\meta{slant-expr})\) have been given. The argument \meta{slant-expr} is a floating-point +% expression. +% +% If omitted \packagename{synthslant} assumes \(.2\) and \(-.2\), respectively. +% +% \item[|TikZ|, |tikz|]\label{item:tikz} +% \indexpackageoption{tikz} +% Use \packagename{TikZ}\index{package>\packagename{TikZ}} for slanting.\footnote{Requires +% \filesystem{tikz.sty.}} +% +% \begin{caution} +% This engine is still experimental and produces low-quality output! See +% \cref{sec:limitations} on \cpageref{sec:limitations} for details. +% \end{caution} +% \end{description} +% \endgroup +% +% The package options \code{slant}, \code{posslant}, and \code{negslant} all accept +% floating-point \emph{expressions} as their arguments not just plain floating-point literals. +% See Ref.~\citenum{latex3-interfaces}, Ch.~29, \doublequotes{The \textsf{l3fp}~module~-- +% Floating points} for a description of the floating-point expression syntax and the available +% functions. +% +% +% \clearpage +% \section{Macros and Environments}\label{sec:macros-and-environments} +% +% This section describes how to actually apply the functionality of \packagename{synthslant} to +% some text. If the \meta{slant}~value matching a given font is known this is about it. To +% figure out an unknown \meta{slant}~value check out \cref{sec:determine-slant}. +% +% +% \subsection{Variable-Like Macros}\label{sec:variables} +% +% The amount of slanting forward (positive slant angles) and backward (negative slant angles) +% is controlled by two macros. They are set during package initialization. However, they can +% be changed at any time to accommodate for different fonts or special needs. +% +% \DescribeMacro{\synthslant} +% Control the slant applied by \hyperref[syn:textsynthslant]{\cs{textsynthslant}}. +% This value is non-negative. +% +% \begin{synopsis}\label{syn:synthslant} +% \cs{synthslant} +% \end{synopsis} +% +% To change the slant value to \(.24\) say +% +% \begin{codeexample} +% \cs{renewcommand}*\{\cs{synthslant}\}\{.24\} +% \end{codeexample} +% +% \Cref{tab:slant-values} summarizes some suggested slant values for selected fonts. +% +% \begin{table} +% \small +% \centering +% \caption[Suggested slant values] +% {Suggested slant values for selected \emph{serif} fonts. The \meta{slant} shown in +% the tables is not necessarily the one closest to the font's italics. Also compare +% with the left-hand table of \cref{tab:slanted-series-fonts}.} +% \label{tab:slant-values} +% +% \fullwidthsetup{skipabove=0pt, skipbelow=0pt} +% \begin{maxipage} +% \begin{minipage}{\textwidth} +% \flushright +% \begin{tabfigures} +% \begin{tabular}[t]{@{}p{9.5em}l@{}} +% \toprule +% Font Name & Slant \\ +% \midrule +% \acronym{ADF} Accanthis\index{font>ADF Accanthis=\acronym{ADF} Accanthis} & .26 \\ +% \acronym{ADF} Baskervald\index{font>ADF Baskervald=\acronym{ADF} Baskervald} & .32 \\ +% \acronym{ADF} Berenis\index{font>ADF Berenis=\acronym{ADF} Berenis} & .2 \\ +% \acronym{ADF} Venturis\index{font>ADF Venturis=\acronym{ADF} Venturis} & .2 \\ +% Alegreya\index{font>Alegreya} & .2 \\ +% Arvo\index{font>Arvo} & .2 \\ +% BaskervilleF\index{font>BaskervilleF} & .2 \\ +% Bera Serif\index{font>Bera Serif} & .2 \\ +% Bitter\index{font>Bitter} & .16 \\ +% Caladea\index{font>Caladea} & .14 \\ +% Clara\index{font>Clara} & .24 \\ +% Cochineal\index{font>Cochineal} & .2 \\ +% Coelacanth\index{font>Coelacanth} & .2 \\ +% Crimson Pro\index{font>Crimson Pro} & .2 \\ +% Crimson Text\index{font>Crimson Text} & .2 \\ +% \bottomrule +% \end{tabular}% +% \qquad +% \begin{tabular}[t]{@{}p{9.5em}l@{}} +% \toprule +% Font Name & Slant \\ +% \midrule +% Day Roman\index{font>Day Roman} & .2 \\ +% \acronym{EB} Garamond\index{font>EB Garamond=\acronym{EB} Garamond} & .3 \\ +% etbb\index{font>etbb} & .2 \\ +% fbb\index{font>fbb} & .2 \\ +% Garamond Expert\index{font>Garamond Expert} & .2 \\ +% Gandhi Serif\index{font>Gandhi Serif} & .2 \\ +% Gentium\index{font>Gentium} & .2 \\ +% Ibarra Real Nova\index{font>Ibarra Real Nova} & .2 \\ +% \acronym{IBM} Plex Serif\index{font>IBM Plex Serif=\acronym{IBM} Plex Serif} & .24 \\ +% \acronym{Inria} Serif\index{font>Inria Serif=\acronym{Inria} Serif} & .2 \\ +% Libertinus Serif\index{font>Libertinus Serif} & .2 \\ +% Libre Baskerville\index{font>Libre Baskerville} & .3 \\ +% Libre Caslon\index{font>Libre Caslon} & .38 \\ +% & \\ +% & \\ +% \bottomrule +% \end{tabular}% +% \qquad +% \begin{tabular}[t]{@{}p{9.5em}l@{}} +% \toprule +% Font Name & Slant \\ +% \midrule +% Merriweather\index{font>Merriweather} & .14 \\ +% MLModern\index{font>MLModern} & .23 \\ +% Noto Serif\index{font>Noto Serif} & .22 \\ +% \acronym{PT} Serif\index{font>PT Serif=\acronym{PT} Serif} & .2 \\ +% Roboto Slab\index{font>Roboto Slab} & .2 \\ +% Quattrocento\index{font>Quattrocento} & .2 \\ +% Source Serif Pro\index{font>Source Serif Pro} & .18 \\ +% Spectral\index{font>Spectral} & .18 \\ +% \acronym{STIX}\index{font>STIX=\acronym{STIX}} & .2 \\ +% \TeX{} Gyre Pagella\index{font>TeX Gyre Pagella=\TeX{} Gyre Pagella} & .16 \\ +% \acronym{TX} Fonts Serif\index{font>TX Fonts Serif=\acronym{TX} Fonts Serif} & .2 \\ +% \acronym{URW} Antiqua\index{font>URW Antiqua=\acronym{URW} Antiqua} & .2 \\ +% \acronym{URW} Nimbus Roman\index{font>URW Nimbus Roman=\acronym{URW} Nimbus Roman} & .2 \\ +% Utopia\index{font>Utopia} & .2 \\ +% & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{minipage} +% \end{maxipage} +% \end{table} +% +% \DescribeMacro{\synthnegslant} +% Control the slant applied by +% \hyperref[syn:textsynthuprightitalic]{\cs{textsynthuprightitalic}}. This value is +% non-positive. +% +% \begin{synopsis}\label{syn:synthnegslant} +% \cs{synthnegslant} +% \end{synopsis} +% +% +% \subsection{Basic Interface}\label{sec:basic-interface} +% +% Package \packagename{synthslant} provides two easy-to-use macros for slanting glyphs. For a +% more flexible and powerful interface, see~\cref{sec:advanced-interface}. +% +% \begin{note} +% The following restrictions and workarounds to get line-breaking and automatic hyphenation +% working again do \emph{not} apply to the +% \packagename{fontspec}\index{package>\packagename{fontspec}} back-end. +% \end{note} +% +% \noindent +% Both macros provide \emph{simplistic} support for slanting hyphenatable +% words and space-separated phrases for a given \meta{text}. The fundamental shear +% transformation would produce an single unbreakable horizontal box. So we have added two +% provisions to re-enable at least some breakability. +% +% \begin{enumerate} +% \item Spaces introduce breakpoint,\index{breakpoint at space} e.\,g. +% \begin{codeexample} +% \cs{textsynthslant}\{topological dual space\} +% \end{codeexample} +% slants the first word (producing a horizontal box) inserts a space and then slants the +% second word (producing another horizontal box). \TeX{} sees two (unbreakable) boxes and a +% discardable space when it comes to linebreaking. +% +% \item Discretionary hyphens\index{discretionary hyphen} in the form of \singlequotes{\cs{-}} +% get propagated. So, we could improve on our above example by saying +% \begin{codeexample} +% \cs{textsynthslant}\{topo\cs{-}log\cs{-}i\cs{-}cal dual space\} +% \end{codeexample} +% to \singlequotes{recover} hyphenation of the first word. +% \end{enumerate} +% +% \noindent +% This neither is a complete nor an elegant solution but it will take us quite far. +% +% \medskip +% +% \DescribeMacro{\textsynthslant} +% Forward slant some upright glyphs. +% +% \begin{synopsis}\label{syn:textsynthslant} +% \cs{textsynthslant}\marg{text} +% \end{synopsis} +% +% In horizontal mode switch to an upright shape, slant \meta{text} with the slant value stored +% in \hyperref[syn:synthslant]{\cs{synthslant}} and apply \doublequotes{slant +% correction}\index{slant>correction} --~the equivalent of italics correction~-- at the +% right-hand side of~\meta{text}. +% +% In math mode just slant \meta{text} with the slant value stored in +% \hyperref[syn:synthslant]{\cs{synthslant}}. +% +% \begin{usecases} +% If italics seem to be too intrusive in the body we can substitute slanted text for example +% for foreign phrases like \singlequotes{et.\,al.} and \singlequotes{etc.}: +% +% \begin{codeexample} +% \cs{newcommand*}\=\{\cs{foreignphrase}\}[2][USenglish] \\ +% \>\{\cs{foreignlanguage}\{\#1\}\{\cs{textsynthslant}\{\#2\}\}\} +% \end{codeexample} +% +% \noindent +% where we show the font modification in conjunction with the +% \packagename{babel}~macro\index{package>\packagename{babel}} +% \cs{foreignlanguage}~\cite{package:babel}.~\visualpar +% +% In math-mode you cannot have enough fonts, symbols, and most of the gizmos over there! I +% like to mark up automorphism groups associated with a given group with a slanted-roman +% typeface, though my macro has a more general name. +% +% \begin{codeexample} +% \cs{newcommand*}\=\{\cs{functionspace}\}[1] \\ +% \>\{\cs{mbox}\{\cs{textsynthslant}\{\#1\}\}\}\specialsectionendhere +% \end{codeexample} +% \end{usecases} +% +% \DescribeMacro{\textsynthuprightitalic} +% Backward slant some italics or oblique glyphs. +% +% \begin{synopsis}\label{syn:textsynthuprightitalic} +% \cs{textsynthuprightitalic}\marg{text} +% \end{synopsis} +% +% In horizontal mode switch to an italics shape, +% slant \meta{text} with the slant value stored in \cs{synthnegslant}. +% +% In math mode just un-slant \meta{text} with the slant value stored in \cs{synthnegslant}. +% +% \begin{example} +% To set apart operators in an algebra like, e.\,g., the radical, we could use upright +% italics +% +% \begin{codeexample} +% \cs{newcommand*}\=\{\cs{algebraoperator}\}[1] \\ +% \>\{\cs{mbox}\{\cs{textsynthuprightitalic}\{\#1\}\}\} +% \end{codeexample} +% +% \noindent +% and follow up with +% +% \begin{codeexample} +% \cs{DeclareMathOperator}\{\cs{rad}\}\{\cs{algebraoperator}\{rad\}\} +% \end{codeexample} +% +% \noindent +% where we have assumed that \packagename{amsmath} has been loaded to bring +% \cs{DeclareMathOperator} into scope. +% \end{example} +% +% +% \subsection{Advanced Interface}\label{sec:advanced-interface} +% +% \DescribeMacro{\synthslantbox} +% Slant \meta{text} with an amount of \meta{slant} that can be positive, negative or zero. +% +% \begin{synopsis}\label{syn:synthslantbox} +% \cs{synthslantbox}\marg{slant}\marg{text} +% \end{synopsis} +% +% This is the unadorned call to the chosen slanting engine. In particular, neither the values +% of \hyperref[syn:synthslant]{\cs{synthslant}} nor of +% \hyperref[syn:synthnegslant]{\cs{synthnegslant}} enter its expansion! No corrections or +% \TeX-mode adjustments are made. +% +% \begin{example} +% Generate a substitute for a missing solidus character: +% +% \begin{codeexample} +% 12\=\kill +% \cs{renewcommand*}\{\cs{textfractionsolidus}\}[1] \\ +% \>\{\=\cs{kern}-.125em \\ +% \> \>\cs{raisebox}\=\{.125em\} \\ +% \> \> \>\{\=\cs{smaller} \\ +% \> \> \> \>\cs{synthslantbox}\{.3\}\{\cs{char}`/\}\}\% \\ +% \> \>\cs{kern.1em}\} +% \end{codeexample} +% +% \noindent +% where the \cs{smaller} macro is from the +% \packagename{relsize}~package~\cite{package:relsize}. +% \end{example} +% +% The following two environments are responsible for setting up everything before the actual +% slant or un-slant code runs and what happens after the slant-engine finishes. They can be +% redefined or patched to meet different users' needs. +% +% \DescribeEnv{slantenvironment} +% Wrapper around \hyperref[syn:synthslantbox]{\cs{synthslantbox}} that is called for every +% forward-slanting operation with~\hyperref[syn:textsynthslant]{\cs{textsynthslant}}. +% +% \begin{synopsis}\label{syn:slantenvironment} +% \cs{begin}|{slantenvironment}| \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{slantenvironment}| +% \end{synopsis} +% +% Switch to an upright font shape and --~if +% package~\packagename{microtype}~\cite{package:microtype}\index{package>\packagename{microtype}} +% has been loaded~-- enter the Microtype-context defined by +% macro~\hyperref[syn:slantcontext]{\cs{slantcontext}}. At the end add some slant correction, +% which is the equivalent of italics correction. +% +% \begin{usecases}[\doublequotes{Patch Cases}] +% Left-italics correction.~\visualpar{} +% Simultaneous left-italics and right-italics correction for a shift-left effect. +% \end{usecases} +% +% \DescribeEnv{negslantenvironment} +% Wrapper around \hyperref[syn:synthslantbox]{\cs{synthslantbox}} that is called for every +% backward-slanting operation +% with~\hyperref[syn:textsynthuprightitalic]{\cs{textsynthuprightitalic}}. +% +% \begin{synopsis}\label{syn:negslantenvironment} +% \cs{begin}|{negslantenvironment}| \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{negslantenvironment}| +% \end{synopsis} +% +% Switch to an italics font shape and --~if +% package~\packagename{microtype}~\cite{package:microtype} has been loaded~-- enter the +% Microtype-context defined by macro~\hyperref[syn:negslantcontext]{\cs{negslantcontext}}. +% +% \DescribeMacro{\slantcontext} +% Microtype context used when typesetting slanted text. +% +% \begin{synopsis}\label{syn:slantcontext} +% \cs{slantcontext} +% \end{synopsis} +% +% The expansion of this macro may be empty. +% The package's default is +% +% \begin{codeexample} +% tracking = synthslant +% \end{codeexample} +% +% \begin{note} +% The tracking context~\code{synthslant} is \emph{not} defined by \packagename{synthslant}. +% And \packagename{microtype} ignores undefined contexts. +% \end{note} +% +% \DescribeMacro{\negslantcontext} +% Microtype context used when typesetting un-slanted text. +% +% \begin{synopsis}\label{syn:negslantcontext} +% \cs{negslantcontext} +% \end{synopsis} +% +% The expansion of this macro may be empty. +% The package's default is +% +% \begin{codeexample} +% tracking = synthnegslant +% \end{codeexample} +% +% \begin{note} +% The tracking context~\code{synthnegslant} is \emph{not} defined by +% \packagename{synthslant}. And \packagename{microtype} ignores undefined contexts. +% \end{note} +% +% \begin{example} +% Upright italics often look somewhat tight. I like to add some extra tracking to them. So, +% I simply define the context~\code{synthnegslant}: +% +% \begin{codeexample} +% \cs{SetTracking}\=[context = synthnegslant] \\ +% \>\{encoding = *, shape = it\} \\ +% \>\{10\}\specialsectionendhere +% \end{codeexample} +% \end{example} +% +% \begin{tip} +% When the tracking of upright italics is changed +% it may be advisable +% +% \begin{itemize}[notopsep] +% \item to break ligatures, e.\,g.~\code{no ligatures = \{f\}}, +% \item to adjust the outer kerning, e.\,g.~\code{outer~kerning = \{0, 0\}} and +% \item to adapt the inter-word spacing, e.\,g.~\code{spacing = \{100,,\}}. +% \end{itemize} +% +% The document \filesystem{synthslant-gauge.tex}, which comes with +% package~\packagename{synthslant}, has sample texts and tracking variations already set up +% for experimentation. +% \end{tip} +% +% +% \clearpage +% \section{Determining Slant}\label{sec:determine-slant} +% +% If a synthetically slanted piece of text needs to match to an existing italics or oblique +% font the question arises how to determine the slant angle~\(\alpha\) or~\meta{slant}. +% +% \begin{note} +% The slant angles of different glyphs in the same font may slightly differ from each other. +% We look for a representative \meta{slant}, a kind of average that achieves a visual match +% with the italics or obliques of the font family. +% \end{note} +% +% +% \subsection{Direct Measurement}\label{sec:direct-meansurement} +% +% Measure the angle of some reference glyphs with a graphics program. +% +% \begin{enumerate}[itemsep=.5\itemsep, parsep=.5\parsep] +% \item Prepare a page with some sample glyphs of the font shape to be matched. +% +% \item Render it as PostScript or in~\acronym{PDF}. +% +% \item Load the file at a resolution of 1200\,dpi or higher into your favourite graphics +% editor that supports measuring angles. +% +% \item In the graphics editor center the interesting letters and set the zoom to one hundred +% percent or more. +% +% \item Measure some letters and write down the angles. +% +% \item Convert the desired angle~\(\alpha\) to a \meta{slant} by calculating \(\sin \alpha\). +% +% If no computer is available, the following formula might help: +% \begin{equation*} +% \meta{slant} = \sin \alpha \approx \frac{11}{630\degree} \: \alpha, +% \end{equation*} +% +% where \(\alpha\) is given in degrees. +% \end{enumerate} +% +% +% \subsection{Comparison of Shapes}\label{sec:shape-comparison} +% +% Compare some reference glyphs with a differently slanted versions. +% +% \begin{enumerate}[itemsep=.5\itemsep, parsep=.5\parsep] +% \item In file~\filesystem{synthslant-gauge.tex} which comes with the +% \packagename{synthslant}~package insert the code to load your font-of-interest. +% +% \item Render the document as PostScript or as~\acronym{PDF}. +% +% \item Load the first page at a resolution of 600\,dpi to~900\,dpi into your favourite +% graphics editor. +% +% \item Cut the italics sample at the top allowing for generous white-space around it as a +% rectangle +% +% \item Paste the rectangle in a new layer called e.\,g.~\singlequotes{sample}. +% +% \item On layer \singlequotes{sample} move the rectangle down the list of different slant +% values until it match best. +% +% \item Switch the layer mode of \singlequotes{sample} to \singlequotes{difference} and +% fine-position the rectangle over the slanted sample. Compare different letters in that +% way. Change line until the best match is found. +% +% \item Read the slant value at the left-hand side of the line. See +% \Cref{fig:compare-with-the-gimp}. +% \end{enumerate} +% +% \begin{figure} +% \centering +% \includegraphics[keepaspectratio=true, width=\linewidth] +% {compare-with-the-gimp} +% +% \caption[Compare slant angles] +% {Compare italics and slanted samples with \application{The Gimp}.~\visualpar{} For +% this screendump I loaded the samples on the first page of +% \filesystem{synthslant-gauge.pdf} at a resolution of~600\,dpi into +% \application{The Gimp}. The \singlequotes{sample}~layer is aligned to the +% letter~\singlequotes{t} in the word~\singlequotes{White}. Note that accidentally +% the letter~\singlequotes{H} of the next word~\singlequotes{Handgloves} confirms +% the good match.}\label{fig:compare-with-the-gimp} +% \end{figure} +% +% +% \subsection{Exploring Further}\label{sec:exploring-further} +% +% Once a usable slant value has been found it can be fed into \filesystem{synthslant-gauge.tex} +% and --~after recompiling with the appropriate \LaTeX-engine~-- used to examine the details of +% the slant operations. +% +% Page~2, Sec.~3.1, \singlequotes{Copy}, shows wild mixes of different font shapes, native al +% well as synthesized ones. Here, the slanted glyphs as well as the upright italics should +% blend well with the native italics/obliques and the normal font, respectively. +% +% Page~3, Sec.~3.2 and following sub-sections, examines the coupling of +% \packagename{synthslant} with the \TeX-system and some of its extensions. If a slant engine +% malfunctions, it will become evident on this page. +% +% +% \clearpage +% \section{Limitations and Known Problems}\label{sec:limitations} +% +% Here I list some of the known problems of \packagename{syntslant}. Conceivably there are +% more. +% +% \begin{description} +% \item[All except \packagename{fontspec}.] +% \packagename{Syntslant}~manipulations may not survive +% (pre-)\discretionary{}{}{}processing by \MP. +% +% \item[\packagename{l3draw} engine.]\index{package>\packagename{l3draw}}\mbox{} +% \begin{itemize} +% \item Depending of the shear direction the \packagename{l3draw} engine may generate some +% extra positive or negative space at the ends of the text. +% +% \item Any box sheared looses its depth; technically \cs{dp} becomes~0pt. +% +% \item Markedly slower than the \acronym{PDF}-implementation! +% \end{itemize} +% +% \item[\pstrickslogo{} engine.]\index{package>\packagename{pstricks}} +% The \pstrickslogo{} engine produces some extra space at the ends of the text. +% +% \item[\tikzlogo{} engine.]\index{package>\packagename{tikz}} +% The \tikzlogo{} engine produces some extra space at the ends of the text. +% \end{description} +% +% +% \clearpage +% \section{Alternative Solution}\label{sec:alternative} +% +% Here is an alternative to \packagename{synthslant} that I am aware of. It changes the slant +% of a font as a whole and it is impossible to undo the change within the document. +% +% +% \subsection{Using \pdfTeX}\label{sec:alternative-pdftex} +% +% In \pdfTeX{} fonts can be re-mapped in the document preamble with the +% primitive~\cs{pdfmapline}; see the \pdfTeX{} Reference Manual~\cite[Sec.~6.1]{pdftex} for a +% description of the syntax. This possibility renders possible to splice in a slanting +% operation on the fly. +% +% Here is a simplified syntax of a font map line, which does not indicate any of the optional +% parts for better readability: +% +% \begin{multilinecodeexample} +% \meta{tfm-name} \meta{ps-name} \meta{font-flags} \\ +% \pushright "\meta{special}" <\meta{encoding-file} <\meta{font-file} +% \end{multilinecodeexample} +% +% \noindent where +% +% \begin{itemize}[notopsep] +% \item \meta{tfm-name} is the basename of the \TeX{} font-metric file~(\filesystem{*.tfm}), +% +% \item \meta{ps-name} is the name the font will acquire inside of \TeX, +% +% \item \meta{font-flags} optionally specify some characteristics of the font, +% +% \item \meta{special} prescribes font manipulations in the same way as +% \command{dvips}~\cite[Sec.~6.3]{dvips} does, +% +% \item \meta{encoding-file} is the filename~(\filesystem{*.enc}) where the encoding to be used +% with \meta{font-file} is stored, and +% +% \item \meta{font-file} sets the filename of the font's definition. It is given without path +% but includes an extension, which typically is \filesystem{otf,} \filesystem{pfb,} +% or~\filesystem{ttf.} +% \end{itemize} +% +% \noindent +% We are particularly interested in the \meta{special}~part that allows us to slant the whole +% font with a single instruction. +% +% I want to elaborate the example given in \cref{sec:usage-ideas}, +% \cref{it:correct-italics-angle} and generate less-angled italics for +% Libre~Caslon.\index{font>Libre Caslon} Here is a suitable map line taken from +% \filesystem{pdftex.map} on my system: +% +% \begin{multilinecodeexample} +% LibreCsln-Italic-osf-t1--base LibreCsln-Italic \\ +% \indent "\textvisiblespace AutoEnc\ttdots\textvisiblespace ReEncodeFont\textvisiblespace" \\ +% \pushright <[lcsln\ttdots.enc <LibreCsln-Italic.pfb +% \end{multilinecodeexample} +% +% \smallskip +% +% \noindent +% which I had to break into three lines to make it fit this page. The +% \singlequotes{{\ttfamily\ttdots\,}} indicate parts of the identifiers that I left out beyond +% that. There are in fact four map lines for \code{T1}-encoded Libre~Caslon italics, those for +% lining figures~\singlequotes{\code{lf}}, oldstyle figures~\singlequotes{\code{osf}}, tabular +% lining figures~\singlequotes{\code{tlf}}, and tabular oldstyle +% figures~\singlequotes{\code{osf}}. +% +% The slant operation I want to add to the \meta{special}~part has the format: +% +% \begin{codeexample} +% \meta{slant}~SlantFont +% \end{codeexample} +% +% \noindent +% so for a shear to the left, for example, \(\meta{slant} = -.12\), which means the font gets +% slanted by~\(-8\degree\) the \meta{special}~part becomes +% +% \begin{codeexample} +% "\textvisiblespace -0.12\textvisiblespace SlantFont\textvisiblespace +% AutoEnc\ttdots\textvisiblespace ReEncodeFont\textvisiblespace" +% \end{codeexample} +% +% \noindent +% Finally, I select the modified font e.\,g.~with macro +% +% \begin{codeexample} +% \cs{usefont}\{\meta{encoding}\}\{\meta{family}\}\{\meta{series}\}\{\meta{shape}\} +% \end{codeexample} +% +% \noindent +% See Ref.~\citenum{latex-unofficial-refman} for details. +% In our case the call to \cs{usefont} is +% +% \begin{codeexample} +% \char`\\usefont\{T1\}\{LibreCsln-OsF\}\{regular\}\{it\} +% \end{codeexample} +% +% \begin{example} +% Here is all the talk of above put into action as this very document contains exactly the +% \cs{pdfmapline} just described. +% +% \begin{center} +% \def\sample{White Handgloves} +% \begin{tabular}{@{}ll@{}} +% Uncorrected, original italics & {\usefont{T1}{LibreCsln-LF}{regular}{it}\sample} \\ +% Less angled version & {\usefont{T1}{LibreCsln-OsF}{regular}{it}\sample} +% \end{tabular} +% \end{center} +% +% \noindent +% The only trick I have to reveal is that for the \doublequotes{original italics} I used the +% lining figures~\singlequotes{\code{lf}} version of the font, whereas the \doublequotes{less +% angled} version shows the oldstyle figures~\singlequotes{\code{osf}} version. +% +% The \TeX{} Font Metrics file (\acronym{TFM}) for this particular variant of Libre~Caslon +% was not touched. +% \end{example} +% +% +% \subsection{Combining \LaTeX{} and \command{dvipdfmx}}\label{sec:alternative-latex} +% +% The alternative when using \LaTeX{} is similar the one elaborated in the previous section. +% The font mapline gets modified by \cs{special} primitive +% +% \begin{codeexample} +% \cs{special}\{pdf:mapline \meta{font-mapline}\} +% \end{codeexample} +% +% \noindent +% that forwards the task of re-mapping the font, e.\,g.~to \command{dvipdfmx}. Our running +% example becomes +% +% \begin{multilinecodeexample} +% \cs{special}\{pdf:mapline \\ +% \indent LibreCsln-Italic-osf-t1--base LibreCsln-Italic \\ +% \indent "\textvisiblespace -0.12\textvisiblespace SlantFont\textvisiblespace +% AutoEnc\ttdots\textvisiblespace +% ReEncodeFont\textvisiblespace" \\ +% \pushright <[lcsln\ttdots.enc <LibreCsln-Italic.pfb\} +% \end{multilinecodeexample} +% +% \noindent +% The mapline contains \command{dvips}~options for special font effects; see +% Ref.~\citenum{dvips}, Sec.~6.3. Note that there is no \singlequotes{\code{=}}-sign at the +% beginning of the \code{pdf:mapline} in contrast to \cs{pdfmapline}. +% +% The font is activated in the same way as in the \acronym{PDF}-path +% (\cref{sec:alternative-pdftex}). The further translation of the resulting \acronym{DVI}-file +% must be performed with an application that is aware of the \cs{special}~primitive as for +% example~\command{dvipdfmx}~\cite{dvipdfmx} is. +% +% \begin{note} +% Despite the option syntax originates with \command{dvips} it is not able to interpret any +% \code{\cs{special}\{pdf:mapline \ttdots\}}. +% \end{note} +% +% +% \clearpage +% \appendix +% +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \MaybeStop{ +% \clearpage +% \phantomsection +% \resetfancyhead +% \addcontentsline{toc}{section}{Change History} +% \PrintChanges +% +% \clearpage +% \phantomsection +% \addcontentsline{toc}{section}{References} +% \begin{RaggedRight} +% \begin{thebibliography}{88} +% \bibitem{package:relsize} +% \bibauthor{Arseneau, Donald}. +% \bibtitle{The \textsf{relsize} package}. +% 2013, +% \biburl{https://ctan.org/pkg/relsize}. +% +% \bibitem{adobe-pdf-1.0} +% \bibauthor{Bienz, Tim} and \bibauthor{Richard Cohn}. +% \bibtitle{Portable Document Format Reference Manual}. +% Addison-Wesley Publishing Company, Reading/MA, +% 1993, +% \biburl{https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/pdfreference1.0.pdf}. +% +% \bibitem{package:babel} +% \bibauthor{Bezos, Javier}. +% \bibtitle{Package~\packagename{babel}}. +% 2021, +% \biburl{https://ctan.org/pkg/babel}. +% The original author of \packagename{babel} was \bibauthor{J. L. Braams}. +% +% \bibitem{tex-stackexchange-2013-12-7} +% \bibauthor{Carlisle, David}. +% \bibtitle{Shear Transform a Box}. +% 2013-12-7, +% \biburl{https://tex.stackexchange.com/questions/63179/shear-transform-a-box/63188}. +% +% \bibitem{dvipdfmx} +% \bibauthor{Dvipdfmx Project Team,} ed. +% \bibtitle{\command{dvipdfmx}}. +% 2020, +% \biburl{https://ctan.org/pkg/dvipdfmx}. +% +% \bibitem{fntguide} +% \bibauthor{\LaTeXIII{} Project Team,} ed. +% \bibtitle{\LaTeXe{} font selection}. +% 2023, +% \biburl{https://www.latex-project.org/help/documentation/fntguide.pdf}. +% +% \bibitem{latex3-interfaces} +% \bibauthor{\LaTeXIII{} Project,} +% \bibtitle{The \LaTeXIII{} Interfaces}. +% 2024, +% \biburl{https://texdoc.org/serve/interface3/0}. +% +% \bibitem{latex-unofficial-refman} +% \bibauthor{latexref.xyz}. +% \bibtitle{\LaTeXe: An unofficial reference manual}. +% 2023, +% \biburl{https://latexref.xyz/dev/latex2e.pdf}. +% +% \bibitem{middendorp:2014} +% \bibauthor{Middendorp, Jan}. +% \bibtitle{Shaping Text}. +% \acronym{BIS}~publishers, Amsterdam, +% 2014. +% +% \bibitem{dvips} +% \bibauthor{Rokicki, Tomas}. +% \bibtitle{\command{dvips}}. +% 2022, +% \biburl{https://tug.org/texlive/Contents/live/texmf-dist/doc/dvips/dvips.pdf}. +% +% \bibitem{package:microtype} +% \bibauthor{Schlicht, Robert}. +% \bibtitle{Package~\packagename{microtype}}. +% 2020, +% \biburl{https://ctan.org/pkg/microtype}. +% +% \bibitem{schroeder:2007} +% \bibauthor{Schr\"oder, Martin}. +% \bibtitle{pdftex 1.40}. +% 2007, +% \biburl{https://tug.org/mail-archives/pdftex/2007-January/006910.html}. +% +% \bibitem{stamm:2020} +% \bibauthor{Stamm, Philipp}. +% \bibtitle{Schrifttypen -- Verstehen Kombinieren: +% Schriftmischung als Reiz in der Typografie}. +% Birkhäuser, Basel, +% 2020. +% +% \bibitem{strizver:2014} +% \bibauthor{Strizver, Ilene}. +% \bibtitle{Type rules!: the designer's guide to professional typography}, +% 4\textsuperior{th}~ed. +% John Wiley~\& Sons, Hoboken/NJ, +% 2014. +% +% \bibitem{baskerville-pdftex-8-1:1998} +% \bibauthor{Th\`anh, Han The}. +% \bibtitle{The \pdfTeX{} user manual}. +% Baskerville, 8(1), 9--14 (1998), +% \biburl{http://uk-tug-archive.tug.org/wp-installed-content/uploads/2008/12/81.pdf}. +% +% \bibitem{pdftex} +% \bibauthor{Th\`anh, Han The} et al. +% \bibtitle{\pdfTeX}. +% 2023, +% \biburl{http://mirrors.ctan.org/systems/doc/pdftex/manual/pdftex-a.pdf}. +% \end{thebibliography} +% \end{RaggedRight} +% +% +% \clearpage +% \begin{RaggedRight} +% \setcounter{IndexColumns}{2} +% \setlength{\columnsep}{30pt} +% \label{sec:index} +% \phantomsection +% \addcontentsline{toc}{section}{Index} +% \PrintIndex +% \end{RaggedRight} +% } +% +% +% \clearpage +% \section{Package Code}\label{sec:package-code} +% \addtocontents{toc}{\begingroup\small} +% \addtocontents{toc}{\protect\begin{multicols}{2}} +% \addtocontents{toc}{\protect\raggedcolumns} +% +% This is the \doublequotes{Reference Manual} section of the documentation +% where we describe the package's code +% and explain its implementation details. +% +% +% \begin{macrocode} +%<*package> +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{synthslant} + [2024/05/07 v0.1 Synthetically Slant glyphs] + +\RequirePackage{iftex} +\RequirePackage{xkeyval} + +% \end{macrocode} +% +% +% \subsection{Declaration of Default Slants} +% +% \begin{macro}{\synthslant} +% Introduce a reasonable default for the slant. Let the user override it if she knows +% better. +% +% Remember that the slant is not an angle (with respect to the \(y\)-axis), but the sine of +% it; The value~\(.2\) approximately corresponds to a slant-angle of 12\textdegree\!. +% +% \begin{macrocode} +\providecommand*{\synthslant}{.2} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\synthnegslant} +% Also introduce a reasonable default for the negative slant, which is used for upright +% italics. +% +% \begin{macrocode} +\providecommand*{\synthnegslant}{-.2} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Selection of Slant-Engine} +% +% We provide several methods to slant glyphs. The actual slanting is delegated to a +% \singlequotes{slant-engine} which shears the glyphs. +% +% \begin{macro}{\synthslant@engine} +% Default to automatic selection of the slant engine. +% +% \begin{macrocode} +\def\synthslant@engine{-1} + +% \end{macrocode} +% \end{macro} +% +% Expose default forward and backward slant values as package options. +% +% \begin{macrocode} +\DeclareOptionX{slant}{% + \xdef\synthslant{\fpeval{#1}}% + \xdef\synthnegslant{\fpeval{-(#1)}}} +\DeclareOptionX{negslant}{\xdef\synthnegslant{\fpeval{#1}}} +\DeclareOptionX{posslant}{\xdef\synthslant{\fpeval{#1}}} + +% \end{macrocode} +% +% Make slant-engine selection configurable. +% +% \begin{macrocode} +\DeclareOptionX{auto}{\def\synthslant@engine{-1}} +\DeclareOptionX{PDF}{\def\synthslant@engine{0}} +\DeclareOptionX{pdf}{\def\synthslant@engine{0}} +\DeclareOptionX{l3draw}{\def\synthslant@engine{1}} +\DeclareOptionX{ps}{\def\synthslant@engine{2}} +\DeclareOptionX{PS}{\def\synthslant@engine{2}} +\DeclareOptionX{tikz}{\def\synthslant@engine{3}} +\DeclareOptionX{TikZ}{\def\synthslant@engine{3}} +\DeclareOptionX{fontspec}{\def\synthslant@engine{4}} +\DeclareOptionX{disable}{\def\synthslant@engine{10000}} + +\ProcessOptionsX\relax + +% \end{macrocode} +% +% Require sane parameter values. +% +% \begin{macrocode} +\ExplSyntaxOn +\fp_compare:nNnTF {\synthslant} < {.0} + {\PackageError{synthslant}{\string\synthslant\space <\space 0} + {Pass\space a\space value\space that\space is\space non-negative.}} + {} +\fp_compare:nNnTF {\synthnegslant} > {.0} + {\PackageError{synthslant}{\string\synthnegslant\space >\space 0} + {Pass\space a\space value\space that\space is\space non-positive.}} + {} +\ExplSyntaxOff + +% \end{macrocode} +% +% Announce the positive and negative slant values now that we are sure they are ok. This may +% be useful information if the user passed a (complicated) floating-point expression and wants +% to know how \LaTeX{} did evaluate it. +% +% \begin{macrocode} +\PackageInfo{synthslant}{\string\synthslant=\synthslant} +\PackageInfo{synthslant}{\string\synthnegslant=\synthnegslant} + + +% \end{macrocode} +% +% +% \subsection{Slant Engines} +% +% The auto-selection code is pretty trivial. If we identify \pdfTeX{} running we select the +% \acronym{PDF}-engine, for \LuaLaTeX{} we select the \packagename{fontspec}-engine, and in all +% other cases we let the \packagename{l3draw}-layer handle the shearing. +% +% \begin{macrocode} +\ifnum\synthslant@engine<0 + \PackageInfo{synthslant}{auto-selecting slant engine} + + \ifpdftex + \ifnum\pdfoutput>0 + \def\synthslant@engine{0} + \else + \def\synthslant@engine{1} + \fi + \else + \ifluatex + \def\synthslant@engine{4} + \else + \def\synthslant@engine{1} + \fi + \fi +\fi + + +% \end{macrocode} +% +% +% \begin{macro}{\synthslant@shear@box} +% The various slant engine macros are all subsumed under \cs{synthslant@\-shear@\-box}. So +% the higher-level code becomes (almost) engine independent. +% \end{macro} +% +% +% \begin{macro}{\synthslant@engine@name} +% Sometimes we would like to recover the (printable) name of the selected slant engine. +% +% \begin{macrocode} +\newcommand*{\synthslant@engine@name}{% + \ifcase\synthslant@engine + PDF% + \or% 1 + l3draw% + \or% 2 + PSTricks% + \or% 3 + TikZ% + \or% 4 + fontspec% + \else + null-implementation% + \fi +} + +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{\acronym{PDF} Slant Engine} +% +% The \acronym{PDF}-engine works well and it is the best tested alternative. +% +% \begin{macrocode} +\ifcase\synthslant@engine% 0: PDF + \PackageInfo{synthslant}{shearing done by PDF} + + \newbox{\synthslant@box} + +% \end{macrocode} +% \begin{macro}{\synthslant@pdf@shear@box} +% \begin{macrocode} + \newcommand*{\synthslant@pdf@shear@box}[2]{% + \mbox{\sbox{\synthslant@box}{#2}% + \hskip\wd\synthslant@box + \pdfsave + \pdfsetmatrix{1 0 #1 1}% + \llap{\usebox{\synthslant@box}}% + \pdfrestore}% + } + +% \end{macrocode} +% \end{macro} +% \begin{macrocode} + \let\synthslant@shear@box=\synthslant@pdf@shear@box +% \end{macrocode} +% +% +% \subsubsection{\packagename{l3draw} Slant Engine} +% +% Using \LaTeXIII{} may be like cheating on a very high level as the draw subsystem may +% delegate to the \acronym{PDF}-engine itself. \acronym{LOL!} +% +% \begin{macrocode} +\or% 1: LaTeX3 draw subsystem + \PackageInfo{synthslant}{shearing delegated to l3draw} + + \RequirePackage{l3draw} + + \ExplSyntaxOn +% \end{macrocode} +% \begin{macro}{\synthslant@latex@shear@box} +% Slanting implemented with the experimental l3draw subsystem. +% +% \begin{anticipatedchange} +% As soon as the l3kernel offers an x-shear operation (\cs{box\_xshear:Nn}?) we shall ditch +% this implementation and switch to the one that is tailored to \emph{text} instead of the +% current one for graphics. +% \end{anticipatedchange} +% +% \begin{macrocode} + \NewDocumentCommand{\synthslant@latex@shear@box}{mm}{ + \hbox_set:Nn \l_tmpa_box {#2} + \dim_set:Nn \l_tmpa_dim {\box_wd:N \l_tmpa_box} + \dim_set:Nn \l_tmpb_dim {\box_ht:N \l_tmpa_box} + \draw_begin: + \draw_transform_xslant:n {#1} +% \end{macrocode} +% +% Force the baseline of the payload (\#2) to coincide with the baseline of the surrounding +% text. This --~of course~-- screws up our bounding box at least vertically. +% +% \begin{macrocode} + \box_set_dp:Nn \l_tmpa_box {\z@} +% \end{macrocode} +% +% Here comes a fudge because the l3draw bounding boxes are way too loose. For positive +% slants: shrink the box-width by the box-height times~\meta{slant}. For negative slants: +% shrink the box-width as for positive slants and in addition shift the payload to the left by +% the box-height times~\meta{slant}. +% +% \begin{macrocode} + \fp_compare:nNnTF {#1} >= {.0} + { + \box_set_wd:Nn \l_tmpa_box {\l_tmpa_dim - #1\l_tmpb_dim} + } + { + \draw_suspend_begin: + \kern#1\l_tmpb_dim + \draw_suspend_end: + \box_set_wd:Nn \l_tmpa_box {\l_tmpa_dim + #1\l_tmpb_dim} + } +% \end{macrocode} +% +% Now typeset the box. +% +% \begin{macrocode} + \draw_box_use:N \l_tmpa_box + \draw_end: + } +% \end{macrocode} +% \end{macro} +% \begin{macrocode} + \ExplSyntaxOff + + \let\synthslant@shear@box=\synthslant@latex@shear@box +% \end{macrocode} +% +% +% \subsubsection{\pstrickslogo{} Slant Engine} +% +% Shearing via \pstrickslogo{} works, but exhibits a weird interface. +% +% \begin{macrocode} +\or% 2: PSTricks + \PackageInfo{synthslant} + {shearing deferred to PostScript via PSTricks} + + \RequirePackage{pst-3d}% \pstilt + +% \end{macrocode} +% +% Package~\packagename{pstricks} offers \cs{pstilt} and \cs{psTilt} both with typographically +% sub-optimal outcomes. +% +% \begin{macro}{\synthslant@pstricks@shear@box} +% \begin{macrocode} + \newcommand*{\synthslant@pstricks@shear@box}[2]{% + \pstilt{\fpeval{57.2958 * acos(#1)}}{#2}% + } + +% \end{macrocode} +% \end{macro} +% \begin{macrocode} + \let\synthslant@shear@box=\synthslant@pstricks@shear@box +% \end{macrocode} +% +% +% \subsubsection{\tikzlogo{} Slant Engine} +% +% The \tikzlogo{} code has not been tested thoroughly yet, but it looks like it could work +% after some tweaking. +% +% \begin{macrocode} +\or% 3: TikZ + \PackageInfo{synthslant}{shearing by TikZ} + + \RequirePackage{tikz} + +% \end{macrocode} +% \begin{macro}{\synthslant@tikz@shear@box} +% \begin{macrocode} + \newcommand*{\synthslant@tikz@shear@box}[2]{% + \tikz[baseline = (ANCHOR.base), xslant = #1] + \node[inner sep = 0pt, xslant = #1] (ANCHOR) {#2}; + } + +% \end{macrocode} +% \end{macro} +% \begin{macrocode} + \let\synthslant@shear@box=\synthslant@tikz@shear@box +% \end{macrocode} +% +% +% \subsubsection{\packagename{fontspec}} +% +% The \packagename{fontspec} works particularly well, but it does not jibe with \pdfTeX. +% +% \begin{macrocode} +\or% 4: fontspec + \PackageInfo{synthslant} + {use fontspec's artificial font transformations} + + \RequirePackage{fontspec} + + \ExplSyntaxOn +% \end{macrocode} +% \begin{macro}{\synthslantbox@fontspect@shear@box} +% \begin{macrocode} + \newcommand*{\synthslantbox@fontspect@shear@box}[2]{ + \begingroup + \expandafter\fontspec[FakeSlant = #1]{\l_fontspec_family_tl} + #2 + \endgroup + } +% \end{macrocode} +% \end{macro} +% \begin{macrocode} + \ExplSyntaxOff + + \let\synthslant@shear@box=\synthslantbox@fontspect@shear@box +% \end{macrocode} +% +% +% \subsubsection{Null Implementation} +% +% The null implementation --~which does exactly what its name implies~-- can be useful for +% debugging or to get rid of the effect temporarily. +% +% \begin{macrocode} +\else% >=5: Null implementation + \PackageWarning{synthslant}{shearing disabled} + +% \end{macrocode} +% \begin{macro}{\synthslant@identity@shear@box} +% \begin{macrocode} + \newcommand*{\synthslant@identity@shear@box}[2]{#2} + +% \end{macrocode} +% \end{macro} +% \begin{macrocode} + \let\synthslant@shear@box=\synthslant@identity@shear@box +\fi + + +% \end{macrocode} +% +% +% \subsection{Generic Slant Code} +% +% Here comes the engine-independent code. +% +% \begin{macro}{\synthslant@nolinebreak} +% The \LaTeXIII{} and \tikzlogo{} engines break lines at \singlequotes{unexpected} points. +% Here is a duct-tape solution for them that concretes together the adajacent parts. +% +% \begin{macrocode} +\def\synthslant@nolinebreak{% + \ifnum\synthslant@engine=1% l3draw + \nolinebreak + \else + \ifnum\synthslant@engine=3% TikZ + \nolinebreak + \fi + \fi +} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\synthslantbox@soft@hyphen} +% Allow for line breaks at hyphenation opportunities~(\singlequotes{\cs{-}}). +% +% \begin{macrocode} +\def\synthslantbox@soft@hyphen#1\-#2\relax{% + \synthslant@shear@box{\synthslant@slant@value}{#1}% + \ifx\relax#2% + \relax + \else + \synthslant@nolinebreak + \discretionary{-}{}{}% + \synthslantbox@soft@hyphen#2\relax + \fi +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\synthslantbox@hard@hyphen} +% Allow for line breaks at embedded, explicit hyphens~(\singlequotes{-}). +% +% \begin{macrocode} +\def\synthslantbox@hard@hyphen#1-#2\relax{% + \synthslantbox@soft@hyphen#1\-\relax + \ifx\relax#2% + \relax + \else + \synthslant@nolinebreak + \synthslant@shear@box{\synthslant@slant@value}{-}% + \synthslant@nolinebreak + \discretionary{}{}{}% + \synthslantbox@hard@hyphen#2\relax + \fi +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\synthslantbox@space} +% Allow for line breaks at embedded spaces~(\singlequotes{\textvisiblespace}). +% +% \begin{macrocode} +\def\synthslantbox@space#1 #2\relax{% + \synthslantbox@hard@hyphen#1-\relax + \ifx\relax#2% + \relax + \else + \space + \synthslantbox@space#2\relax + \fi +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\synthslantbox} +% We define two completely different implementations depending on the request for +% \packagename{fontspec} doing the slanting or any other package. +% +% Macro~1: Immediately call the \packagename{fontspec}-specific macro. Bypass the hierarchy +% needed for the other slant engines. +% +% \begin{macrocode} +\ifnum\synthslant@engine=4% fontspec + \newrobustcmd*{\synthslantbox}[2]{% + \edef\synthslant@slant@value{#1}% definition for compatibility of both branches + \synthslantbox@fontspect@shear@box{\synthslant@slant@value}{#2}% + } +% \end{macrocode} +% +% Macro~2: This is the firestarter for the processing of all different kinds breakpoints +% until we reach unbreakable chunks to be passed on to the selected slant engine. +% +% Normally, a user wants to call \cs{text\-synth\-slant} or +% \cs{text\-synth\-up\-right\-italic}, however \LaTeX~wizards may have other ideas. +% +% \begin{macrocode} +\else + \newrobustcmd*{\synthslantbox}[2]{% + \edef\synthslant@slant@value{#1}% + \expandafter\synthslantbox@space#2 \relax\relax + } +\fi + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\synthslantbox@right@slant@correction} +% This is a simple yet surprisingly effective heuristic for slant correction on the +% right-hand side if the slanted text. The value~\cs{synthslant} is \(\sin \alpha\), where +% \(\alpha\) is the slant angle; see \cref{equ:shear-transformation} on +% \cpageref{equ:shear-transformation}. Multiplied with the ex-height of the current font, +% \cs{fontdimen5}, this is a good approximation of the necessary slant correction. +% +% \begin{macrocode} +\newcommand*{\synthslantbox@right@slant@correction}{% + \dimen0=\fontdimen5\font + \kern\synthslant\dimen0\relax +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\slantcontext} +% If we have \packagename{microtype} support we enter the context defined by this macro in +% |slantenvironment|. +% +% \begin{macrocode} +\newcommand*{\slantcontext}{tracking=synthslant} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{slantenvironment} +% We use this environment as a pair of hooks that are called right before and right after the +% actual slanting code runs. The default sets up an upright type shape before and adds some +% italic correction after slanting. +% +% \begin{macrocode} +\NewDocumentEnvironment{slantenvironment}{} + {\upshape + \ifcsdef{microtypecontext} + {\expandafter\microtypecontext\expandafter{\slantcontext}} + {}} + {\ifcsdef{endmicrotypecontext} + {\endmicrotypecontext} + {}% + \synthslantbox@right@slant@correction} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\textsynthslant} +% User-level macro to slant some text. +% +% \begin{macrocode} +\NewDocumentCommand{\textsynthslant}{m} + {\ifmmode + \synthslantbox{\synthslant}{#1}% + \else + {\slantenvironment + \synthslantbox{\synthslant}{#1}% + \endslantenvironment}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\synthslantbox@right@negslant@correction} +% We could play the same trick here as in \cs{synthslantbox@right@slant@correction} and use +% \cs{synthnegslant} instead of \cs{synthslant}. But my experiments show no need for a +% correction. Anyhow, this macro may be convenient to override someday. +% +% \begin{macrocode} +\newcommand*{\synthslantbox@right@negslant@correction}{} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\negslantcontext} +% If we have \packagename{microtype} support we enter the context defined by this macro in +% |negslantenvironment|. +% +% \begin{macrocode} +\newcommand*{\negslantcontext}{tracking=synthnegslant} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{negslantenvironment} +% We use this environment as a pair of hooks that are called right before and right after the +% actual un-slanting code runs. +% +% The default sets up an italics shape before un-slanting and adds some negative italic +% correction after un-slanting. +% +% \begin{macrocode} +\NewDocumentEnvironment{negslantenvironment}{} + {\itshape + \ifcsdef{microtypecontext} + {\expandafter\microtypecontext\expandafter{\negslantcontext}} + {}} + {\ifcsdef{endmicrotypecontext} + {\endmicrotypecontext} + {}% + \synthslantbox@right@negslant@correction} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\textsynthuprightitalic} +% User-level macro to un-slant some italics or oblique text. +% +% \begin{macrocode} +\NewDocumentCommand{\textsynthuprightitalic}{m} + {\ifmmode + \synthslantbox{\synthnegslant}{#1}% + \else + {\negslantenvironment + \synthslantbox{\synthnegslant}{#1}% + \endnegslantenvironment}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% +% +% \iffalse +%</package> +% \fi +% +% +% \addtocontents{toc}{\protect\end{multicols}} +% \addtocontents{toc}{\endgroup} +% +% +% \Finale +% +% +% +% +% \iffalse +% <DISABLE-SPELL-CHECK> +%<*compare-with-the-gimp> +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 +KJ8AAAAASUVORK5CYII= +%</compare-with-the-gimp> +% </DISABLE-SPELL-CHECK> +% \fi +% +% +% \iffalse +%<*gauge> +\documentclass[a4paper]{article} + +\usepackage{booktabs} +\usepackage[tracking=alltext, letterspace=0, verbose]{microtype} +\usepackage{multicol} +\usepackage{parskip} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% Setup SyntSlant and Load Font +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\usepackage[]{synthslant}% auto/disable; fontspec/l3draw/pdf/ps/tikz +%--\usepackage[fontspec, posslant = .16, negslant = -.14]{synthslant} + +%% +%% All LaTeX Variants +%% +\usepackage[T1]{fontenc} +%%--\usepackage{ebgaramond}\def\synthslant{.3}\def\synthnegslant{-.27} +%%--\usepackage{librecaslon}\def\synthslant{.38}\def\synthnegslant{-.33} +%%--\usepackage{merriweather}\def\synthslant{.14}\def\synthnegslant{-.12} +\usepackage{mlmodern}\def\synthslant{.23}\def\synthnegslant{-.21} +%%--\usepackage{spectral}\def\synthslant{.18}\def\synthnegslant{-.15} + +%% +%% Requires e.g. LuaLaTeX +%% +%%--\usepackage{CharisSIL}% say: `make LATEX=lualatex gauge' + +%% +%% Preload a reasonable font (triple?) if we work with fontspec +%% and have not already done so, e.g., by saying `\usepackage{...}'. +%% +\ExplSyntaxOn +\sys_if_engine_luatex:T + { + \cs_if_exist:NTF \l_fontspec_font + {} + { + \setmainfont{TeX Gyre Pagella} + \def\synthslant{.16} + \def\synthnegslant{-.14} + } + } +\ExplSyntaxOff + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% End Setup/Load Font +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\renewcommand*{\arraystretch}{1.12} + +\newcommand*{\code}[1]{\texttt{#1}} + +\newcommand*{\cs}[1]{\texttt{\char`\\#1}} + +\newcommand*{\doublealphabet} + {ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789} +\newcommand*{\doublealphabethyp} + {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\-% + 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\-% + 0\-1\-2\-3\-4\-5\-6\-7\-8\-9} + +\newcommand*{\fontsample}{aefgiv} +\newcommand*{\FontSample}{White Handgloves} +\newcommand*{\FONTSAMPLE}{H\AA{}MB\"URG\'EF\O{}\~N\v{S}} + +\newcommand*{\generictextfraction}[2] + {\mbox{\raisebox{.4em}[0pt]{\scriptsize #1}% + \hspace*{-.1em}\textfractionsolidus\hspace*{-.1em}% + \raisebox{-.1em}[0pt][0pt]{\scriptsize #2}}} + +\newcommand*{\longfontsample}{The quick brown fox jumps over the lazy dog.} + +\newcommand*{\measurewidth}[1]{\setbox0=\hbox{#1}\the\wd0\space} + +\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}} + +\newcommand*{\showbaseline}{\space\rule{.5em}{.4pt}\space} + +\newcommand*{\showboundingbox}[1]{ + {\setlength{\fboxsep}{0pt} + \setlength{\fboxrule}{.4pt} + \framebox{#1}} +} + +\let\slbox=\synthslantbox + +\makeatletter +\newcommand*{\thewidthdiffof}[2] + {\setbox0=\hbox{#2} + \dimen0=\dimexpr\wd0 - #1\relax + \strip@pt\dimen0} +\newcommand*{\thewidthof}[1] + {\setbox0=\hbox{#1} + \dimen0=\dimexpr\numexpr\dimexpr\wd0 * 10\relax/65536\relax pt / 10\relax + \strip@pt\dimen0} +\makeatother + + +\addtolength{\textheight}{\headheight} +\addtolength{\textheight}{\headsep} +\setlength{\headheight}{0pt} +\setlength{\headsep}{0pt} + +\setlength{\overfullrule}{3pt} + + +\pagestyle{plain} + + +\begin{document} +{\huge\sf\bfseries SyntSlant Calibration Sheet\par\bigskip} + +Selected slant engine: \makeatletter\synthslant@engine@name\makeatother. +Font name: \fontname\font. + + +\section{Shapes of Selected Font} + +\begin{center} + \begin{tabular}{@{}lllll@{}} + \toprule + Shape & Code Seq. & L.case & Mixed Case & Uppercase \\ + \midrule + Normal & + \cs{normalfont} & {\normalfont\fontsample} & {\normalfont\FontSample} & {\normalfont\FONTSAMPLE} \\ + Italics & + \cs{itshape} & {\itshape\fontsample} & {\itshape\FontSample} & {\itshape\FONTSAMPLE} \\ + \bottomrule + \end{tabular} +\end{center} + + +\section{Slanted Samples} + +\begin{center} + \begin{tabular}{@{}llll@{}} + \toprule + Slant & L.case & Mixed Case & Uppercase \\ + \midrule + .10 & \slbox{.10}{\fontsample} & \slbox{.10}{\FontSample} & \slbox{.10}{\FONTSAMPLE} \\ + .11 & \slbox{.11}{\fontsample} & \slbox{.11}{\FontSample} & \slbox{.11}{\FONTSAMPLE} \\ + .12 & \slbox{.12}{\fontsample} & \slbox{.12}{\FontSample} & \slbox{.12}{\FONTSAMPLE} \\ + .13 & \slbox{.13}{\fontsample} & \slbox{.13}{\FontSample} & \slbox{.13}{\FONTSAMPLE} \\ + .14 & \slbox{.14}{\fontsample} & \slbox{.14}{\FontSample} & \slbox{.14}{\FONTSAMPLE} \\ + .15 & \slbox{.15}{\fontsample} & \slbox{.15}{\FontSample} & \slbox{.15}{\FONTSAMPLE} \\ + .16 & \slbox{.16}{\fontsample} & \slbox{.16}{\FontSample} & \slbox{.16}{\FONTSAMPLE} \\ + .17 & \slbox{.17}{\fontsample} & \slbox{.17}{\FontSample} & \slbox{.17}{\FONTSAMPLE} \\ + .18 & \slbox{.18}{\fontsample} & \slbox{.18}{\FontSample} & \slbox{.18}{\FONTSAMPLE} \\ + .19 & \slbox{.19}{\fontsample} & \slbox{.19}{\FontSample} & \slbox{.19}{\FONTSAMPLE} \\[.25em] + .20 & \slbox{.20}{\fontsample} & \slbox{.20}{\FontSample} & \slbox{.20}{\FONTSAMPLE} \\ + .21 & \slbox{.21}{\fontsample} & \slbox{.21}{\FontSample} & \slbox{.21}{\FONTSAMPLE} \\ + .22 & \slbox{.22}{\fontsample} & \slbox{.22}{\FontSample} & \slbox{.22}{\FONTSAMPLE} \\ + .23 & \slbox{.23}{\fontsample} & \slbox{.23}{\FontSample} & \slbox{.23}{\FONTSAMPLE} \\ + .24 & \slbox{.24}{\fontsample} & \slbox{.24}{\FontSample} & \slbox{.24}{\FONTSAMPLE} \\ + .25 & \slbox{.25}{\fontsample} & \slbox{.25}{\FontSample} & \slbox{.25}{\FONTSAMPLE} \\ + .26 & \slbox{.26}{\fontsample} & \slbox{.26}{\FontSample} & \slbox{.26}{\FONTSAMPLE} \\ + .27 & \slbox{.27}{\fontsample} & \slbox{.27}{\FontSample} & \slbox{.27}{\FONTSAMPLE} \\ + .28 & \slbox{.28}{\fontsample} & \slbox{.28}{\FontSample} & \slbox{.28}{\FONTSAMPLE} \\ + .29 & \slbox{.29}{\fontsample} & \slbox{.29}{\FontSample} & \slbox{.29}{\FONTSAMPLE} \\[.25em] + .30 & \slbox{.30}{\fontsample} & \slbox{.30}{\FontSample} & \slbox{.30}{\FONTSAMPLE} \\ + .31 & \slbox{.31}{\fontsample} & \slbox{.31}{\FontSample} & \slbox{.31}{\FONTSAMPLE} \\ + .32 & \slbox{.32}{\fontsample} & \slbox{.32}{\FontSample} & \slbox{.32}{\FONTSAMPLE} \\ + .33 & \slbox{.33}{\fontsample} & \slbox{.33}{\FontSample} & \slbox{.33}{\FONTSAMPLE} \\ + .34 & \slbox{.34}{\fontsample} & \slbox{.34}{\FontSample} & \slbox{.34}{\FONTSAMPLE} \\ + .35 & \slbox{.35}{\fontsample} & \slbox{.35}{\FontSample} & \slbox{.35}{\FONTSAMPLE} \\ + .36 & \slbox{.36}{\fontsample} & \slbox{.36}{\FontSample} & \slbox{.36}{\FONTSAMPLE} \\ + .37 & \slbox{.37}{\fontsample} & \slbox{.37}{\FontSample} & \slbox{.37}{\FONTSAMPLE} \\ + .38 & \slbox{.38}{\fontsample} & \slbox{.38}{\FontSample} & \slbox{.38}{\FONTSAMPLE} \\ + .39 & \slbox{.39}{\fontsample} & \slbox{.39}{\FontSample} & \slbox{.39}{\FONTSAMPLE} \\ + \bottomrule + \end{tabular} +\end{center} + + +\clearpage +\section{Examples} + +\let\r=\textrm +\let\i=\textit +\let\u=\textsynthuprightitalic +\let\y=\textsynthslant + +The current slant values are +\mbox{\cs{synthslant}\:=\:\synthslant} and +\mbox{\cs{synthnegslant}\:=\:\synthnegslant}. + + +\subsection{Copy} + +We mix different shapes to gauge the homogeneity of slant angles and +overall gray values. Some overfull horizontal boxes are possible even with +package~\packagename{microtype} being active. + +\setlength{\columnsep}{20pt} +\begin{multicols}{2}\fussy + \setlength{\overfullrule}{3pt} + \paragraph{Roman/Italics.}\leavevmode + + \r{Grumpy} \i{wizards} \r{make} \i{toxic} \r{brew} \i{for} \r{the} \i{evil} \r{Queen} \i{and} \r{Jack.} + \r{One} \i{morning,} \r{when} \i{Gregor} \r{Samsa} \i{woke} \r{from} \i{troubled} \r{dreams,} + \r{he} \i{found} \r{himself} \i{transformed} \r{in} \i{his} \r{bed} \i{into} \r{a} \i{horrible} \r{vermin.} + \r{He} \i{lay} \r{on} \i{his} \r{armour-like} \i{back,} + \r{and} \i{if} \r{he} \i{lifted} \i{his} \r{head} + \r{a} \i{little} \r{he} \i{could} \r{see} \i{his} \r{brown} \i{belly,} + \r{slightly} \i{domed} \r{and} \i{divided} \r{by} \i{arches} \r{into} \i{stiff} \r{sections.} + \r{The} \i{bedding} \r{was} \i{hardly} \r{able} \i{to} + \r{cover} \i{it} \r{and} \i{seemed} \r{ready} \i{to} \r{slide} \i{off} \r{any} \i{moment.} + \r{His} \i{many} \r{legs,} + \r{pitifully} \i{thin} \r{compared} \i{with} \r{the} \i{size} \r{of} \i{the} \r{rest} \i{of} \r{him,} + \r{waved} \i{about} \r{helplessly} \i{as} \r{he} \i{looked.} + + + \paragraph{Roman/Slanted Roman.}\leavevmode + + \r{Grumpy} \y{wizards} \r{make} \y{toxic} \r{brew} \y{for} \r{the} \y{evil} \r{Queen} \y{and} \r{Jack.} + \r{One} \y{morn\-ing,} \r{when} \y{Gregor} \r{Samsa} \y{woke} \r{from} \y{trou\-bled} \r{dreams,} + \r{he} \y{found} \r{himself} \y{trans\-formed} \r{in} \y{his} \r{bed} \y{into} \r{a} \y{hor\-ri\-ble} \r{vermin.} + \r{He} \y{lay} \r{on} \y{his} \r{armour-like} \y{back,} + \r{and} \y{if} \r{he} \y{lifted} \y{his} \r{head} + \r{a} \y{little} \r{he} \y{could} \r{see} \y{his} \r{brown} \y{belly,} + \r{slightly} \y{domed} \r{and} \y{divided} \r{by} \y{arches} \r{into} \y{stiff} \r{sections.} + \r{The} \y{bedding} \r{was} \y{hardly} \r{able} \y{to} + \r{cover} \y{it} \r{and} \y{seemed} \r{ready} \y{to} \r{slide} \y{off} \r{any} \y{mo\-ment.} + \r{His} \y{many} \r{legs,} + \r{pitifully} \y{thin} \r{compared} \y{with} \r{the} \y{size} \r{of} \y{the} \r{rest} \y{of} \r{him,} + \r{waved} \y{about} \r{helplessly} \y{as} \r{he} \y{looked.} + + + \paragraph{Italics/Slanted Roman.}\leavevmode + + \i{Grumpy} \y{wizards} \i{make} \y{toxic} \i{brew} \y{for} \i{the} \y{evil} \i{Queen} \y{and} \i{Jack.} + \i{One} \y{morn\-ing,} \i{when} \y{Gregor} \i{Samsa} \y{woke} \i{from} \y{trou\-bled} \i{dreams,} + \i{he} \y{found} \i{himself} \y{trans\-formed} \i{in} \y{his} \i{bed} \y{into} \i{a} \y{hor\-ri\-ble} \i{vermin.} + \i{He} \y{lay} \i{on} \y{his} \i{armour-like} \y{back,} + \i{and} \y{if} \i{he} \y{lifted} \y{his} \i{head} + \i{a} \y{little} \i{he} \y{could} \i{see} \y{his} \i{brown} \y{belly,} + \i{slightly} \y{domed} \i{and} \y{divided} \i{by} \y{arches} \i{into} \y{stiff} \i{sections.} + \i{The} \y{bedding} \i{was} \y{hardly} \i{able} \y{to} + \i{cover} \y{it} \i{and} \y{seemed} \i{ready} \y{to} \i{slide} \y{off} \i{any} \y{mo\-ment.} + \i{His} \y{many} \i{legs,} + \i{pitifully} \y{thin} \i{compared} \y{with} \i{the} \y{size} \i{of} \y{the} \i{rest} \y{of} \i{him,} + \i{waved} \y{about} \i{helplessly} \y{as} \i{he} \y{looked.} + + + \paragraph{Roman/Italics/Slanted Roman.}\leavevmode + + \r{Grumpy} \i{wizards} \y{make} \r{toxic} \i{brew} \y{for} \r{the} \i{evil} \y{Queen} \r{and} \i{Jack.} + \r{One} \i{morning,} \y{when} \r{Gregor} \i{Samsa} \y{woke} \r{from} \i{troubled} \y{dreams,} + \r{he} \i{found} \y{him\-self} \r{transformed} \i{in} \y{his} \r{bed} \i{into} \r{a} \i{horrible} \y{ver\-min.} + \r{He} \i{lay} \y{on} \r{his} \i{armour-like} \y{back,} + \r{and} \i{if} \y{he} \r{lifted} \i{his} \y{head} + \r{a} \i{little} \y{he} \r{could} \i{see} \y{his} \r{brown} \i{belly,} + \r{slightly} \i{domed} \y{and} \r{divided} \i{by} \y{arches} \r{into} \i{stiff} \y{sec\-tions.} + \r{The} \i{bedding} \y{was} \r{hardly} \i{able} \y{to} + \r{cover} \i{it} \y{and} \r{seemed} \i{ready} \y{to} \r{slide} \i{off} \y{any} \r{moment.} + \r{His} \i{many} \y{legs,} + \r{pitifully} \i{thin} \y{compared} \r{with} \i{the} \y{size} \r{of} \i{the} \y{rest} \r{of} \i{him,} + \r{waved} \i{about} \y{helplessly} \r{as} \r{he} \y{looked.} + + + \paragraph{Roman/Upright Italics.}\leavevmode + + \r{Grumpy} \u{wizards} \r{make} \u{toxic} \r{brew} \u{for} \r{the} \u{evil} \r{Queen} \u{and} \r{Jack.} + \r{One} \u{morn\-ing,} \r{when} \u{Gregor} \r{Samsa} \u{woke} \r{from} \u{trou\-bled} \r{dreams,} + \r{he} \u{found} \r{himself} \u{trans\-formed} \r{in} \u{his} \r{bed} \u{into} \r{a} \u{hor\-ri\-ble} \r{vermin.} + \r{He} \u{lay} \r{on} \u{his} \r{armour-like} \u{back,} + \r{and} \u{if} \r{he} \u{lifted} \u{his} \r{head} + \r{a} \u{little} \r{he} \u{could} \r{see} \u{his} \r{brown} \u{belly,} + \r{slightly} \u{domed} \r{and} \u{divided} \r{by} \u{arches} \r{into} \u{stiff} \r{sections.} + \r{The} \u{bedding} \r{was} \u{hardly} \r{able} \u{to} + \r{cover} \u{it} \r{and} \u{seemed} \r{ready} \u{to} \r{slide} \u{off} \r{any} \u{mo\-ment.} + \r{His} \u{many} \r{legs,} + \r{pitifully} \u{thin} \r{compared} \u{with} \r{the} \u{size} \r{of} \u{the} \r{rest} \u{of} \r{him,} + \r{waved} \u{about} \r{helplessly} \u{as} \r{he} \u{looked.} +\end{multicols} + + +\clearpage +\subsection{Bounding Box} + +Thin lines indicate the baseline. All bounding boxes should be very tight. A little piercing +into the box in the direction of the slant operation is acceptable. + +\begin{center} + \begin{tabular}{@{}l@{\showbaseline}l@{\showbaseline}l@{\showbaseline}} + \cs{textrm} & + \showboundingbox{\textrm{\fontsample}} & + \showboundingbox{\textrm{\FONTSAMPLE}} \\ + \cs{textit} & + \showboundingbox{\textit{\fontsample}} & + \showboundingbox{\textit{\FONTSAMPLE}} \\ + \cs{synthslantbox}\code{\{\synthslant\}} & + \showboundingbox{\synthslantbox{\synthslant}{\fontsample}} & + \showboundingbox{\synthslantbox{\synthslant}{\FONTSAMPLE}} \\ + \cs{synthslantbox}\code{\{\synthnegslant\}} & + \showboundingbox{\synthslantbox{\synthnegslant}{\itshape\fontsample}} & + \showboundingbox{\synthslantbox{\synthnegslant}{\itshape\FONTSAMPLE}} \\ + \cs{textsynthslant} & + \showboundingbox{\textsynthslant{\fontsample}} & + \showboundingbox{\textsynthslant{\FONTSAMPLE}} \\ + \cs{textsynthuprightitalic} & + \showboundingbox{\textsynthuprightitalic{\fontsample}} & + \showboundingbox{\textsynthuprightitalic{\FONTSAMPLE}} + \end{tabular} +\end{center} + + +\subsection{Width Change with \cs{synthslantbox}?} + +Widths of the alphabet in uppercase and lowercase letter plus the digits. The ``hyp''~version +contains discretionary hyphens (\cs{-}) between each of the letters or digits. The absolute +value of all deltas should be much less than 3pt. + +\begin{center} + \newlength{\abcplain}\settowidth{\abcplain}{\doublealphabet} + \newlength{\abchyp}\settowidth{\abchyp}{\doublealphabethyp} + \begin{tabular}[t]{@{}lrll@{}} + \toprule + \cs{upshape} & Slant & Width & Delta \\ + {} & & pt & pt \\ + \midrule + ABC & --- & \thewidthof{\doublealphabet} & --- \\ + ABC hyp & --- & \thewidthof{\doublealphabethyp} & --- \\ + % + ABC & 0 & + \thewidthof{\synthslantbox{0}{\doublealphabet}} & + \thewidthdiffof{\abcplain}{\synthslantbox{0}{\doublealphabet}} \\ + ABC hyp & 0 + & \thewidthof{\synthslantbox{0}{\doublealphabethyp}} & + \thewidthdiffof{\abchyp}{\synthslantbox{0}{\doublealphabethyp}} \\ + % + ABC & .1 & + \thewidthof{\synthslantbox{.1}{\doublealphabet}} & + \thewidthdiffof{\abcplain}{\synthslantbox{.1}{\doublealphabet}} \\ + ABC hyp & .1 & + \thewidthof{\synthslantbox{.1}{\doublealphabethyp}} & + \thewidthdiffof{\abchyp}{\synthslantbox{.1}{\doublealphabethyp}} \\ + % + ABC & .2 & + \thewidthof{\synthslantbox{.2}{\doublealphabet}} & + \thewidthdiffof{\abcplain}{\synthslantbox{.2}{\doublealphabet}} \\ + ABC hyp & .2 & + \thewidthof{\synthslantbox{.2}{\doublealphabethyp}} & + \thewidthdiffof{\abchyp}{\synthslantbox{.2}{\doublealphabethyp}} \\ + % + ABC & .3 & + \thewidthof{\synthslantbox{.3}{\doublealphabet}} & + \thewidthdiffof{\abcplain}{\synthslantbox{.3}{\doublealphabet}} \\ + ABC hyp & .3 & + \thewidthof{\synthslantbox{.3}{\doublealphabethyp}} & + \thewidthdiffof{\abchyp}{\synthslantbox{.3}{\doublealphabethyp}} \\ + \bottomrule + \end{tabular} + \qquad + \newlength{\abcplainitalics}\settowidth{\abcplainitalics}{\itshape\doublealphabet} + \newlength{\abchypitalics}\settowidth{\abchypitalics}{\itshape\doublealphabethyp} + \begin{tabular}[t]{@{}lrll@{}} + \toprule + \cs{itshape} & Slant & Width & Delta \\ + {} & & pt & pt \\ + \midrule + ABC & --- & \thewidthof{\itshape\doublealphabet} & --- \\ + ABC hyp & --- & \thewidthof{\itshape\doublealphabethyp} & --- \\ + % + ABC & 0 & + \thewidthof{\synthslantbox{0}{\itshape\doublealphabet}} & + \thewidthdiffof{\abcplainitalics}{\synthslantbox{0}{\itshape\doublealphabet}} \\ + ABC hyp & 0 & + \thewidthof{\synthslantbox{0}{\itshape\doublealphabethyp}} & + \thewidthdiffof{\abchypitalics}{\synthslantbox{0}{\itshape\doublealphabethyp}} \\ + % + ABC & -.1 & + \thewidthof{\synthslantbox{-.1}{\itshape\doublealphabet}} & + \thewidthdiffof{\abcplainitalics}{\synthslantbox{-.1}{\itshape\doublealphabet}} \\ + ABC hyp & -.1 & + \thewidthof{\synthslantbox{-.1}{\itshape\doublealphabethyp}} & + \thewidthdiffof{\abchypitalics}{\synthslantbox{-.1}{\itshape\doublealphabethyp}} \\ + % + ABC & -.2 & + \thewidthof{\synthslantbox{-.2}{\itshape\doublealphabet}} & + \thewidthdiffof{\abcplainitalics}{\synthslantbox{-.2}{\itshape\doublealphabet}} \\ + ABC hyp & -.2 & + \thewidthof{\synthslantbox{-.2}{\itshape\doublealphabethyp}} & + \thewidthdiffof{\abchypitalics}{\synthslantbox{-.2}{\itshape\doublealphabethyp}} \\ + % + ABC & -.3 & + \thewidthof{\synthslantbox{-.3}{\itshape\doublealphabet}} & + \thewidthdiffof{\abcplainitalics}{\synthslantbox{-.3}{\itshape\doublealphabet}} \\ + ABC hyp & -.3 & + \thewidthof{\synthslantbox{-.3}{\itshape\doublealphabethyp}} & + \thewidthdiffof{\abchypitalics}{\synthslantbox{-.3}{\itshape\doublealphabethyp}} \\ + \bottomrule + \end{tabular} +\end{center} + + +\subsection{Line-Breaking} + +Left: plain text, \\ +right: \code{\cs{textsynthslant}\{Show line-break\cs{-}ing in a sen\cs{-}tence.\}} + +\begin{center} + \setlength{\overfullrule}{0pt} + \begin{minipage}[t]{0pt}Show line-breaking with a sentence.\end{minipage}% + \hspace*{100pt}% + \begin{minipage}[t]{0pt}\textsynthslant{Show line-break\-ing in a sen\-tence.}\end{minipage} +\end{center} + + +\subsection{Microtype Enhancements} + +\ifdefined\SetTracking + Package \packagename{microtype} loaded. + + Test different trackings in the \code{synthnegslant}~context. + + \begin{center} + \setlength{\overfullrule}{0pt} + \newcommand*{\thinvrule}{\rule{.4pt}{.7em}} + \newcommand{\settracking}[2] + {\SetTracking[context=synthnegslant, + no ligatures={f}, + outer kerning={0,0}, + spacing={#2*,,}] + {encoding=*, shape=it} + {#1}} + \newcommand*{\smallextratracking}{20} + \newcommand*{\smallextraspacing}{150} + \newcommand*{\bigextratracking}{250} + \newcommand*{\bigextraspacing}{300} + \begin{tabular}{@{}rrll@{}} + \toprule + Tracking & + Spacing & + \raisebox{-.5\normalbaselineskip}[0pt][0pt]{Sample} & + \raisebox{-.5\normalbaselineskip}[0pt][0pt]{Example sentence} \\ + {\small\generictextfraction{1}{1000}}\:em & {\small\generictextfraction{dim}{1000}} & & \\ + \midrule + 0 & 0 & + \settracking{0}{0}\thinvrule\textsynthuprightitalic{\fontsample}\thinvrule & + \settracking{0}{0}\thinvrule\textsynthuprightitalic{\longfontsample}\thinvrule \\ + \smallextratracking & \smallextraspacing & + \settracking{\smallextratracking}{\smallextraspacing}% + \thinvrule\textsynthuprightitalic{\fontsample}\thinvrule & + \settracking{\smallextratracking}{\smallextraspacing}% + \thinvrule\textsynthuprightitalic{\longfontsample}\thinvrule \\ + \bigextratracking & \bigextraspacing & + \settracking{\bigextratracking}{\bigextraspacing}% + \thinvrule\textsynthuprightitalic{\fontsample}\thinvrule & + \settracking{\bigextratracking}{\bigextraspacing}% + \thinvrule\textsynthuprightitalic{\longfontsample}\thinvrule \\ + \bottomrule + \end{tabular} + \settracking{0}{0}% reset extra tracking + \end{center} + + \noindent All samples are tightly bracketed by thin horizontal rules + to reveal possible outer spacing problems. +\else + Package \packagename{microtype} not loaded. + No Microtype effects to show. +\fi +\end{document} +%</gauge> +% \fi +% +% +% +\endinput +% +% +% +%%% Local Variables: +%%% compile-command: "latex synthslant.dtx" +%%% fill-column: 96 +%%% End: diff --git a/macros/latex/contrib/synthslant/synthslant.ins b/macros/latex/contrib/synthslant/synthslant.ins new file mode 100644 index 0000000000..845b4378b1 --- /dev/null +++ b/macros/latex/contrib/synthslant/synthslant.ins @@ -0,0 +1,67 @@ +%% Copyright (C) 2024 by Ch. L. Spiel +%% +%% This work may be distributed and/or modified under the conditions +%% of the LaTeX Project Public License, either version 1.3 of this +%% license or (at your option) any later version. The latest version +%% of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2003/12/01 or later. + + +\input docstrip + + +\keepsilent +\askforoverwritefalse + + +\preamble + +This is a generated file. + +Copyright (C) 2024 by Ch. L. Spiel + +This work may be distributed and/or modified under the conditions +of the LaTeX Project Public License, either version 1.3 of this +license or (at your option) any later version. The latest version +of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2003/12/01 or later. + +This work has the LPPL maintenance status `maintained'. + +The Current Maintainer of this work is Ch. L. Spiel. + +This work consists of the files synthslant.dtx and synthslant.ins +and the derived files synthslant.sty, synthslant-gauge.tex, +shear-transform.mp, and title.mp. + + +\endpreamble + + +\edef\source{\jobname.dtx} + +\generate{\file{synthslant.sty}{\from{\source}{package}} + \file{synthslant-gauge.tex}{\from{\source}{gauge}} + \file{synthslant.ist}{\from{\source}{index-style}}} + + +\nopostamble +\generate{\file{title.mp}{\from{\source}{title}}} +\generate{\file{shear-transform.mp}{\from{\source}{shear-transform}}} + + +\nopreamble +\generate{\file{compare-with-the-gimp.png.base64}{\from{\source}{compare-with-the-gimp}}} + + +\endbatchfile + + +%% Local Variables: +%% compile-command: "latex synthslant.ins" +%% mode: latex +%% End: diff --git a/macros/latex/contrib/tuda-ci/README.md b/macros/latex/contrib/tuda-ci/README.md index f3f8de560e..f7aa6519a1 100644 --- a/macros/latex/contrib/tuda-ci/README.md +++ b/macros/latex/contrib/tuda-ci/README.md @@ -2,7 +2,7 @@ Copyright (C) Marei Peischl <marei@peitex.de>, 2018–2024 - tuda-ci v3.37 (2024-04-21) + tuda-ci v3.38 (2024-05-07) *************************************************************************** @@ -358,3 +358,5 @@ leaflets | DEMO-TUDaLeaflet.tex | tudaleaflet.cls * 3.37 (2024-04-21) - refactoring the bundle - small layout adjustments and bugfixes + * 3.38 (2024-05-07) + - update PhD affidavit diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf Binary files differindex e59b22b57e..08f3ff90a1 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf Binary files differindex 0ab6952c8f..90c6f7e9c4 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf Binary files differindex dbde310191..9c765b69b3 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf Binary files differindex 21defaf2a0..4de18237bc 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf Binary files differindex 25f1ce243c..4c91fe977d 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf Binary files differindex ce33e4ba24..d3ff6b21bf 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf Binary files differindex 1ddf6f90b6..3928a61062 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf Binary files differindex 0986455f21..1f4d8165c2 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf Binary files differindex 02f0788605..089c10109f 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf Binary files differindex 7ed32cae75..b7cb7640ff 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf Binary files differindex fc351f0054..99ec17f31a 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf Binary files differindex 4633b07055..51f92e0df3 100644 --- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf +++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex index 2a2ae6c882..f8f2e3a80e 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaAnnouncement-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaAnnouncement-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex index f653c25bbb..a11d19f03e 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaBeamer-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaBeamer-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex index b3bf05ce30..f94c402bfe 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaBeamer2023.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaBeamer2023.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib index b516931fb1..d293b6a339 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaBibliography.bib' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaBibliography.bib' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex index f019e9011e..c5aa84e832 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaExercise-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaExercise-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco index 3046285e53..1d218f7a2d 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaFromaddress.lco' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaFromaddress.lco' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex index 6f0fc6c977..5d0b8aeb96 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaLeaflet-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaLeaflet-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex index 6a6ad17e66..bedce9c23f 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaLetter-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaLetter-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex index a2c4a6c39c..d1742bebfd 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaPhD-de.tex' version 3.37 (2024-04-21) +%% This is file `DEMO-TUDaPhD-de.tex' version 3.38 (2024-05-07) %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex index 94fcfeae3d..e10f84dd8b 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaPoster-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaPoster-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex index 3c8bb81129..0bf058e1c3 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaPub-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaPub-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex index ee13759914..a3b0e56310 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaReport-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaReport-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex index 7a74831e5d..bd8082039a 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaSciPoster-de.tex' version 3.37 (2024-04-21), +%% This is file `DEMO-TUDaSciPoster-de.tex' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex index 6d8cdf6110..a646b8fd8a 100644 --- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex +++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex @@ -1,4 +1,4 @@ -%% This is file `DEMO-TUDaThesis-de.tex' version 3.37 (2024-04-21) +%% This is file `DEMO-TUDaThesis-de.tex' version 3.38 (2024-05-07) %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty index 0715afa9d3..67c92a5939 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty @@ -1,4 +1,4 @@ -%% This is file `beamercolorthemeTUDa.sty' version 3.37 (2024-04-21), +%% This is file `beamercolorthemeTUDa.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty index c9b9747fb6..46c7da19c9 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty @@ -1,4 +1,4 @@ -%% This is file `beamercolorthemeTUDa2008.sty' version 3.37 (2024-04-21) +%% This is file `beamercolorthemeTUDa2008.sty' version 3.38 (2024-05-07) %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty index 9b3dd3a619..a245163dc1 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty @@ -1,4 +1,4 @@ -%% This is file `beamerfontthemeTUDa.sty' version 3.37 (2024-04-21) +%% This is file `beamerfontthemeTUDa.sty' version 3.38 (2024-05-07) %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty index 7edc07a3c1..737f759508 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty @@ -1,4 +1,4 @@ -%% This is file `beamerfontthemeTUDa2008.sty' version 3.37 (2024-04-21) +%% This is file `beamerfontthemeTUDa2008.sty' version 3.38 (2024-05-07) %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty index 7789e86e6e..6a9072ed6e 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty @@ -1,4 +1,4 @@ -%% This is file `beamerinnerthemeTUDa.sty' version 3.37 (2024-04-21) +%% This is file `beamerinnerthemeTUDa.sty' version 3.38 (2024-05-07) %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty index b8b9d7d4f2..cab08e361c 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty @@ -1,4 +1,4 @@ -%% This is file `beamerinnerthemeTUDa2008.sty' version 3.37 (2024-04-21), +%% This is file `beamerinnerthemeTUDa2008.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty index ebef3683a6..22d50340c2 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty @@ -1,4 +1,4 @@ -%% This is file `beamerinnerthemeTUDa2023.sty' version 3.37 (2024-04-21), +%% This is file `beamerinnerthemeTUDa2023.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty index 71431e1182..6081832c16 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty @@ -1,4 +1,4 @@ -%% This is file `beamerouterthemeTUDa.sty' version 3.37 (2024-04-21), +%% This is file `beamerouterthemeTUDa.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty index 177a9557d3..70e31eecde 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty @@ -1,4 +1,4 @@ -%% This is file `beamerouterthemeTUDa2008.sty' version 3.37 (2024-04-21), +%% This is file `beamerouterthemeTUDa2008.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty index a7ebab5e2b..04fac2c523 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty @@ -1,4 +1,4 @@ -%% This is file `beamerthemeTUDa-mecheng.sty' version 3.37 (2024-04-21), +%% This is file `beamerthemeTUDa-mecheng.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesExplPackage{beamerthemeTUDa-mecheng}{\filedate}{\fileversion}{specific tudabeamer configuration for the department of mechanical engineering} diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty index 88d58b1fa8..7287a8625e 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty @@ -1,4 +1,4 @@ -%% This is file `beamerthemeTUDa.sty' version 3.37 (2024-04-21), +%% This is file `beamerthemeTUDa.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty index a2c54a4730..684fc16de5 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty @@ -1,4 +1,4 @@ -%% This is file `beamerthemeTUDa2008.sty' version 3.37 (2024-04-21), +%% This is file `beamerthemeTUDa2008.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e}[2022/06/01] \ProvidesPackage{beamerthemeTUDa2008} [\filedate\space\fileversion\space beamer theme using the Corporate Design of TU Darmstadt Design of 2008] diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty index 417ee0c97c..48e7d697b9 100644 --- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty +++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty @@ -1,4 +1,4 @@ -%% This is file `beamerthemeTUDa2023.sty' version 3.37 (2024-04-21) +%% This is file `beamerthemeTUDa2023.sty' version 3.38 (2024-05-07) %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo index 1ea5a3e716..1978288520 100644 --- a/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo +++ b/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo @@ -1,4 +1,4 @@ -%% This is file `tuda-a0paper.clo' version 3.37 (2024-04-21), +%% This is file `tuda-a0paper.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesExplFile{tuda-a0paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a0paper} \cs_set:Nn \ptxcd_setup_title_sizes: { \cs_set:Nn \ptxcd_title_fontsize: {{125pt}{165pt}} diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo index 5336c146b1..bc63208933 100644 --- a/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo +++ b/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo @@ -1,4 +1,4 @@ -%% This is file `tuda-a1paper.clo' version 3.37 (2024-04-21), +%% This is file `tuda-a1paper.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesExplFile{tuda-a1paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a1paper} \cs_set:Nn \ptxcd_setup_title_sizes: { \cs_set:Nn \ptxcd_title_fontsize: {{86pt}{120pt}} diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo index 120ef18fa4..cda6b6762b 100644 --- a/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo +++ b/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo @@ -1,4 +1,4 @@ -%% This is file `tuda-a2paper.clo' version 3.37 (2024-04-21), +%% This is file `tuda-a2paper.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesExplFile{tuda-a2paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a0paper} \cs_set:Nn \ptxcd_setup_title_sizes: { \cs_set:Nn \ptxcd_title_fontsize: {{65pt}{82pt}} diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo index 9525af7b5f..3633a54584 100644 --- a/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo +++ b/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo @@ -1,4 +1,4 @@ -%% This is file `tuda-a3paper.clo' version 3.37 (2024-04-21), +%% This is file `tuda-a3paper.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesExplFile{tuda-a3paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a3paper} \cs_set:Nn \ptxcd_setup_title_sizes: { \cs_set:Nn \ptxcd_title_fontsize: {{47pt}{61pt}} diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo index 66c909d52f..3618253919 100644 --- a/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo +++ b/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo @@ -1,4 +1,4 @@ -%% This is file `tuda-a4paper.clo' version 3.37 (2024-04-21), +%% This is file `tuda-a4paper.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesExplFile{tuda-a4paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a4paper} \cs_set:Nn \ptxcd_setup_title_sizes: { \cs_set:Nn \ptxcd_title_fontsize: {{36pt}{47pt}} diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo index 0587a4ca11..fda679c183 100644 --- a/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo +++ b/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo @@ -1,4 +1,4 @@ -%% This is file `tuda-a5paper.clo' version 3.37 (2024-04-21), +%% This is file `tuda-a5paper.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesExplFile{tuda-a5paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a5paper} \cs_set:Nn \ptxcd_setup_title_sizes: { \cs_set:Nn \ptxcd_title_fontsize: {{22pt}{28pt}} diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty b/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty index 42f186ce35..04e7c5712d 100644 --- a/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty +++ b/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty @@ -1,4 +1,4 @@ -%% This is file `tuda-pgfplots.sty' version 3.37 (2024-04-21), +%% This is file `tuda-pgfplots.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} % Special thanks to: Sebastian Schöps Institut Theorie Elektromagnetischer Felder (TEMF), TU Darmstadt % The original version of this file has been inspired by the colorscheme in the Metropolis beamer theme by Matthias Vogelgesang https://github.com/matze/mtheme \ProvidesPackage{tuda-pgfplots}[\filedate\space\fileversion\space tuda-ci pgfplots color schemes] diff --git a/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls b/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls index d4d5bddd29..fdf0d8e02f 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls +++ b/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls @@ -1,4 +1,4 @@ -%% This is file `tudabeamer.cls' version 3.37 (2024-04-21), +%% This is file `tudabeamer.cls' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{tudabeamer} [\filedate\space\fileversion\space] diff --git a/macros/latex/contrib/tuda-ci/tex/tudacolors.def b/macros/latex/contrib/tuda-ci/tex/tudacolors.def index 4311888a04..6a8afea418 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudacolors.def +++ b/macros/latex/contrib/tuda-ci/tex/tudacolors.def @@ -1,4 +1,4 @@ -%% This is file `tudacolors.def' version 3.37 (2024-04-21), +%% This is file `tudacolors.def' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \ProvidesFile{tudacolors.def} [\filedate\space\fileversion\space Color definitions for tuda-ci] diff --git a/macros/latex/contrib/tuda-ci/tex/tudacolors.sty b/macros/latex/contrib/tuda-ci/tex/tudacolors.sty index 3f93095409..137697f261 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudacolors.sty +++ b/macros/latex/contrib/tuda-ci/tex/tudacolors.sty @@ -1,4 +1,4 @@ -%% This is file `tudacolors.sty' version 3.37 (2024-04-21), +%% This is file `tudacolors.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage{tudacolors}{\filedate}{\fileversion}{Color definition for TU Darmstadt's tuda-ci bundle} diff --git a/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls b/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls index 4e2a0a435d..07afd270c2 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls +++ b/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls @@ -1,4 +1,4 @@ -%% This is file `tudaexercise.cls' version 3.37 (2024-04-21), +%% This is file `tudaexercise.cls' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplClass{tudaexercise} diff --git a/macros/latex/contrib/tuda-ci/tex/tudafonts.sty b/macros/latex/contrib/tuda-ci/tex/tudafonts.sty index 9eb9e3e4b2..6a7873942a 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudafonts.sty +++ b/macros/latex/contrib/tuda-ci/tex/tudafonts.sty @@ -1,4 +1,4 @@ -%% This is file `tudafonts.sty' version 3.37 (2024-04-21), +%% This is file `tudafonts.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tudafonts} [\filedate\space\fileversion\space diff --git a/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls b/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls index b4336cfef9..de3430b507 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls +++ b/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls @@ -1,4 +1,4 @@ -%% This is file `tudaleaflet.cls' version 3.37 (2024-04-21), +%% This is file `tudaleaflet.cls' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage{tudaleaflet}{\filedate}{\fileversion}{Leaflets using the Corporate Design of TU Darmstadt} diff --git a/macros/latex/contrib/tuda-ci/tex/tudaletter.cls b/macros/latex/contrib/tuda-ci/tex/tudaletter.cls index e035975c05..15baed6069 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudaletter.cls +++ b/macros/latex/contrib/tuda-ci/tex/tudaletter.cls @@ -1,4 +1,4 @@ -%% This is file `tudaletter.cls' version 3.37 (2024-04-21), +%% This is file `tudaletter.cls' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplClass{tudaletter} diff --git a/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo b/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo index a9175b8038..54348ee206 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo +++ b/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo @@ -1,4 +1,4 @@ -%% This is file `tudalettersize10pt.clo' version 3.37 (2024-04-21), +%% This is file `tudalettersize10pt.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg b/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg index aacecd020e..83f385b172 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg +++ b/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg @@ -1,4 +1,4 @@ -%% This is file `tudamecheng.cfg' version 3.37 (2024-04-21), +%% This is file `tudamecheng.cfg' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \RequirePackage{expl3} \ProvidesExplFile{tudamecheng.cfg} {\filedate}{\fileversion}{Special Features the department of mechanical engineering of Darmstadt's Corporate Design (tuda-ci)} diff --git a/macros/latex/contrib/tuda-ci/tex/tudaposter.cls b/macros/latex/contrib/tuda-ci/tex/tudaposter.cls index aa4fc6fd9d..99b2d2d07d 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudaposter.cls +++ b/macros/latex/contrib/tuda-ci/tex/tudaposter.cls @@ -1,4 +1,4 @@ -%% This is file `tudaposter.cls' version 3.37 (2024-04-21), +%% This is file `tudaposter.cls' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage{tudaposter}{\filedate}{\fileversion}{Poster Layouts for the Corporate Design of TU Darmstadt} diff --git a/macros/latex/contrib/tuda-ci/tex/tudapub.cls b/macros/latex/contrib/tuda-ci/tex/tudapub.cls index 3b4a762673..a863197f83 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudapub.cls +++ b/macros/latex/contrib/tuda-ci/tex/tudapub.cls @@ -1,4 +1,4 @@ -%% This is file `tudapub.cls' version 3.37 (2024-04-21), +%% This is file `tudapub.cls' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplClass{tudapub} diff --git a/macros/latex/contrib/tuda-ci/tex/tudarules.sty b/macros/latex/contrib/tuda-ci/tex/tudarules.sty index fcf7e9f6ac..76dae0e2e7 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudarules.sty +++ b/macros/latex/contrib/tuda-ci/tex/tudarules.sty @@ -1,4 +1,4 @@ -%% This is file `tudarules.sty' version 3.37 (2024-04-21), +%% This is file `tudarules.sty' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage{tudarules}{\filedate}{\fileversion}{Creation of colored bars for tuda-ci bundle} diff --git a/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls b/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls index 856d0dab2d..e3bda42e20 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls +++ b/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls @@ -1,4 +1,4 @@ -%% This is file `tudasciposter.cls' version 3.37 (2024-04-21), +%% This is file `tudasciposter.cls' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage{tudasciposter}{\filedate}{\fileversion}{Scientific Poster Layout for TU Darmstadt} diff --git a/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo b/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo index e92dc5ece8..8537d16f7c 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo +++ b/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo @@ -1,4 +1,4 @@ -%% This is file `tudasize9pt.clo' version 3.37 (2024-04-21), +%% This is file `tudasize9pt.clo' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- diff --git a/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg b/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg index ffd6ea3ac4..e25ded1a68 100644 --- a/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg +++ b/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg @@ -1,4 +1,4 @@ -%% This is file `tudathesis.cfg' version 3.37 (2024-04-21), +%% This is file `tudathesis.cfg' version 3.38 (2024-05-07), %% it is part of %% TUDa-CI -- Corporate Design for TU Darmstadt %% ---------------------------------------------------------------------------- @@ -25,8 +25,8 @@ %% %% ============================================================================ %% -\def\fileversion{3.37} -\def\filedate{2024-04-21} +\def\fileversion{3.38} +\def\filedate{2024-05-07} \RequirePackage{expl3} \ProvidesExplFile{tudathesis.cfg} {\filedate}{\fileversion}{Special Features for publication type 'thesis' using TU Darmstadt's Corporate Design (tuda-ci)} @@ -667,7 +667,7 @@ Ich versichere hiermit, dass zu einem vorherigen Zeitpunkt noch keine Promotion versucht wurde. In diesem Fall sind nähere Angaben über Zeitpunkt, Hochschule, Dissertationsthema und Ergebnis dieses Versuchs mitzuteilen. \subsection*{\S\,9 Abs. 1 PromO} - Ich versichere hiermit, dass die vorliegende Dissertation selbstständig und nur unter Verwendung der angegebenen Quellen verfasst wurde. + Ich versichere hiermit, dass die vorliegende Dissertation – abgesehen von den in ihr ausdrücklich genannten Hilfen – selbstständig verfasst wurde und dass die „Grundsätze zur Sicherung guter wissenschaftlicher Praxis an der Technischen Universität Darmstadt“ und die „Leitlinien zum Umgang mit digitalen Forschungsdaten an der TU Darmstadt“ in den jeweils aktuellen Versionen bei der Verfassung der Dissertation beachtet wurden. \subsection*{\S\,9 Abs. 2 PromO} Die Arbeit hat bisher noch nicht zu Prüfungszwecken gedient. diff --git a/macros/latex/contrib/typog/Makefile b/macros/latex/contrib/typog/Makefile new file mode 100644 index 0000000000..bb3c83ab24 --- /dev/null +++ b/macros/latex/contrib/typog/Makefile @@ -0,0 +1,302 @@ +### name: Makefile +### synopsis: Build `typog' style file, tools, and documentation +### author: Dr. Christoph L. Spiel +### GNU make version: 4.3 + + +SHELL := /bin/sh + + +LATEX := /usr/bin/env max_print_line=2147483647 pdflatex +LATEX_FLAGS := -file-line-error -halt-on-error -interaction=nonstopmode +LATEX_RERUN_TRIGGER := '^Package rerunfilecheck Warning: File [^ ]* has changed' +LATEX_WARNING := '^LaTeX (|[A-Za-z0-9_]* )Warning:' + +MAKEINDEX := makeindex +MAKEINDEX_FLAGS := -q + + +METAPOST := mpost +METAPOST_FLAGS := -file-line-error -interaction=nonstopmode -tex=latex + + +PODCHECKER := podchecker +PODCHECKER_FLAGS := -warnings + + +POD2MAN := pod2man +POD2MAN_FLAGS := $$(sed -ne 's,\\ProvidesPackage{typog}\[\([0-9][0-9]*/[0-9][0-9]*/[0-9][0-9]*\) *v\([^ ]*\) .*$$,--date=\1 --release=\2,p' < typog.sty) + + +POD2TEXI := pod2texi +POD2TEXI_FLAGS := + + +GROFF := groff +## Codes of serif fonts that work for PDF output +## BM: URW Bookman L +## N: URW Century Schoolbook L +## P: URW Palladio L +## T: URW Nimbus Roman No9 L +GROFF_FLAGS := -Tpdf -dpaper=a4 -fP -man -wall + + +SPELLCHECK := aspell +SPELLCHECK_FLAGS := \ + --add-tex-command='citenum p' --add-tex-command='code p' \ + --add-tex-command='Cref p' --add-tex-command='cref p' \ + --add-tex-command='cs p' \ + --add-tex-command='DescribeEnv p' --add-tex-command='DescribeMacro p' \ + --add-tex-command='marg p' --add-tex-command='meta p' \ + --add-tex-command='oarg p' \ + --lang=en_US --mode=tex + + +SOURCE_FILES := LICENSE Makefile typog.dtx typog.ins + + + +.PHONY: all +all: sty pdf man + + +.PHONY: sty +sty: typog.sty + + +.PHONY: pdf +pdf: doc ex nomt + + +.PHONY: doc +doc: typog.pdf + + +.PHONY: ex +ex: typog-example.pdf + + +.PHONY: nomt +nomt: typog-nomt.pdf + + +.PHONY: man +man: typog-grep.1 + + +.PHONY: cpio +cpio: + cd ..; \ + echo $(addprefix typog/,$(SOURCE_FILES)) | \ + cpio -o | \ + gzip > "typog-$$(date +%Y-%m-%d).cpio.gz" + + +.PHONY: tar +tar: + cd ..; \ + tar czf "typog-$$(date +%Y-%m-%d).tar.gz" $(addprefix typog/,$(SOURCE_FILES)) + + +.PHONY: clean +clean: + $(RM) ./*.1 ./*.aux ./*.brf ./*.glg ./*.glo ./*.gls + $(RM) ./*.hd ./*.idx ./*.ilg ./*.ind ./*.loe ./*.lof ./*.log ./*.lot + $(RM) ./*.mps ./*.mpx ./*.out ./*.pdf ./*.toc + $(RM) mptextmp.* mpxerr.tex + $(RM) README README.html RELEASE-HOWTO RELEASE-HOWTO.html + + +.PHONY: mostlyclean +mostlyclean: clean + + +.PHONY: maintainer-clean +maintainer-clean: mostlyclean + $(RM) ./*.ist ./*.mp ./*.pl ./*.pod ./*.sed ./*.sty ./*.tex + + +.PHONY: tool-check +tool-check: + @printf '*** LATEX = "%s"\n' '$(LATEX)' + $(LATEX) --version + @printf '\n\n*** MAKEINDEX = "%s"\n' '$(MAKEINDEX)' + $(MAKEINDEX) < /dev/null + @printf '\n\n*** METAPOST = "%s"\n' '$(METAPOST)' + $(METAPOST) --version + @printf '\n*** POD2MAN = "%s"\n' '$(POD2MAN)' + $(POD2MAN) --help > /dev/null + @printf '\n\n*** POD2TEXI = "%s"\n' '$(POD2TEXI)' + $(POD2TEXI) --version + @printf '\n\nTool check passed.\n' + + +.PHONY: spell-check +spell-check: + @sed -e '\#<DISABLE-SPELL-CHECK/>#d' \ + -e '\#<DISABLE-SPELL-CHECK>#,\#</DISABLE-SPELL-CHECK>#d' < typog.dtx | \ + sed -e 's/^ *%%*//' | \ + sed -e 's/\\-//g' -e 's/|[^|]*|/ /g' | \ + $(SPELLCHECK) $(SPELLCHECK_FLAGS) list | \ + sort | uniq | fmt | sed -e 's/ / /g' + + +.PHONY: update-docs +update-docs: doc ex typog-grep.1.pdf + cp -f typog.pdf typog-example.pdf typog-grep.1 typog-grep.1.pdf docs + + +define HELP_SCREEN +Selected Phony Targets +---------------------- +all: Make everything there is to make. This is the .DEFAULT_GOAL. + +clean: Remove some products. + +cpio: In the parent directory create a cpio(1) archive of the + project source files whose name is time-stamped. + +doc: Build "typog.pdf" the Typog documentation. + +ex: Build "typog-example.pdf" an example and test file for Typog. + +maintainer-clean: Remove every product file that can be rebuilt even + if uncommon tools are necessary. + +mostlyclean: Remove some more products than clean:. + +pdf: Build doc: and gauge:. + +sty: Only extract "typog.sty" from "typog.dtx". This + operation requires LaTeX (-> $(LATEX)) and nothing else. + +tar: In the parent directory create a tar(1) file of the project + source files whose name is time-stamped. + +tool-check: Check whether some of the required tools to build the + project are available. + + +Selected Implicit Rules +----------------------- +%.pdf: %.dtx + Run LaTeX or pdfLaTeX (-> $(LATEX)) on dtx source until a + fix-point is reached. + +%.pdf: %.tex + Run LaTeX or pdfLaTeX (-> $(LATEX)) on tex file until a + fix-point is reached. + +%.1: %.pod + Create a manual page from plain old documentation format. + Requires podchecker (-> $(PODCHECKER)) and pod2man + (-> $(POD2MAN)). + +%.1.pdf: %.1 + Convert a manual page into a pdf file. Requires groff + (-> $(GROFF)). + + +Some Explicit Rules +------------------- +README.html: + Convert "README.md" to html. Requires markdown(1). + +README: Convert "README.html" to plain text. Requires w3m(1). + +endef + +.PHONY: help +help: + $(info $(HELP_SCREEN)) + + + +.PRECIOUS: %.mps + + + +define MAKE_INDEX_AND_GLOSSARY +sed -e '/@/d' -e 's/{\\ttfamily /{\\ttfamily\\hskip0pt\\relax /' < $*.idx > ,$*.idx; \ +mv ,$*.idx $*.idx; \ +$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s typog.ist -t $*.ilg -o $*.ind $*.idx; \ +$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s gglo.ist -t $*.glg -o $*.gls $*.glo +endef + +define GREP_LATEX_WARNINGS +test -e $*.log && grep -E $(LATEX_WARNING) $*.log | uniq +endef + +%.pdf: %.dtx + $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.gls ./$*.glo ./$*.lot ./$*.toc + $(LATEX) $(LATEX_FLAGS) -draftmode $< + $(MAKE_INDEX_AND_GLOSSARY) + $(LATEX) $(LATEX_FLAGS) $< + $(MAKE_INDEX_AND_GLOSSARY) + while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \ + do \ + $(LATEX) $(LATEX_FLAGS) $<; \ + $(MAKE_INDEX_AND_GLOSSARY); \ + done + $(GREP_LATEX_WARNINGS) + + +%.pdf: %.tex + $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.lot ./$*.toc + $(LATEX) $(LATEX_FLAGS) -draftmode $< + $(LATEX) $(LATEX_FLAGS) $< + while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \ + do \ + $(LATEX) $(LATEX_FLAGS) $<; \ + done + $(GREP_LATEX_WARNINGS) + + +%-1.mps %-2.mps %-3.mps %-4.mps: %.mp + $(METAPOST) -s 'outputtemplate="%j-%c.mps"' $(METAPOST_FLAGS) $< + + +%.1: %.pod + $(PODCHECKER) $(PODCHECKER_FLAGS) $< + $(POD2MAN) $(POD2MAN_FLAGS) $< $@ + +%.1.pdf: %.1 + $(GROFF) $(GROFF_FLAGS) ./$< > $@ + +%.tex: %.pod | teximan2latex.sed + $(POD2TEXI) $(POD2TEXI_FLAGS) ./$< | sed -f teximan2latex.sed > $@ + + +%.html: %.md + markdown $< > $@ + +%: %.html + w3m -cols 79 $< > $@ + + +crooked-paragraphs.mp slant-angle.mp smooth-parshapes.mp title.mp \ +teximan2latex.sed \ +typog-grep.pl typog-grep typog-grep.pod \ +typog.sty typog.ist typog-example.tex typog-nomt.tex: \ + typog.ins typog.dtx + $(LATEX) $(LATEX_FLAGS) $< + chmod 755 typog-grep.pl + ln -sf typog-grep.pl typog-grep + + +crooked-paragraphs-1.mps crooked-paragraphs-2.mps \ +crooked-paragraphs-3.mps crooked-paragraphs-4.mps: crooked-paragraphs.mp + +smooth-parshapes-1.mps smooth-parshapes-2.mps smooth-parshapes-3.mps: smooth-parshapes.mp + +slant-angle-1.mps: slant-angle.mp + +title-1.mps: title.mp + +typog.pdf: typog.dtx \ + crooked-paragraphs-1.mps crooked-paragraphs-2.mps \ + crooked-paragraphs-3.mps crooked-paragraphs-4.mps \ + slant-angle-1.mps title-1.mps \ + smooth-parshapes-1.mps smooth-parshapes-2.mps smooth-parshapes-3.mps \ + typog-grep.tex \ + | typog.sty diff --git a/macros/latex/contrib/typog/README.md b/macros/latex/contrib/typog/README.md new file mode 100644 index 0000000000..fb55ccb1e1 --- /dev/null +++ b/macros/latex/contrib/typog/README.md @@ -0,0 +1,79 @@ +# TypoG – Typographic Fine-Tuning for LaTeX + +LaTeX package `typog` provides macros for (micro-)typographic enhancements; +it covers a variety of topics: + +* Precise hyphenation control +* Disable/break ligatures +* Manual italic correction +* Extra kerning for slash and hyphen +* Raising selected characters (e.g. hyphen, en-dash, and em-dash) +* Aligning of the last line of a paragraph +* Filling of the last line last line of a paragraph +* Word spacing control +* [Microtype](https://github.com/schlcht/microtype) front-end +* Slightly sloppy paragraphs +* Vertically partially-tied paragraphs +* Breakable displayed equations +* Setspace front-end +* Smooth ragged-right paragraphs + +Moreover `typog` provides an environment to flag interesting parts of +the information deluge typically accumulating in a LaTeX *log*-file +and an associated tool, **typog-grep**, that selectively retrieves +these parts. + + +## Installation + +The minimally necessary files to install typog are *typog.ins* and *typog.dtx*. Running LaTeX +on *typog.ins* in particular produces *typog.sty*: + + latex typog.ins + +After extraction from *typog.dtx* place *typog.sty* in a directory mentioned in your TEXINPUTS +paths or copy it into one of the directories for your LaTeX installation's *sty*-files and run +**mktexlsr** or equivalent. + +To build the documentation it is easier to use the GNU *Makefile*: + + make + +To construct the manual *typog.pdf* or the usage example *typog-example.pdf* a working +[MetaPost](https://tug.org/metapost.html) installation and some +[POD](https://perldoc.perl.org/perlpod) utilities of a [Perl](https://www.perl.org/) +distribution are required. Cautious users can run + + make tool-check + +ahead to verify that the required utilities are installed and working. +For an overview over the most important *Makefile* targets use + + make help + + +## Usage + +Load the package with the usual incantation + + \usepackage{typog} + +See Section 2 of the package documentation for available options. + + +## Documentation + +The package documentation can be found +[online](https://cspiel.github.io/typog/). + + +## Credits + +Typog is written by Ch. L. Spiel <cspiel@users.sourceforge.org>. + + +## License + +Released under the +[LaTeX Project Public License v1.3c](https://www.latex-project.org/lppl.txt) +or later. diff --git a/macros/latex/contrib/typog/RELEASE-HOWTO.md b/macros/latex/contrib/typog/RELEASE-HOWTO.md new file mode 100644 index 0000000000..13435ef66d --- /dev/null +++ b/macros/latex/contrib/typog/RELEASE-HOWTO.md @@ -0,0 +1,51 @@ +# How to prepare a new release + +... and not make too many mistakes. + + +1. Check that the work-area is clean with respect to **git**-tracked + files. + + ``` git status ``` + +1. Update the date stamp of `\ProvidesPackage`. + +1. (Temporarily) Zero the `\overfullrule`s of the documentation and + the example files. + +1. Thoroughly clean the work-area: + + ```make maintainer-clean``` + +1. Rebuild: + + ```make``` + +1. Check that all _*.sty_ and _*.pdf_ files are in good shape. + +1. Push the documentation files created in the previous step down into + the *docs* directory: + + ```make update-docs``` + +1. Undo the `\overfullrule` change. + +1. Commit the changes: + + ``` + git add . + ``` + + and finally + + ``` + git commit + ``` + +1. Tag the commit with the version string of `\ProvidesPackage`: + + ```git tag v1.23``` + +1. Push the changes to the public repository: + + ```git push origin master --tags``` diff --git a/macros/latex/contrib/typog/docs/index.md b/macros/latex/contrib/typog/docs/index.md new file mode 100644 index 0000000000..f4dc2e8bd9 --- /dev/null +++ b/macros/latex/contrib/typog/docs/index.md @@ -0,0 +1,5 @@ +### Package Documentation + +- Comprehensive `typog` documentation: [typog.pdf](https://cspiel.github.io/typog/typog.pdf) +- `typog` examples and tests: [typog-example.pdf](https://cspiel.github.io/typog/typog-example.pdf) +- **typog-grep** manual page: [typog-grep.1](https://cspiel.github.io/typog/typog-grep.1) and as PDF: [typog-grep.1.pdf](https://cspiel.github.io/typog/typog-grep.1.pdf) diff --git a/macros/latex/contrib/typog/docs/typog-example.pdf b/macros/latex/contrib/typog/docs/typog-example.pdf Binary files differnew file mode 100644 index 0000000000..621ac319d2 --- /dev/null +++ b/macros/latex/contrib/typog/docs/typog-example.pdf diff --git a/macros/latex/contrib/typog/docs/typog-grep.1 b/macros/latex/contrib/typog/docs/typog-grep.1 new file mode 100644 index 0000000000..372c87bc5f --- /dev/null +++ b/macros/latex/contrib/typog/docs/typog-grep.1 @@ -0,0 +1,428 @@ +.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +.\" ======================================================================== +.\" +.IX Title "TYPOG-GREP 1" +.TH TYPOG-GREP 1 "2024-05-07" "perl v5.36.0" "User Contributed Perl Documentation" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.\" Turn off justification. +.na +.SH "NAME" +typog\-grep \- grep for typog\-inspect elements in LaTeX log files +.SH "SYNOPSIS" +.IX Header "SYNOPSIS" +.IP "\fBtypog-grep\fR \-a|\-\-all|\-\-any [\fI\s-1OPTION\s0\fR...] \fILOG-FILE\fR..." 4 +.IX Item "typog-grep -a|--all|--any [OPTION...] LOG-FILE..." +.PD 0 +.IP "\fBtypog-grep\fR [\fI\s-1OPTION\s0\fR...] \fI\s-1REGEXP\s0\fR \fILOG-FILE\fR..." 4 +.IX Item "typog-grep [OPTION...] REGEXP LOG-FILE..." +.PD +.PP +The first form shows all \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR elements in \fILOG-FILE\fR. +.PP +The second form shows the contents of \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR elements +whose \fI\s-1ID\s0\fRs match \fI\s-1REGEXP\s0\fR in \fILOG-FILE\fR. +.PP +If no \fILOG-FILE\fR is given read from \fIstdin\fR. +The filename\ \f(CW\*(C`\-\*(C'\fR is synonymous to \fIstdin\fR. +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +\&\fBtypog-grep\fR is a tailored post-processor for LaTeX log files +and the \f(CW\*(C`typoginspect\*(C'\fR environment as provided by package\ typog. +It shares more with the venerable +\&\fBsgrep\fR <https://www.cs.helsinki.fi/u/jjaakkol/sgrep.html> +than with \s-1POSIX\s0\ \fBgrep\fR <https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html>. +.PP +The LaTeX user brackets her text in +.PP +.Vb 3 +\& \ebegin{typoginspect}{ID} +\& Text and code to investigate +\& \eend{typoginspect} +.Ve +.PP +where \fI\s-1ID\s0\fR is used to identify one or more bracketed snippets. +\&\fI\s-1ID\s0\fR does not have to be unique. +The \fI\s-1REGEXP\s0\fR mechanism makes it easy to select groups of related \fI\s-1ID\s0\fRs +if they are named accordingly. +.PP +In \fILOG-FILE\fR the environment shows up, packed with tracing information, as +.PP +.Vb 3 +\& <typog\-inspect id="ID" job="JOB\-NAME" line="LINE\-NUMBER" page="PAGE\-NUMBER"> +\& Trace Data +\& </typog\-inspect> +.Ve +.PP +where all the capital-letter sequences are meta-variables +and in particular +\&\fIJOB-NAME\fR is the expansion of \f(CW\*(C`\ejobname\*(C'\fR, +\&\fILINE-NUMBER\fR is the LaTeX source file line number +of the beginning of the \f(CW\*(C`typoginspect\*(C'\fR environment, +and \fIPAGE-NUMBER\fR is the page where +the output of \f(CW\*(C`Text\ and\ code\ to\ investigate\*(C'\fR occurs. +.PP +\&\fBtypog-grep\fR reveals the contents of \fILOG-FILE\fR +between \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR +and \f(CW\*(C`</typog\-inspect>\*(C'\fR excluding the XML-tags. +Access the \fIJOB-NAME\fR, \fILINE-NUMBER\fR, and \fIPAGE-NUMBER\fR +with the commandline options +\&\fB\-\-job\-name\fR, \fB\-\-line\-number\fR, and \fB\-\-page\-number\fR, respectively. +Use \fB\-\-id\fR to show the name of the IDs that matched \fI\s-1REGEXP\s0\fR. +.PP +\&\f(CW\*(C`typoginspect\*(C'\fR environments can be nested. +\&\fBtypog-grep\fR respects the nesting, +i.e., if the \fI\s-1ID\s0\fR of the nested environment does not match \fI\s-1REGEXP\s0\fR +it will not be included in the program's output. +.SH "OPTIONS" +.IX Header "OPTIONS" +The list of options is sorted by the names of the long options. +.IP "\fB\-a\fR, \fB\-\-all\fR, \fB\-\-any\fR" 4 +.IX Item "-a, --all, --any" +ID-discovery mode: +Show all \f(CW\*(C`typog\-inspect\*(C'\fR elements independent of any matching patterns. +.IP "\fB\-\-color\fR, \fBcolour\fR \fI\s-1WHEN\s0\fR" 4 +.IX Item "--color, colour WHEN" +Colorize specific log contents for the matching ids. +The argument\ \fI\s-1WHEN\s0\fR determines when to apply color: +\&\f(CW\*(C`always\*(C'\fR, \f(CW\*(C`never\*(C'\fR, or\ \f(CW\*(C`auto\*(C'\fR. +The setting \f(CW\*(C`auto\*(C'\fR checks whether standard output has been redirected. +This is the default. +.IP "\fB\-C\fR, \fB\-\-config\fR \fI\s-1KEY\s0\fR=\fI\s-1VALUE\s0\fR[:\fI\s-1KEY\s0\fR=\fI\s-1VALUE\s0\fR[:...]]" 4 +.IX Item "-C, --config KEY=VALUE[:KEY=VALUE[:...]]" +Set one or more configuration \fI\s-1KEY\s0\fR to \fI\s-1VALUE\s0\fR pairs. +See Sec.\ \s-1CONFIGURATION\s0 below for a description of all available configuration items. +Use option \fB\-\-show\-config\fR to display the default configuration. +.IP "\fB\-\-debug\fR" 4 +.IX Item "--debug" +Turn on debug output on \fIstderr\fR. +.IP "\fB\-h\fR, \fB\-\-help\fR" 4 +.IX Item "-h, --help" +Display brief help then exit. +.IP "\fB\-i\fR, \fB\-\-[no\-]id\fR" 4 +.IX Item "-i, --[no-]id" +Print the actual id name that matched \fI\s-1REGEXP\s0\fR. +Control the appearance of the matching id with configuration item\ \f(CW\*(C`id\-heading\*(C'\fR. +.IP "\fB\-y\fR, \fB\-\-[no\-]ignore\-case\fR" 4 +.IX Item "-y, --[no-]ignore-case" +Match ids while ignoring case distinctions in patterns and data. +.IP "\fB\-j\fR, \fB\-\-[no\-]job\-name\fR" 4 +.IX Item "-j, --[no-]job-name" +Print the \f(CW\*(C`\ejobname\*(C'\fR that \fBtex\fR associated with the input file. +.IP "\fB\-n\fR, \fB\-\-[no\-]line\-number\fR" 4 +.IX Item "-n, --[no-]line-number" +Print the line number where the \f(CW\*(C`typoginspect\*(C'\fR\ environment +was encountered in the LaTeX source file. +.IP "\fB\-N\fR, \fB\-\-[no\-]log\-line\-number\fR" 4 +.IX Item "-N, --[no-]log-line-number" +Print the line number of the \fIlog\fR\-file where the current line was encountered. +.IP "\fB\-p\fR, \fB\-\-[no\-]page\-number\fR" 4 +.IX Item "-p, --[no-]page-number" +Print page number where the contents of the \f(CW\*(C`typoginspect\*(C'\fR\ environment +starts in the typeset document. +.IP "\fB\-P\fR, \fB\-\-[no\-]pager\fR" 4 +.IX Item "-P, --[no-]pager" +Redirect output from \fIstdout\fR to the configured pager. +.IP "\fB\-\-show\-config\fR" 4 +.IX Item "--show-config" +Show the default configuration and exit. +.IP "\fB\-V\fR, \fB\-\-version\fR" 4 +.IX Item "-V, --version" +Show version information and exit. +.IP "\fB\-w\fR, \fB\-\-[no\-]word\-regexp\fR" 4 +.IX Item "-w, --[no-]word-regexp" +Match only whole words. +.SH "CONFIGURATION" +.IX Header "CONFIGURATION" +.ie n .IP """id\-format""=\fI\s-1FORMAT\s0\fR" 4 +.el .IP "\f(CWid\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.IX Item "id-format=FORMAT" +Control the \fI\s-1FORMAT\s0\fR for printing matching ids in inline-mode, +where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Default:\ \f(CW%s:\fR. +.ie n .IP """id\-heading""=0|1" 4 +.el .IP "\f(CWid\-heading\fR=\f(CW0\fR|\f(CW1\fR" 4 +.IX Item "id-heading=0|1" +Choose between printing the matching ids with option\ \fB\-\-id\fR: +Inline\ (\f(CW0\fR) or heading before the matching data (\f(CW1\fR). +Default:\ \f(CW0\fR. +.ie n .IP """id\-heading\-format""=\fI\s-1FORMAT\s0\fR" 4 +.el .IP "\f(CWid\-heading\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.IX Item "id-heading-format=FORMAT" +Control the \fI\s-1FORMAT\s0\fR for printing matching ids in heading-mode, +where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Default:\ \f(CW\*(C`\-\->\ %s\ <\-\-\*(C'\fR. +.ie n .IP """id\-indent""=\fI\s-1INDENT\s0\fR" 4 +.el .IP "\f(CWid\-indent\fR=\fI\s-1INDENT\s0\fR" 4 +.IX Item "id-indent=INDENT" +Indentation of nested typog-inspect tags. +Only used in ``discovery'' mode (first form), i.e., if \fB\-\-all\fR is active. +Default:\ 8. +.ie n .IP """id\-max\-length""=\fIMAXIMUM-LENGTH\fR" 4 +.el .IP "\f(CWid\-max\-length\fR=\fIMAXIMUM-LENGTH\fR" 4 +.IX Item "id-max-length=MAXIMUM-LENGTH" +Set the maximum length of a matching id for printing. +It a matching id exceeds this length it will be truncated +and the last three characters (short of \fIMAXIMUM-LENGTH\fR) will be replaced by dots. +Default:\ 40. +.ie n .IP """line\-number\-format""=\fI\s-1FORMAT\s0\fR" 4 +.el .IP "\f(CWline\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.IX Item "line-number-format=FORMAT" +Control the \fI\s-1FORMAT\s0\fR for printing TeX source line numbers, +where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Default:\ \f(CW%5d\fR. +.ie n .IP """log\-line\-number\-format""=\fI\s-1FORMAT\s0\fR" 4 +.el .IP "\f(CWlog\-line\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.IX Item "log-line-number-format=FORMAT" +Control the \fI\s-1FORMAT\s0\fR for printing log line numbers, +where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Default:\ \f(CW%6d\fR. +.ie n .IP """page\-number\-format""=\fI\s-1FORMAT\s0\fR" 4 +.el .IP "\f(CWpage\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4 +.IX Item "page-number-format=FORMAT" +Control the \fI\s-1FORMAT\s0\fR for printing page numbers, +where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR. +Default:\ \f(CW\*(C`[%3d]\*(C'\fR. +.ie n .IP """pager""=\fI\s-1PAGER\s0\fR" 4 +.el .IP "\f(CWpager\fR=\fI\s-1PAGER\s0\fR" 4 +.IX Item "pager=PAGER" +Name of pager application to pipe output into +if run with option\ \fB\-\-pager\fR. +Default:\ \f(CW\*(C`less\*(C'\fR. +.ie n .IP """pager\-flags""=\fI\s-1FLAGS\s0\fR" 4 +.el .IP "\f(CWpager\-flags\fR=\fI\s-1FLAGS\s0\fR" 4 +.IX Item "pager-flags=FLAGS" +Pass \fI\s-1FLAGS\s0\fR to \fI\s-1PAGER\s0\fR. +Default:\ \f(CW\*(C`\-\-quit\-if\-one\-screen\*(C'\fR. +.IP "Color Configuration" 4 +.IX Item "Color Configuration" +For the syntax of the color specifications consult +the manual page of Term::ANSIColor(pm). +.RS 4 +.ie n .IP """file\-header\-color""" 4 +.el .IP "\f(CWfile\-header\-color\fR" 4 +.IX Item "file-header-color" +Color of the filename header. +.ie n .IP """fill\-state\-color""" 4 +.el .IP "\f(CWfill\-state\-color\fR" 4 +.IX Item "fill-state-color" +Color of the messages that report ``Underfull hbox'' or ``Overfull hbox''. +.ie n .IP """first\-vbox\-color""" 4 +.el .IP "\f(CWfirst\-vbox\-color\fR" 4 +.IX Item "first-vbox-color" +Color of the first vbox on a page. +.ie n .IP """font\-spec\-color""" 4 +.el .IP "\f(CWfont\-spec\-color\fR" 4 +.IX Item "font-spec-color" +Color of font specifications. +.ie n .IP """horizontal\-break\-candidate\-color""" 4 +.el .IP "\f(CWhorizontal\-break\-candidate\-color\fR" 4 +.IX Item "horizontal-break-candidate-color" +Color of lines with horizontal-breakpoint candidates\ \f(CW\*(C`@\*(C'\fR. +.ie n .IP """horizontal\-breakpoint\-color""" 4 +.el .IP "\f(CWhorizontal\-breakpoint\-color\fR" 4 +.IX Item "horizontal-breakpoint-color" +Color of lines with horizontal breakpoints\ \f(CW\*(C`@@\*(C'\fR. +.ie n .IP """id\-color""" 4 +.el .IP "\f(CWid\-color\fR" 4 +.IX Item "id-color" +Color of matching ids when printed inline. +.ie n .IP """id\-heading\-color""" 4 +.el .IP "\f(CWid\-heading\-color\fR" 4 +.IX Item "id-heading-color" +Color of matching ids when printed in heading form. +.ie n .IP """line\-break\-pass\-color""" 4 +.el .IP "\f(CWline\-break\-pass\-color\fR" 4 +.IX Item "line-break-pass-color" +Color of the lines showing which pass (e.g., \f(CW@firstpass\fR) +of the line-breaking algorithm is active. +.ie n .IP """line\-number\-color""" 4 +.el .IP "\f(CWline\-number\-color\fR" 4 +.IX Item "line-number-color" +Color of TeX-source-file line numbers. +.ie n .IP """log\-line\-number\-color""" 4 +.el .IP "\f(CWlog\-line\-number\-color\fR" 4 +.IX Item "log-line-number-color" +Color of log-file line numbers. +.ie n .IP """math\-color""" 4 +.el .IP "\f(CWmath\-color\fR" 4 +.IX Item "math-color" +Color used for math expressions including their font specs. +.ie n .IP """page\-number\-color""" 4 +.el .IP "\f(CWpage\-number\-color\fR" 4 +.IX Item "page-number-color" +Color of page numbers of the final output. +.ie n .IP """tightness\-color""" 4 +.el .IP "\f(CWtightness\-color\fR" 4 +.IX Item "tightness-color" +Color of lines with Tight/Loose hbox reports. +.ie n .IP """vertical\-breakpoint\-color""" 4 +.el .IP "\f(CWvertical\-breakpoint\-color\fR" 4 +.IX Item "vertical-breakpoint-color" +Color of possible vertical breakpoints. +.RE +.RS 4 +.RE +.SS "Brief summary of colors and attributes" +.IX Subsection "Brief summary of colors and attributes" +.IP "Foreground Color" 4 +.IX Item "Foreground Color" +\&\f(CW\*(C`black\*(C'\fR, \f(CW\*(C`red\*(C'\fR, \f(CW\*(C`green\*(C'\fR, \f(CW\*(C`yellow\*(C'\fR, +\&\f(CW\*(C`blue\*(C'\fR, \f(CW\*(C`magenta\*(C'\fR, \f(CW\*(C`cyan\*(C'\fR, \f(CW\*(C`white\*(C'\fR, +.Sp +Prefix with \f(CW\*(C`bright_\*(C'\fR for high-intensity or bold foreground. +.IP "Foreground Grey" 4 +.IX Item "Foreground Grey" +\&\f(CW\*(C`grey0\*(C'\fR, ..., \f(CW\*(C`grey23\*(C'\fR +.IP "Background Color" 4 +.IX Item "Background Color" +\&\f(CW\*(C`on_black\*(C'\fR, \f(CW\*(C`on_red\*(C'\fR, \f(CW\*(C`on_green\*(C'\fR, \f(CW\*(C`on_yellow\*(C'\fR, +\&\f(CW\*(C`on_blue\*(C'\fR, \f(CW\*(C`on_magenta\*(C'\fR, \f(CW\*(C`on_cyan\*(C'\fR, \f(CW\*(C`on_white\*(C'\fR +.Sp +Replace \f(CW\*(C`on_\*(C'\fR with \f(CW\*(C`on_bright_\*(C'\fR for high-intensity or bold background. +.IP "Background Grey" 4 +.IX Item "Background Grey" +\&\f(CW\*(C`on_grey0\*(C'\fR, ..., \f(CW\*(C`on_grey23\*(C'\fR +.IP "Text Attribute" 4 +.IX Item "Text Attribute" +\&\f(CW\*(C`bold\*(C'\fR, \f(CW\*(C`dark\*(C'\fR, \f(CW\*(C`italic\*(C'\fR, \f(CW\*(C`underline\*(C'\fR, \f(CW\*(C`reverse\*(C'\fR +.SH "EXIT STATUS" +.IX Header "EXIT STATUS" +The exit status is 0 if at least one \fI\s-1ID\s0\fR matched \fI\s-1REGEXP\s0\fR, +1 if no \fI\s-1ID\s0\fR matched \fI\s-1REGEXP\s0\fR, and 2 if an error occurred. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +\&\fBgrep\fR(1), \fBprintf\fR(3), \fBTerm::ANSIColor\fR(pm) diff --git a/macros/latex/contrib/typog/docs/typog-grep.1.pdf b/macros/latex/contrib/typog/docs/typog-grep.1.pdf Binary files differnew file mode 100644 index 0000000000..09647860d5 --- /dev/null +++ b/macros/latex/contrib/typog/docs/typog-grep.1.pdf diff --git a/macros/latex/contrib/typog/docs/typog.pdf b/macros/latex/contrib/typog/docs/typog.pdf Binary files differnew file mode 100644 index 0000000000..9d00685045 --- /dev/null +++ b/macros/latex/contrib/typog/docs/typog.pdf diff --git a/macros/latex/contrib/typog/typog.dtx b/macros/latex/contrib/typog/typog.dtx new file mode 100644 index 0000000000..0f2176206a --- /dev/null +++ b/macros/latex/contrib/typog/typog.dtx @@ -0,0 +1,9974 @@ +% \iffalse +% +% Copyright (C) 2024 by Ch. L. Spiel +% +% This work may be distributed and/or modified under the conditions +% of the LaTeX Project Public License, either version 1.3 of this +% license or (at your option) any later version. The latest version +% of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2003/12/01 or later. +% +% \fi +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} + +\tracingonline=0 + +%--\OnlyDescription +\EnableCrossrefs +\CodelineIndex +\RecordChanges + + +\PassOptionsToClass{a4paper}{article} +\PassOptionsToPackage{hyperfootnotes=false}{hyperref} +\PassOptionsToPackage{charter, scale=1.06}{newtxmath} +\PassOptionsToPackage{dvipsnames}{xcolor} + +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{array} +\usepackage{booktabs} +\usepackage{caption} +\usepackage{dtk-logos} +\usepackage{enumitem} +\usepackage{etoolbox}%--\tracingpatches +\usepackage{fancyhdr} +\usepackage[T1]{fontenc} +\usepackage{fullwidth} +\usepackage{hypdoc} +\usepackage{hyphenat} +\usepackage[shrink=10, stretch=10]{microtype} +\usepackage{multirow} +\usepackage{needspace} +\usepackage{placeins} +\usepackage{ragged2e} +\usepackage{setspace} +\usepackage{sidecap} +\usepackage{tabularx} +\usepackage{tcolorbox} +\usepackage{titlesec}\renewcommand*{\bottomtitlespace}{.15\textheight}%nobottomtitles* +\usepackage[debug, raise*=.05em]{typog} +\usepackage{xcolor} + + +\usepackage[default, lining, proportional, regular, semibold]{sourceserifpro} +\usepackage[lining, proportional, regular, semibold]{sourcesanspro} +\usepackage[lining, regular]{sourcecodepro} +\usepackage[xcharter]{newtxmath} +\setbaselineskip{12.5pt} + +\makeatletter +\def\@get@fontclan#1-#2\relax{#1} +\newcommand*{\fontclan}{\expandafter\@get@fontclan\f@family\relax} +\makeatother + +\newcommand*{\proportionalliningfigures}{\fontfamily{\fontclan-LF}\selectfont} +\newcommand*{\proportionaloldstylefigures}{\fontfamily{\fontclan-OsF}\selectfont} +\newcommand*{\tabularliningfigures}{\fontfamily{\fontclan-TLF}\selectfont} +\newcommand*{\tabularoldstylefigures}{\fontfamily{\fontclan-TOsF}\selectfont} + +\newcommand*{\textdenominator}[1]{{\fontfamily{\fontclan-Dnom}\selectfont #1}} +\newcommand*{\textinferior}[1]{{\fontfamily{\fontclan-Inf}\selectfont #1}} +\newcommand*{\textnumerator}[1]{{\fontfamily{\fontclan-Numr}\selectfont #1}} +\newcommand*{\textsuperior}[1]{{\fontfamily{\fontclan-Sup}\selectfont #1}} + +\newcommand*{\nativetextfraction}[2] + {\mbox{\textnumerator{#1}\textfractionsolidus\textdenominator{#2}}} + +\makeatletter +\renewcommand*{\@makefnmark}{\hbox{\sf\textsuperior{\@thefnmark}}} +\newenvironment*{tabfigures} + {\edef\rmdefault{\fontclan-T\sourceserifpro@figurestyle}\rm\ignorespaces} + {\ignorespacesafterend} + +\newcommand*{\elseries}{\def\mdseries@rm{el}\def\mdseries@sf{el}\def\mdseries@tt{el}} +\newcommand*{\textel}[1]{{\elseries\textmd{#1}}} +\newcommand*{\lseries}{\def\mdseries@rm{l}\def\mdseries@sf{l}\def\mdseries@tt{l}} +\newcommand*{\textl}[1]{{\lseries\textmd{#1}}} +%%--\newcommand*{\mdseries}{\def\mdseries@rm{m}\def\mdseries@sf{m}\def\mdseries@tt{m}} +%%--\newcommand*{\textmd}[1]{{\mdseries\textmd{#1}}} +\newcommand*{\sbseries}{\def\bfseries@rm{sb}\def\bfseries@sf{sb}\def\bfseries@tt{sb}} +\newcommand*{\textsb}[1]{{\sbseries\textbf{#1}}} +\newcommand*{\bseries}{\def\bfseries@rm{b}\def\bfseries@sf{b}\def\bfseries@tt{b}} +\newcommand*{\textb}[1]{{\bseries\textbf{#1}}} +\newcommand*{\ebseries}{\def\bfseries@rm{k}\def\bfseries@sf{eb}\def\bfseries@tt{k}} +\newcommand*{\texteb}[1]{{\ebseries\textbf{#1}}} +\makeatother + + +\usepackage{cleveref} + + +\expandafter\GetFileInfo\expandafter{\jobname.sty} +\def\aspdfdate#1/#2/#3\relax{D:#1#2#3} +\edef\pdffiledate{\expandafter\aspdfdate\filedate\relax} + +\hypersetup{ + citecolor = blue, + colorlinks = true, + linkcolor = blue, + linktocpage = false, + pdfauthor={Dr. Christoph L. Spiel}, + pdfcreationdate={\pdffiledate}, + pdfkeywords={LaTeX, typography, ligature, italic-correction, paragraph justification, baselineskip, sloppy, ragged}, + pdflang=en-US, + pdfsubject={Typographic fine-tuning for LaTeX}, + pdftitle={Package typog \fileversion}, + raiselinks = false, + urlcolor = [rgb]{0, 0, .5}% = navy +} + + +\makeatletter +\renewcommand*{\@dotsep}{10000} % suppress leaders +\patchcmd{\@dottedtocline}{\normalfont}{\bfseries}{\relax}{\PatchingFailed} +\makeatother + + +\Crefname{figure}{Figure}{Figures} +\crefname{figure}{Fig.}{Figs.} + +\Crefname{page}{Page}{Pages} +\crefname{page}{p.}{p.} + +\Crefname{section}{Section}{Sections} +\crefname{section}{Sec.}{Secs.} + +\Crefname{table}{Table}{Tables} +\crefname{table}{Tab.}{Tabs.} + + +\DeclareCaptionJustification{centerlastjustification}{\justify\fussy\lastlinecenteredpar} +\DeclareCaptionJustification{smoothraggedjustification}% + {\renewcommand*{\smoothraggedrightgenerator}{quintuplet}% + \setlength{\smoothraggedrightragwidth}{1em}% + \smoothraggedrightpar\relax} +\DeclareCaptionJustification{relaxedjustification}{\justify\slightlysloppy} + +\newcommand*{\floatcaptionwidth}{.79\textwidth} + +\captionsetup[figure]{font=small, justification=centerlastjustification, + labelfont=sc, width=\floatcaptionwidth} +\captionsetup[table]{font=small, justification=centerlastjustification, + labelfont=sc, width=\floatcaptionwidth} +\captionsetup[SCfigure]{font=small, justification=relaxedjustification, + labelfont=sc} +\captionsetup[SCtable]{font=small, justification=relaxedjustification, + labelfont=sc} + + +\newsavebox{\listlabelbox} + +\sbox{\listlabelbox}{---} +\SetEnumitemKey{noindent}{ + label={---}, + labelwidth=\wd\listlabelbox, + leftmargin=! +} + + +\SetEnumitemKey{nestedinspecialsection}{ + leftmargin=10pt +} + +\SetEnumitemKey{notopsep}{ + after=\vskip.8em plus .2em minus .4em, + partopsep=0pt, + topsep=0pt +} + + +\newlength{\marginindicatorsep} +\setlength{\marginindicatorsep}{10pt} + +\newcommand*{\marginalizesectionnumber}[1] + {\makebox[0pt][r]{#1\hspace{\marginindicatorsep}}} + + +\fancypagestyle{pagenumberonly}{ + \fancyhead[L]{} + \fancyhead[R]{\thepage} +} +\pagestyle{fancy} +\fancyhf{} +\fancyhead[L]{\rightmark} +\fancyhead[R]{\thepage} +\newcommand*{\resetfancyhead} + {\fancyhead[L]{\textsf{\textsc{\textls[20]{\nouppercase\rightmark}}}}} + +\renewcommand*{\headrulewidth}{0pt} +\renewcommand*{\sectionmark}[1] + {\def\truesectionname{#1}% + \markright{\textsf{\marginalizesectionnumber{\thesection}% + \textsc{\textls[20]{#1}}}}} +\renewcommand*{\subsectionmark}[1] + {\markright{\textsf{\marginalizesectionnumber{\thesubsection}% + \textsc{\textls[20]{\truesectionname:\enspace}}#1}}} + + +\titleformat{\section}[hang] + {\sffamily\Large\bfseries}{\marginalizesectionnumber{\thesection}}{0pt}{} +\titleformat{\subsection}[hang] + {\sffamily\large\bfseries}{\marginalizesectionnumber{\thesubsection}}{0pt}{} +\titleformat{\subsubsection}[hang] + {\sffamily\normalsize\bfseries}{\marginalizesectionnumber{\thesubsubsection}}{0pt}{} +\titleformat{\paragraph}[runin] + {\sffamily\normalsize\bfseries}{\theparagraph}{1em}{} + + +\let\footnoterule=\relax% suppress footnote rule + +\makeatletter +\renewcommand*{\@makefntext}[1] + {\noindent + \llap{\let\@textsuperscript=\relax% use "normal" figures for the footnote numbers + \let\textsuperior=\relax + \@makefnmark + \hspace{\marginindicatorsep}}% separate the footnote number and the body + #1} +\makeatother + + +\pretocmd{\DescribeEnv}{\needspace{25pt}}{\relax}{\PrependingFailed} +\pretocmd{\DescribeMacro}{\needspace{25pt}}{\relax}{\PrependingFailed} + + +\setlength{\skip\footins}{25pt} +\setlength{\overfullrule}{3pt} +\renewcommand*{\sidecaptionsep}{16pt} + + + +\newrobustcmd*{\acronym}[1]{\mbox{\scshape\MakeLowercase{#1}}} + +\newcommand*{\application}[1]{\mbox{\sffamily #1}} + +\renewcommand*{\arraystretch}{1.12} + +\newcommand*{\bibauthor}[1]{\mbox{\textsc{#1}}} +\newcommand*{\bibtitle}[1]{\textit{#1}} +\newcommand*{\biburl}[1]{\url{#1}} + +\newcommand*{\bottomstrut}{\rule[-.5em]{0pt}{0pt}} + +\newenvironment*{codeexample} + {\vspace{.5\smallskipamount} + \par + \centering + \begin{minipage}{\linewidth} + \ttfamily + \begin{tabbing}} + {\end{tabbing} + \end{minipage} + \par + \vspace{.5\smallskipamount}} + +\makeatletter +\newcommand*{\citenum}[1]{\@nameuse{b@#1}} +\makeatother + +\def\code#1{\texttt{#1}} + +\newrobustcmd*{\command}[1]{\mbox{\textbf{#1}}} + +\newcommand*{\doublequotes}[1]{\doubleguillemetright\kern-.03333em #1\doubleguillemetleft} + +\newcommand*{\dumpmacro}[1]{\texttt{\detokenize\expandafter{#1}}} + +\newcommand*{\filesystem}[1]{\mbox{\textit{#1\/}}} + +\newcommand*{\filledrectangle}[2]{\rule{#1}{#2}} +\newcommand*{\filledsquare}[1]{\filledrectangle{#1}{#1}} + +\newcommand*{\foreignphrase}[1]{\textsl{#1}} + +\newcommand*{\formatskip}[3]{#1\genfrac{}{}{0pt}{}{{+}#2}{{-}#3}} + +\makeatletter +\renewcommand*{\fps@figure}{htbp} +\renewcommand*{\fps@table}{htbp} +\makeatother + +\newcommand*{\hollowrectangle}[2] + {\setlength{\fboxrule}{.5pt}% + \setlength{\fboxsep}{0pt}% + \framebox{\rule{#1}{0pt}\rule{0pt}{#2}}} +\newcommand*{\hollowsquare}[1]{\hollowrectangle{#1}{#1}} + + +\makeatletter +\apptocmd{\index@prologue} + {\marginnote{In the Index page ranges are stuck together with + \hyperref[syn:figuredash]{\cs{figuredash*}}.}} + {\relax} + {\AppendingFailed} +\makeatother + +\newcommand*{\logmacro}[1] + {\ifdef{#1} + {\message{^^JDump of macro \string#1 follows.^^J} + \message{\detokenize\expandafter{#1}} + \message{^^JEnd macro dump.^^J}} + {\message{^^JMacro \string#1 is not defined.^^J}}} + +\newcommand*{\marginnoteformat} + {\setstretch{1}%\overfullrule=0pt + \sffamily + \footnotesize + \nofontexpansion + \slightlysloppy[1] + \loosespacing[1] + \setlength{\smoothraggedrightragwidth}{1.5em} + \def\smoothraggedrightgenerator{quintuplet}% + \smoothraggedrightpar} +\newcommand*{\marginnote}[1]{\marginpar{\marginnoteformat #1}} +\addtolength{\marginparpush}{3pt} +\addtolength{\marginparsep}{25pt} +\addtolength{\marginparwidth}{-20pt} +\newcommand*{\shiftedmarginnote}[1] + {\marginpar{\moveleft \leftmargin + \hbox{\parbox{\dimexpr\marginparwidth - \marginparsep} + {\marginnoteformat #1}}}} + +\newenvironment*{maxipage} + {\fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth, + width=\textwidth + \marginparsep + \marginparwidth}% + \begin{fullwidth}} + {\end{fullwidth}} + +\newcommand*{\microtyperequiredmarker} + {\mbox{\normalfont\packagename{microtype}~req.}} + +\newlength{\emreference} +\AtBeginDocument{\setlength{\emreference}{\fontdimen6\font}} +\newrobustcmd*{\milliem}[1] + {\ifdim #1=0pt + #1% + \else + \nativetextfraction{\the\numexpr\dimexpr (#1) * 1000 / \emreference}{1000}\:em% + \fi} + +\newcommand*{\needtocspace}[1][3] + {\addtocontents{toc}{\protect\needspace{#1\baselineskip}}} + +\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}} +\newcommand*{\programname}[1]{\mbox{\textbf{#1}}} +\newcommand*{\propername}[1]{\mbox{\textsc{#1}}} + +\newcommand*{\quarterspace}{\hspace{.25em}} + +\NewDocumentCommand{\sample}{s m} + {\setbox0=\hbox{#2}% H: 6.19849pt, /: 7.49817 + \mbox{\raisebox{\dimexpr -.15em - \dp0}{\tiny$\llcorner$}% + \kern-.15em\copy0\kern-.15em + \raisebox{\ifdim\ht0>.7em + \ifx#1\BooleanTrue + .4em + \else + \dimexpr\ht0 - .1em + \fi + \else + .4em + \fi} + {\tiny$\urcorner$}}} + +\newcommand*{\sectionfinish} + {\vfill + {\centering + \textcolor{customred4} + {\filledsquare{5pt}\enspace\filledsquare{5pt}}% + \par}% + \vfill} +\let\sectionfinish=\relax + +\newcommand*{\sinceversion}[1]{% modeled after \NewIn of "doc.dtx" + \leavevmode + \marginpar{\hfill\textcolor{\markercolor}{\sf\scshape\proportionaloldstylefigures #1}}% + \ignorespaces +} + +\newcommand*{\singlequotes}[1]{\mbox{\singleguillemetright #1\singleguillemetleft}} + +\newcommand*{\specialsectionheading}[1]{\textcolor{\markercolor}{\textit{\textbf{#1}}}} +\definecolor{customred1}{rgb}{.890, .282, .282}%-- https://paletton.com/ +\definecolor{customred2}{rgb}{.831, .110, .110} +\definecolor{customred3}{rgb}{.686, .043, .043} +\definecolor{customred4}{rgb}{.569, .000, .000} +\definecolor{customred5}{rgb}{.420, .000, .000} +\newcommand*{\markercolor}{customred4} +\newcommand*{\specialsectionmarker}{\color{\markercolor}\filledsquare{5pt}} +\newcommand*{\specialsectionbegin} + {\llap{\raisebox{1pt}{\specialsectionmarker}% + \hspace{\marginindicatorsep}}} +\newcommand*{\specialsectionend} + {\ifmmode + \specialsectionmarker + \else + \leavevmode + \unskip + \penalty9999\mbox{}\nobreak + \hfill + \quad + \mbox{\specialsectionmarker}% + \fi} +\newtoggle{printspecialsectionmarker} +\NewDocumentEnvironment{specialsection}{m m} + {\Needspace{4\baselineskip}% + \toggletrue{printspecialsectionmarker}% + \begin{list} + {\specialsectionheading{#1\ifblank{#2}{}{\textup{\space---\space#2}}}} + {\itemindent=0pt + \labelwidth=10pt + \leftmargin=15pt + \listparindent=15pt + \parsep=0pt + \topsep=\medskipamount} + \newcommand*{\specialsectionendhere} + {\specialsectionend + \global\togglefalse{printspecialsectionmarker}} + \item + \nointerlineskip + \leavevmode\par + \noindent} + {\iftoggle{printspecialsectionmarker}{\specialsectionend}{\relax}% + \end{list}} + + \newenvironment*{caution}[1][]{\begin{specialsection}{Caution}{#1}}{\end{specialsection}} + \newenvironment*{example}[1][]{\begin{specialsection}{Example}{#1}}{\end{specialsection}} + \newenvironment*{futuredirection}[1][] + {\begin{specialsection}{Anticipated Changes \& Possible Extensions}{#1}\small} + {\end{specialsection}} + \newenvironment*{important}[1][]{\begin{specialsection}{Important}{#1}}{\end{specialsection}} + \newenvironment*{note}[1][]{\begin{specialsection}{Note}{#1}}{\end{specialsection}} + \newenvironment*{notes}[1][]{\begin{specialsection}{Notes}{#1}}{\end{specialsection}} + \newenvironment*{tip}[1][]{\begin{specialsection}{Tip}{#1}}{\end{specialsection}} + \newenvironment*{tips}[1][]{\begin{specialsection}{Tips}{#1}}{\end{specialsection}} + \newenvironment*{usecase}[1][]{\begin{specialsection}{Use Case}{#1}\small}{\end{specialsection}} + \newenvironment*{usecases}[1][]{\begin{specialsection}{Use Cases}{#1}\small}{\end{specialsection}} + +\newcommand*{\specialcodesectionheading}[1]{\textcolor{\markercolor}{\textbf{\textit{#1}}}} +\newenvironment*{specialcodesection}[1] + {\Needspace{4\baselineskip}% + \begin{tcolorbox}[colback=white, colframe=\markercolor, + bottomrule=0pt, leftrule=5pt, rightrule=0pt, toprule=0pt] + \sf\typogsetupsf + \begin{list} + {\specialcodesectionheading{#1}} + {\itemindent=0pt + \labelwidth=20pt + \leftmargin=25pt + \listparindent=15pt + \parsep=0pt + \topsep=\medskipamount} + \item + \nointerlineskip + \leavevmode\par + \noindent} + {\end{list} + \end{tcolorbox}} + \newenvironment*{anticipatedchange} + {\begin{specialcodesection}{Anticipated Change}} + {\end{specialcodesection}} + \newenvironment*{implementationnote} + {\begin{specialcodesection}{Implementation Note}} + {\end{specialcodesection}} + \newenvironment*{knownbug} + {\begin{specialcodesection}{Known Bug}} + {\end{specialcodesection}} + +\newenvironment*{suspendshortverb} + {\DeleteShortVerb{\|}} + {\MakeShortVerb{\|}} + +\definecolor{cold-silver}{cmyk}{.08, 0, 0, .18} +\newenvironment*{synopsis} + {\begin{tcolorbox}[boxrule=.25pt, colback=cold-silver]% + \phantomsection} + {\end{tcolorbox}} + +\newenvironment*{tablenotes} + {\medskip + \centering + \small + \begin{minipage}{\floatcaptionwidth}} + {\end{minipage}} +\newcommand*{\tablenotemark}[1]{\smash{\textsuperscript{#1}}} + +\newcommand*{\termparbox}[1]{\parbox[t]{\linewidth}{#1\bottomstrut}} + +\newcommand*{\thousandsseparator}{\mbox{,}} + +\newcommand*{\topstrut}{\rule{0pt}{1.3em}} + +\newcommand*{\typogsetuprm} + {\typogsetup{raise*=.025em, + raisecapitalguillemets=.05em, + raiseguillemets=.03333em, + raisefiguredash=.05em}} +\newcommand*{\typogsetupsf} + {\typogsetup{raise*=.06667em, + raiseguillemets=.05em}} + +\newcommand*{\visualpar}{\textcolor{\markercolor}{\P}\linebreak[1]\enspace} + +\newenvironment*{whittyquote} + {\begin{flushright} + \renewcommand*{\propername}[1]{\mbox{##1}}% + \sf\typogsetupsf} + {\end{flushright}} + +\newenvironment*{widecodeexample} + {\begin{maxipage} + \flushright + \begin{minipage}{\textwidth} + \ttfamily + \begin{tabbing}} + {\end{tabbing} + \end{minipage} + \end{maxipage}} + + +\NewDocElement[macrolike = true, + idxtype = dim., + idxgroup = dimensions, + printtype = \textit{dimen}] + {LaTeXDimen}{ldimen} +\pretocmd{\DescribeLaTeXDimen}{\needspace{25pt}}{\relax}{\PrependingFailed} + +\NewDocElement[macrolike = false, + idxtype = enumitem-key, + idxgroup = enumitem-keys, + printtype = \textit{enumitem key}] + {EnumItemKey}{enumitemkey} +\pretocmd{\DescribeEnumItemKey}{\needspace{25pt}}{\relax}{\PrependingFailed} + + +\hyphenation{% https://hyphenateit.com/en-us + Double-guillemet-left + Double-guillemet-right + Double-quotes + Single-guillemet-left + Single-guillemet-right + Single-quotes + adj-demerits + allow-break + babel-hyphenation + base-line-skip + break-penalty + breakable-display + capital-hyphen + capital-times + cite-dash + club-penalties + cref-range-conjunction + display-break + display-widow-penalties + double-guillemet-right + double-hyphen-demerits + double-quotes + ex-hyphen-penalty + figure-dash + guille-met + guille-mets + inter-display-line-penalty + inter-text + kerned-hyphen + last-line-centered + last-line-centered-par + last-line-ragged-left + last-line-ragged-left-par + line-width + loose-ness + loose-spacing + make-at-letter + make-at-other + mar-gin-al + math-italics-correction + micro-type + narrow-space + narrow-space-scale + narrow-space-strength + number-dash + par-box + par-indent + parfillskip + pdf-string-def-Disable-Commands + post-display-penalty + pre-display-penalty + raise-capital-guillemets + raise-capital-hyphen + raise-capital-times + raise-number-dash + set-baseline-skip + set-baseline-skip-percentage + set-font-expand + set-font-shrink + set-font-stretch + set-leading + set-leading-percentage + short-inter-text + single-guillemet-left + single-guillemet-right + single-quotes + slash-kern + slightly-sloppy + slightly-sloppy-par + sloppy-par + smooth-ragged-right-fuzz-factor + smooth-ragged-right-par + smooth-ragged-right-shape-quintuplet + smooth-ragged-right-shape-septuplet + smooth-ragged-right-shape-triplet + space-skip + text-italics-correction + tight-spacing + tracing-boxes + tracing-para-graphs + tracking-tt-spacing + typog-get + typog-setup + vtie-bot + vtie-bot-disp + vtie-bot-disp-par + vtie-bot-disp-top-par + vtie-bot-par + vtie-top + vtie-top-par + wide-space + wide-space-scale + wide-space-strength + widow-penalties +} + + +\begin{document} + \typogsetuprm + \DocInput{typog.dtx} +\end{document} +%</driver> +%<*index-style> +actual '=' +delim_r "\\figuredash*" +heading_prefix "\\pagebreak[3]\\smallskip\n\n{\\sffamily\\bfseries\\large " +heading_suffix "}\\nopagebreak\n" +headings_flag 1 +level '>' +quote '!' +%</index-style> +% \fi +% +% +% \DoNotIndex{\,} +% \DoNotIndex{\addtolength,\advance,\aftergroup,\allowdisplaybreaks,\arabic} +% \DoNotIndex{\AtBeginDocument,\autotransfer} +% \DoNotIndex{\baselineskip} +% \DoNotIndex{\c,\char,\clubpenalties,\clubpenalty,\count,\cs,\csname} +% \DoNotIndex{\DeclareRobustCommand,\def,\define@choicekey,\define@key,\detokenize} +% \DoNotIndex{\dim,\dimen,\dimexpr,\discretionary,\displaywidowpenalties,\displaywidowpenalty} +% \DoNotIndex{\edef,\else,\emergencystretch,\empty,\endcsname} +% \DoNotIndex{\endlastlineflushrightpar} +% \DoNotIndex{\endlastlineraggedleftpar} +% \DoNotIndex{\endnofontexpand,\endnofontexpansion} +% \DoNotIndex{\endsmoothraggedrightshapequintuplet} +% \DoNotIndex{\endsmoothraggedrightshapeseptuplet} +% \DoNotIndex{\endsmoothraggedrightshapetriplet} +% \DoNotIndex{\endtypoginspect} +% \DoNotIndex{\exhyphenpenalty,\expandafter,\ExplSyntaxOff,\ExplSyntaxOn} +% \DoNotIndex{\fi,\finalhyphendemerits,\font,\fontdimen,\fp,\fussy,\futurelet} +% \DoNotIndex{\gdef,\global,\glueexpr,\@gobble} +% \DoNotIndex{\guillemotleft,\guillemotright,\guilsinglleft,\guilsinglright} +% \DoNotIndex{\hbadness,\hfuzz,\hskip,\hspace} +% \DoNotIndex{\ignorespaces,\ignorespacesafterend} +% \DoNotIndex{\if,\IfBooleanT,\IfBooleanTF,\ifcase,\ifdefined,\ifdim,\iffalse,\ifmmode,\ifMT@expansion} +% \DoNotIndex{\@ifnextchar,\IfNoValueF,\IfNoValueTF,\ifnum} +% \DoNotIndex{\iftypog@microtype@loadedfalse} +% \DoNotIndex{\iftypog@microtype@preloadedfalse} +% \DoNotIndex{\ifvmode,\ifx,\ignorespaces,\inputlineno,\int,\interlinepenalty} +% \DoNotIndex{\jobname} +% \DoNotIndex{\kern} +% \DoNotIndex{\l,\lastlinefit,\lastlineflushrightpar,\lastlineraggedleftpar,\leftmargin,\leftskip,\let} +% \DoNotIndex{\linepenalty,\linewidth,\@listdepth,\looseness,\lsstyle} +% \DoNotIndex{\@M,\m@th,\mathbin,\mathord,\maxdimen,\message,\microtypecontext,\microtypesetup} +% \DoNotIndex{\@minus,\mkern,\m@ne,\mspace,\MT@letterspace@,\MT@MT,\muexpr} +% \DoNotIndex{\@ne,\NeedsTeXFormat,\NewDocumentCommand,\NewDocumentEnvironment,\newcommand,\newenvironment} +% \DoNotIndex{\newcounter,\newdimen,\newif,\newlength,\newmuskip} +% \DoNotIndex{\nobreak,\nofontexpand,\nofontexpansion,\nr,\numexpr} +% \DoNotIndex{\or,\optarg} +% \DoNotIndex{\p@,\PackageError,\PackageWarning} +% \DoNotIndex{\par,\parfillskip,\parindent,\parshape,\pdf@strcmp} +% \DoNotIndex{\pdfstringdefDisableCommands} +% \DoNotIndex{\penalty,\@plus,\PopPostHook,\postdisplaypenalty,\predisplaypenalty,\prg} +% \DoNotIndex{\pretolerance,\protected,\ProvidesPackage,\PushPostHook} +% \DoNotIndex{\raisebox,\refstepcounter,\relax,\RenewExpandableDocumentCommand,\RequirePackage,\rightskip} +% \DoNotIndex{\setcounter,\SetEnumitemKey,\SetExpansion,\setkeys,\setlength,\setstretch} +% \DoNotIndex{\showboxbreadth,\showboxdepth,\skip,\sloppy} +% \DoNotIndex{\smoothraggedrightpar} +% \DoNotIndex{\smoothraggedrightshapequintuplet} +% \DoNotIndex{\smoothraggedrightshapeseptuplet} +% \DoNotIndex{\smoothraggedrightshapetriplet} +% \DoNotIndex{\space,\spaceskip,\stepcounter,\@strength,\string} +% \DoNotIndex{\textemdash,\textendash,\textsf,\textsl,\texttimes,\textwidth,\the,\times,\tl,\tolerance} +% \DoNotIndex{\tracingnone,\tracingpages,\tracingparagraphs} +% \DoNotIndex{\typeout,\typoginspect,\typoglogo} +% \DoNotIndex{\unless} +% \DoNotIndex{\val,\value,\vbadness,\vfuzz} +% \DoNotIndex{\widowpenalties,\widowpenalty} +% \DoNotIndex{\z@,\z@skip} +% +% +% \changes{v0.1}{2024-3-7}{Initial version.} +% +% +% \pagenumbering{roman} +% +% \title{\typoglogo{} \capitalendash{} Typographic Fine\rightkernedhyphen*[20]{-120}Tuning} +% \author{Ch.~L.~Spiel\footnote{\quarterspace\texttt{cspiel@users.sourceforge.org}}} +% \date{\fileversion\qquad \filedate} +% \maketitle +% \thispagestyle{empty} +% +% \begingroup +% \let\small=\normalsize +% \begin{abstract} +% \begin{lastlinecenteredpar} +% \noindent +% Package~\packagename{typog} provides macros and environments for +% \mbox{(micro-)\itcorr{2}}\breakpoint typographic enhancements. It also supplies some +% means to avoid common typographic problems as, for example, orphan or widow lines. +% Moreover it supplies high-level front-ends for packages~\packagename{microtype} and +% \packagename{setspace}. +% \end{lastlinecenteredpar} +% \end{abstract} +% \endgroup +% +% +% \iffalse +%<*title> +prologues := 3; +truecorners := 1; +linecap := butt; + +string roman_font; +roman_font := "pplr8r"; % URW Palladio L - Roman + +string italics_font; +italics_font := "pplri8r"; % URW Palladio L - Italic + +picture dash_dotted; +dash_dotted := dashpattern(on 3 off 3 on 0 off 3); + +u := 280; + +font_scale := 20; + +pair loc[]; +loc[1] := .2[origin, (u, 0)]; +loc[2] := .5[origin, (u, 0)]; +loc[3] := .8[origin, (u, 0)]; + +pair slant_vector; +slant_vector := (63, 150); + +pair raise_vector[]; +raise_vector[0] := (0, 44); +raise_vector[1] := (0, 61); +raise_vector[2] := (0, 54); +raise_vector[3] := (0, 71); + + +picture letter_V; +letter_V := thelabel.top("V" infont roman_font scaled font_scale, loc[1]); + +picture normal_hyphen; +normal_hyphen := thelabel.top("-" infont roman_font scaled font_scale, loc[2] + raise_vector[0]); + +picture raised_hyphen; +raised_hyphen := thelabel.top("-" infont roman_font scaled font_scale, loc[2] + raise_vector[1]); + +picture letter_A; +letter_A := thelabel.top("A" infont roman_font scaled font_scale, loc[3]); + + +beginfig(1); + draw letter_V; + draw normal_hyphen withcolor .9 white; + draw raised_hyphen; + draw letter_A; + + pickup pencircle scaled .4pt; + draw (loc[1] -- loc[1] + slant_vector) shifted (7, 0) dashed evenly; + draw (loc[1] -- loc[1] + slant_vector) shifted (27, 0) dashed evenly; + draw (loc[1] -- loc[1] + slant_vector) shifted (80, 0) dashed evenly; + draw (loc[3] -- loc[3] + slant_vector) shifted (-68, 0) dashed evenly; + + draw .35[origin, (u, 0)] + raise_vector[2] -- .8[origin, (u, 0)] + raise_vector[2] + dashed dash_dotted withcolor .6white; + draw .35[origin, (u, 0)] + raise_vector[3] -- .8[origin, (u, 0)] + raise_vector[3] + dashed dash_dotted; +endfig; +end +%</title> +% \fi +% +% +% \vspace*{20pt} +% +% \begin{center} +% \includegraphics{title-1.mps} +% \end{center} +% +% \vfill +% +% \begin{lastlinecenteredpar} +% \footnotesize +% \noindent +% This package is copyright \textcopyright~2024 Ch.~L.~Spiel. It may be distributed +% and\kernedslash*or modified under the conditions of the \LaTeX{} Project Public License +% \acronym{(LPPL)}, either version~1.3c of this license or --~at your option~-- any later +% version. This work has the \acronym{LPPL} maintenance status +% \doublequotes{author-maintained}. +% \end{lastlinecenteredpar} +% +% +% \clearpage +% \thispagestyle{pagenumberonly} +% \tableofcontents +% \vspace{\fill} +% +% +% \thispagestyle{pagenumberonly} +% \listoftables +% \phantomsection +% \addcontentsline{toc}{subsection}{List of Tables} +% \vspace{\fill} +% +% +% \begingroup +% \footnotesize +% \singlespacing +% \noindent +% The font sample on the title page was generated with the help of \MP{} using +% \doublequotes{\acronym{URW} Palladio~L}\index{font>URW Palladio L=\acronym{URW} Palladio +% L}. +% \endgroup +% +% +% \clearpage +% \pagenumbering{arabic} +% \section{Introduction}\label{sec:introduction} +% +% \begin{whittyquote} +% \doublequotes{Good typography} is the minimum acceptable solution; \\ +% \doublequotes{fine typography} is what we aspire to. \\ +% \capitalemdash*~\propername{Ilene Strizver} +% \end{whittyquote} +% +% \noindent +% \LaTeX{} is the beginning of good typesetting -- not the end. This package provides some +% tools for even better looking documents. When applied correctly its effects appear subtle +% and inconspicuous. +% +% +% \subsection{Overview}\label{sec:overview} +% +% Package~\packagename{typog} focuses on (micro-)typographic improvements. +% +% \Cref{sec:information} tends to the wish for more information in the typesetting process +% whether during the draft phase or in the final printed manuscript.\marginnote{Throughout the +% whole document we indicate actual uses of the package's features in the margin. All these +% notes are examples themselves as they are typeset with +% \hyperref[syn:slightlysloppy]{\code{slightlysloppy}}, +% \hyperref[syn:loosespacing]{\code{loosespacing}}, and +% \hyperref[syn:smoothraggedrightpar]{\code{smoothraggedrightpar}}.~\visualpar The title page +% has already demonstrated the effect of +% \hyperref[syn:lastlinecenteredpar]{\code{lastlinecenteredpar}} in justified paragraphs for +% the abstract and the copyright notice.} +% +% \Cref{sec:latex-hyphenation} expands the hyphenation facilities of \LaTeX. +% +% \Cref{sec:break-ligatures,sec:manual-italic-correction,sec:extra-kerning,sec:raise-characters} +% deal with vertically positioning glyphs in a more pleasant way. +% +% \Cref{sec:align-last-line,sec:fill-last-line} discuss dearly missed macros for better control +% of the last line of a paragraph. +% +% \Cref{sec:spacing-control} covers the manipulation of the length of a paragraph. +% +% \Cref{sec:microtype-frontend} expounds on the \packagename{microtype} front-end: font +% tracking~(\ref{sec:tracking-control}), font expansion~(\ref{sec:font-expansion-control}), and +% character protrusion~(\ref{sec:protrusion}). +% +% In \cref{sec:sloppy-paragraphs} we address some shortcomings of spacing control with a +% replacement for the macro~\cs{sloppy} and the related environment~\code{sloppypar}. +% +% \Cref{sec:vtie-paragraph} presents several special functions to avoid club or widow lines in +% a paragraph. +% +% As a simple extension of displayed mathematical equations we define a breakable variant in +% \cref{sec:breakable-display}. +% +% \Cref{sec:setspace-frontend} introduces the \packagename{setspace} front-end. +% +% In the last part, \cref{sec:smooth-ragged}, we introduce a novel way of generating ragged +% paragraphs, which still is experimental. +% +% +% \subsection{Prerequisites}\label{sec:packageprerequisites} +% +% Package \packagename{typog} requires \eTeX; it relies on the \LaTeXIII{}~interface. Parts of +% it are based on package~\packagename{microtype}. However, if the respective functionality is +% not used, \packagename{typog} can be used without \packagename{microtype}. The same holds +% true for the \packagename{setspace} front-end. +% +% The package was tested with \programname{pdfTeX}~3.141592653-2.6-1.40.24 from the +% TeX~Live distribution of~2022 as shipped by +% \href{https://packages.debian.org/search?keywords=texlive}{Debian}. +% +% +% \sectionfinish +% \clearpage +% \section{Package Options}\label{sec:package-options} +% +% Package \packagename{typog} does not override any existing macros or environments when +% loaded, unless explicitly told by a package option. +% +% \begin{synopsis} +% \begin{tabbing} +% |\usepackage[|\,\dots|]{microtype}| +% \=\texttt{\%\space}\textit{Only required for macros and} \\ +% \>\texttt{\%\space}\textit{environments in \cref{sec:microtype-frontend}.} \\ +% \\[-.5em] +% |\usepackage[|\,\dots|]{setspace}| +% \=\texttt{\%\space}\textit{Only required for macros in \cref{sec:setspace-frontend}.} \\ +% \\[-.5em] +% |\usepackage[|\meta{OPTION}\dots|]{typog}| +% \end{tabbing} +% \end{synopsis} +% +% \index{package options|(} +% The package \meta{OPTIONs} serve as configuration \meta{key}s, too. This means they can be +% set with \hyperref[syn:typogsetup]{\code{typogsetup}} and their values can be retrieved with +% \hyperref[syn:typogget]{\cs{typogget}}. Options that rely on package~\packagename{microtype} +% are indicated with \doublequotes{\microtyperequiredmarker}. +% +% \begin{typogsetup}{} +% \newcommand*{\indexpackageoption}[1] +% {\index{package option>#1=\code{#1}}\index{#1=\code{#1}~(option)}\ignorespaces} +% \begin{description} +% [before={\let\oldmakelabel=\makelabel +% \renewcommand{\makelabel}[1] +% {\oldmakelabel{\termparbox{##1}}\phantomsection}}, +% font=\normalfont, +% style=nextline, +% vtietop] +% \item[|breakpenalty=|\meta{penalty}]\label{item:breakpenalty} +% \indexpackageoption{penalty} +% \shiftedmarginnote{This sub-section is typeset with all \packagename{typog}~parameters +% reset to their defaults by wrapping it in a +% \hyperref[syn:typogsetup]{\code{typogsetup}}~environment with an empty argument.} +% Penalty for a line break at various points. Default +% value:~\the\typogget{breakpenalty}; initialized by the current +% \cs{exhyphenpenalty}:~\the\exhyphenpenalty. +% +% \item[|debug|, |nodebug|]\label{item:debug} +% \indexpackageoption{debug} +% \indexpackageoption{nodebug} +% Write package-specific debug information to the log file. Opposite: |nodebug|. The +% default is not to log debug information. +% +% \item[|ligaturekern=|\meta{dim}]\label{item:ligaturekern} +% \indexpackageoption{ligaturekern} +% Set \meta{dim} of the kern that is inserted to split a ligature in +% macro\hyperref[syn:nolig]{\cs{nolig}}. See +% \cref{sec:break-ligatures}.\shiftedmarginnote{We access the configuration values with +% \hyperref[syn:typogget]{\cs{typogget}}.} Default +% value:~\milliem{\typogget{ligaturekern}}. +% +% \item[|mathitalicscorrection=|\meta{dim}]\label{item:mathitalicscorrection} +% \indexpackageoption{mathitalicscorrection} +% Italics correction in math mode. See \cref{sec:manual-italic-correction} and also the +% complementary configuration +% option~\hyperref[item:textitalicscorrection]{|textitalicscorrection|}. Default +% value:~\the\typogget{mathitalicscorrection}.\footnote{Note that 1\,mu is +% \nativetextfraction{1}{18}\,em of the mathematical font's~em.} +% +% \item[|raise*=|\meta{dim}]\label{item:raise} +% \indexpackageoption{raise*} +% Set the length by which selected characters (dash, hyphen, times, and number dash) are +% raised. Default value:~0pt. +% +% Only the raise amounts for guillemets are unaffected by this option. +% +% \item[|raisecapitaldash=|\meta{dim}]\label{item:raisecapitaldash} +% \indexpackageoption{raisecapitaldash} +% Set the length that the \cs{textendash} is raised in +% \hyperref[syn:capitaldash]{\cs{capitaldash}}. See \cref{sec:capital-dash}. Default +% value:~\milliem{\the\typogget{raisecapitaldash}}. +% +% \item[|raisecapitalhyphen=|\meta{dim}]\label{item:raisecapitalhyphen} +% \indexpackageoption{raisecapitalhyphen} +% Set the length that the hyphen character~\sample{-} is raised in +% \hyperref[syn:capitalhyphen]{\cs{capitalhyphen}}. See +% \cref{sec:capital-hyphen}.\shiftedmarginnote{This description list is protected against +% breaking items across pages within the first three lines by +% \hyperref[syn:vtietop]{\code{vtietop}}.} Default +% value:~\milliem{\the\typogget{raisecapitalhyphen}}. +% +% \item[|raisecapitaltimes=|\meta{dim}]\label{item:raisecapitaltimes} +% \indexpackageoption{raisecapitaltimes} +% Set the length that the multiplication symbol~\sample{\texttimes} is raised in +% \hyperref[syn:capitaltimes]{\cs{capitaltimes}}. See \cref{sec:mult-sign}. Default +% value:~\milliem{\the\typogget{raisecapitaltimes}}. +% +% \item[|raisecapitalguillemets=|\meta{dim}]\label{item:raisecapitalguillemets} +% \indexpackageoption{raisecapitalguillemets} +% Set the length that single and double guillemets are raised in the uppercase versions of +% the guillemet macros. See \cref{sec:guillemets}. Default +% value:~\milliem{\the\typogget{raisecapitalguillemets}}. +% +% \item[|raiseguillemets=|\meta{dim}]\label{item:raiseguillemets} +% \indexpackageoption{raiseguillemets} +% Set the length that single and double guillemets are raised in the lowercase versions of +% the guillemet macros. See \cref{sec:guillemets}. Default +% value:~\milliem{\the\typogget{raiseguillemets}}. +% +% \item[|raisefiguredash=|\meta{dim}]\label{item:raisefiguredash} +% \indexpackageoption{raisefiguredash} +% Set the length that the \cs{textendash} is raised in +% \hyperref[syn:figuredash]{\cs{figuredash}}. See \cref{sec:number-dash}. Default +% value:~\milliem{\the\typogget{raisefiguredash}}. +% +% \item[|shrinklimits=\{|\meta{limit-1}, \meta{limit-2}, \meta{limit-3}|\}|\quad\microtyperequiredmarker\label{item:shrinklimits} \\ +% |stretchlimits=\{|\meta{limit-1}, \meta{limit-2}, \meta{limit-3}|\}|\quad\microtyperequiredmarker]\label{item:stretchlimits} +% \indexpackageoption{shrinklimits} +% \indexpackageoption{stretchlimits} +% Set the three limits, given in \nativetextfraction{1}{1000}\,em, of shrinkability and +% stretchability for the respective levels. They are used in +% \hyperref[syn:setfontshrink]{\code{setfontshrink}} (|shrinklimits| triple only), +% \hyperref[syn:setfontstretch]{\code{setfontstretch}} (|stretchlimits| triple only), and +% \hyperref[syn:setfontexpand]{\code{setfontexpand}} (both triples of limits). See +% \cref{sec:font-expansion-control}. +% +% New \meta{limit-\#} values replace old ones. If one or more limits of the triple should +% remain unchanged pass a \smash{\sample{*}} instead of a number. +% +% \makeatletter +% Defaults for |shrinklimits| are \mbox{\typog@default@shrink@i, \typog@default@shrink@ii, +% \typog@default@shrink@iii} and those for |stretchlimits| are +% \mbox{\typog@default@stretch@i, \typog@default@stretch@ii, \typog@default@stretch@iii}. +% \makeatother +% +% Both options can be used when loading the package and in the document preamble, but +% \emph{not} in the document body. +% +% \item[|slashkern=|\meta{dim}]\label{item:slashkern} +% \indexpackageoption{slashkern} +% Set the size of the kerns before and after \hyperref[syn:kernedslash]{\cs{kernedslash}}. +% See \cref{sec:slash-with-kern}. Default value:~\milliem{\typogget{slashkern}}. +% +% \item[|textitalicscorrection=|\meta{dim}]\label{item:textitalicscorrection} +% \indexpackageoption{textitalicscorrection} +% Italics correction fallback-value; used if \cs{fontdimen1} is zero. See +% \cref{sec:manual-italic-correction} on manual italic correction and also the +% complementary configuration +% option~\hyperref[item:mathitalicscorrection]{|mathitalicscorrection|}. Default +% value:~\milliem{\typogget{textitalicscorrection}}. +% +% \item[|trackingttspacing=|\code{\{\meta{outer-spacing}\}}\quad\microtyperequiredmarker]\label{item:trackingttspacing} +% \indexpackageoption{trackingttspacing} +% Set the outer spacing of all typewriter fonts if used in environment~\code{settracking} +% as described in \cref{sec:tracking-control}. +% +% The argument \meta{outer-spacing} gets passed to \packagename{microtype}'s +% \cs{SetTracking} option~\code{outer spacing}~\cite[Sec.~5.3]{package:microtype}. If it +% contains commas, enclose the whole argument in curly braces. Default argument +% value:~\mbox{\typogget{trackingttspacing}}. +% +% The option can be used when loading the package and in the document preamble, but +% \emph{not} in the document body. +% +% By default this option is unset. +% \end{description} +% \end{typogsetup} +% \index{package options|)} +% +% +% \sectionfinish +% \clearpage +% \section{Macros and Environments}\label{sec:macros-and-envs} +% +% \begin{whittyquote} +% Easy things should be easy, and \\ +% hard things should be possible. \\ +% \capitalemdash*~\propername{Larry Wall} +% \end{whittyquote} +% +% \noindent +% This is the \doublequotes{User Manual}~section of the documentation, where we describe all +% user-relevant macros and environments that are defined in package~\packagename{typog}. +% +% We follow the naming convention that every environment whose name ends with \code{\dots par} +% issues a \cs{par} at its end. Environments with different name suffixes never close +% with~\cs{par}. +% +% \bigskip +% +% \noindent +% \DescribeEnv{typogsetup} +% Configure\index{configuration}\index{setup} the package with the given \meta{keys}. An empty +% argument of \code{typogsetup} resets all \meta{keys} to their default values. +% +% \begin{synopsis}\label{syn:typogsetup} +% \cs{begin}|{typogsetup}|\marg{keys} +% \dots{} +% \cs{end}|{typogsetup}| +% \end{synopsis} +% +% The package can be (re-)configured\index{reconfigure} at any point with +% \cs{typogsetup}\marg{keys}, or --~for localized changes~-- as +% +% \begin{codeexample} +% 12\=\kill +% \cs{begin}|{typogsetup}|\marg{keys} \\ +% \> \dots \\ +% \cs{end}|{typogsetup}| +% \end{codeexample} +% +% \noindent +% where \meta{keys} have the same format as the package options described in +% \cref{sec:package-options}. +% +% \begin{usecases} +% \cs{typogsetup} can substitute configuring the package at load-time or serve as an +% addition.~\visualpar Using the |typogsetup|~environment allows to fine-tune the parameters +% for a specific use, e.\,g., display-sized text.~\visualpar It even is conceivable that a +% well-established \packagename{typog}-configuration gets attached to font-changing macros +% like \cs{rm}, \cs{sf},~etc. +% \end{usecases} +% +% +% \noindent +% \DescribeMacro{\typogget} +% Sometimes the user needs to access internal configuration values of +% package~\packagename{typog}. This can be done in a safe way without resorting to code that +% is bracketed by \cs{makeatletter}/\cs{makeatother} with the help of the following macro. +% +% \begin{synopsis}\label{syn:typogget} +% \cs{typogget}\marg{key} +% \end{synopsis} +% +% Retrieve the configuration value that is associated with~\meta{key}. For a list of available +% \meta{key}s see~\cref{sec:package-options}. +% +% \begin{usecase} +% Raise glyphs by the same amount as configured with \packagename{typog}. +% +% \begin{codeexample} +% 12\=\kill +% \cs{newcommand*}\{\cs{seesubst}\} \\ +% \> \{\cs{raisebox}\= \{\cs{typogget}\{raisecapitalguillemets\}\}\% \\ +% \> \> \{\cs{rightarrowhead}\}\} \\ +% \cs{renewcommand*}\{\cs{labelitemi}\} \\ +% \> \{\cs{raisebox}\= \{\cs{typogget}\{raisecapitaldash\}\}\{\cs{cdot}\}\} +% \end{codeexample} +% +% The latter only is useful inside of an \code{itemize}~environment of course. +% \end{usecase} +% +% +% \subsection{Information}\label{sec:information}\index{information} +% +% \begin{whittyquote} +% Never forget: The visual output counts; \\ +% it must always be checked, [\dots]. \\ +% \marginnote{The em-dash at then end of the quote is height-adjusted with +% \hyperref[syn:capitalemdash]{\cs{capitalemdash*}}.}% +% \capitalemdash*~\propername{Udo Wermuth}~\cite{wermuth:2017a} +% \end{whittyquote} +% +% \noindent +% We define some functions for introspection of the typesetting process. +% +% +% \subsubsection{Font Information}\label{sec:font-information} +% \index{font>information} +% +% \DescribeMacro{\fontsizeinfo} +% Capture the font~size\footnote{We use \cs{fontdimen6}, the em-height as the font +% size.}\index{font>size} and line~spacing\footnote{The line~spacing simply is +% \cs{baselineskip}.}\index{line spacing} at the point where \cs{fontsizeinfo} \emph{is called} +% in macro~\meta{cs-name}. Both dimensions are measured in points~(pt) and the results are +% rounded to tenths. +% +% \begin{synopsis}\label{syn:fontsizeinfo} +% \cs{fontsizeinfo}\marg{cs-name} +% \end{synopsis} +% +% The call to \cs{fontsizeinfo} introduces a pair of macros to access the stored values. The +% unstarred version~\cs{cs-name} expands to the lengths including their units (i.\,e.,~pt), the +% starred version~\cs{cs-name*} omits the units. The separating slash is +% \hyperref[syn:kernedslash]{\cs{kernedslash}}, which is introduced in +% \cref{sec:slash-with-kern}. +% +% \begin{note} +% The \cs{baselineskip} can contain a rubber (stretch/shrink) component, however, +% \cs{fontsizeinfo} will not display these parts. +% \end{note} +% +% \begin{usecases} +% Colophon.~\visualpar Font test pages. +% \end{usecases} +% +% +% \subsubsection{Paragraph- and Page-Breaking Trace}\label{sec:paragraph-and-pagebraking-trace} +% +% \DescribeEnv{typoginspect} +% \DescribeEnv{typoginspectpar} +% The environments |typoginspect| and |typoginspectpar| turn on the tracing of paragraphs and +% pages; optionally they display the parbox' contents. These environments can assist the user +% in identifying typographic problems in a quantitative way without getting distracted by +% unrelated information in the trace or the \filesystem{log}-file. +% +% \begin{synopsis}\label{syn:typoginspect} +% \cs{begin}|{typoginspect}|\oarg{option}\marg{id} +% \dots{} +% \cs{end}|{typoginspect}| \\[\smallskipamount] +% \cs{begin}|{typoginspectpar}|\oarg{option}\marg{id} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{typoginspectpar}| +% \end{synopsis} +% +% The \meta{id} is an arbitrary string that identifies the results in the +% \filesystem{log}-file. If the mandatory argument is empty, \packagename{typog} constructs a +% unique value. +% +% +% \paragraph{Option} +% +% \begin{description}[style=nextline] +% \item[|tracingboxes|{[}=\meta{size}{]}] +% Specify the maximum box breadth and box depth reported in the log. If \meta{size} is +% omitted the maximum values are assumed; this is similar to the \cs{tracingboxes} +% macro~\cite[p.~312]{abrahams:2020}. +% \end{description} +% +% \begin{caution} +% The end-of-trace marker sometimes gets placed too early and the trace seems truncated. +% \LaTeX{} reliably logs the requested the trace information, but the write operations for +% trace data and \cs{immediate}\cs{write} which is used to print the end-tag are not +% synchronized. +% \end{caution} +% +% +% \paragraph{\LaTeX{} \filesystem{log}-file and trace.} +% The trace data in the \filesystem{log}-file is bracketed by \acronym{XML}-tags. +% +% \begin{widecodeexample} +% <typog-inspect\textvisiblespace +% id="\meta{id}"\textvisiblespace +% job="\meta{jobname}"\textvisiblespace +% line="\meta{line-number}"\textvisiblespace +% page="\meta{page-number}"> \\ +% ~~\dots \\ +% </typog-inspect> +% \end{widecodeexample} +% +% \noindent +% where the \meta{id} is the user-supplied, unique\footnote{It has turned out advantageous to +% use unique \meta{id}s. However, \meta{id}s are \emph{not required} to be distinct.} +% identifier of the group, \meta{jobname} is the value of \cs{jobname}, \meta{line-number} +% records the \cs{inputlineno} of the \cs{begin}~of the group, and \meta{page-number} gets +% replaced with the current value of the page counter. +% +% \begin{itemize}[noindent] +% \item Any text tool can be used to ferret out the tags. \propername{Emacs} users will find +% \mbox{\code{(occur \meta{regexp})}} to be useful. +% +% \item As long as the tags are not nested \programname{sed} or \programname{perl} +% extract the information gathered by~|typoginspect|, for example: +% +% \begin{codeexample} +% sed \= -ne '/<typog-inspect\textvisiblespace id="\dots"/,\textbackslash\#</typog-inspect>\#p' \\ +% \> < jobname.log +% \end{codeexample} +% +% or +% +% \begin{codeexample} +% perl \= -ne '\= \$a=0 if /<\textbackslash/typog-inspect>/; \textbackslash \\ +% \>\> print \$\_ if \$a; \textbackslash \\ +% \>\> \$a=1 if /<typog-inspect\textvisiblespace id="\dots"/' \textbackslash \\ +% \> < jobname.log +% \end{codeexample} +% +% \item The companion program~\programname{typog-grep} is tailored to extract the information +% marked up by |typoginspect| and~|typoginspectpar| even if the environments are nested. +% +% We reproduce the complete manual page of \programname{typog-grep} in \Cref{app:typog-grep}. +% \end{itemize} +% +% \begin{tips} +% \begin{itemize}[nestedinspecialsection, notopsep] +% \item It may be necessary to run whatever \LaTeX~engine with a larger log-file line length, +% to prevent wrapped lines. With short lines the wannabe \acronym{XML} opening tags can +% get wrapped and thus become unrecognizable to dumb postprocessors. To avoid wrapped +% lines prepend +% +% \begin{codeexample} +% /usr/bin/env max\_print\_line=2147483647 +% \end{codeexample} +% +% to the command-line. The value~\(2147483647 = 2^{31} - 1\) effectively disables all line +% wrapping by \LaTeX. +% +% As both \command{pdflatex} and \command{lualatex} support changing their configuration on +% a by-call basis with option~\code{-cnf-line=\meta{STRING}} an alternative to the above +% example is to add +% +% \begin{codeexample} +% -cnf-line=max\_print\_line=2147483647 +% \end{codeexample} +% +% to the respective command-line. +% +% \item If more trace information is needed just add \cs{tracing\dots} calls right after +% \code{\string\begin\{typoginspect\}} +% or~\code{\string\begin\{typoginspectpar\}}.\specialsectionendhere +% \end{itemize} +% \end{tips} +% +% +% \phantomsection +% \paragraph{Investigating the badness of a paragraph.}\label{sec:investigating-paragraph-badness}\index{paragraph>badness} +% +% It is generally unnecessary to determine the \emph{exact} classification of a paragraph's +% badness~\cite[p.~97n]{knuth:1986}, though the curious user can switch on logging of +% \TeX's~line-break information with +% \cs{tracingparagraphs}|=1|\footnote{Reference~\citenum{wermuth:2016} provides an +% exceptionally detailed discussion of the output of \cs{tracingparagraphs}.} or simply use +% the \hyperref[syn:typoginspect]{typoginspect}~environment and check the suffixes +% +% \begingroup +% \centering +% |@@|\meta{breakpoint-number} |line| \meta{line-number}|.|\meta{suffix} +% \par +% \endgroup +% +% \noindent +% of each line in the paragraph, where for \meta{suffix} the following mapping +% holds~\cite[p.~99]{knuth:1986}: +% \begin{equation*} +% 0 \mapsto \text{very loose},\quad +% 1 \mapsto \text{loose},\quad +% 2 \mapsto \text{decent, and}\quad +% 3 \mapsto \text{tight}. +% \end{equation*} +% +% \begin{example} +% \let\oldsample=\sample +% \renewcommand*{\sample}[1]{\oldsample{\texttt{#1}}} +% \par\medskip +% \noindent +% |@@17: line 15.1- t=142289 s=93.58414 a=2.86073 -> @@16| +% +% \begin{enumerate}[noitemsep] +% \item The feasible breakpoint~\sample{@@} number~17 in the paragraph leads to +% \item \sample{line}~15, which is the loose~\sample{.1} last~\sample{-} line of the +% paragraph. +% \item Up to this breakpoint the paragraph has picked up total demerits~\sample{t} +% of~142289. +% \item The following two values only show up if\/ \(\cs{lastlinefit} \not= 0\): +% \begin{enumerate}[beginpenalty=10000, nosep] +% \item The shortfall~\sample{s} and +% \item glue~\sample{a} or~\sample{g}.\footnote{The author is unaware of any descriptions +% of \code{s}, \code{a}, or~\code{g}. The interested reader is referred to the source +% code, e.\,g., \filesystem{pdftex.web}; search for \code{print("\textvisiblespace s=")}. +% In the weaved documentation the first relevant section is~\S1851.} +% \end{enumerate} +% \item The best\footnote{\singlequotes{Best} means the minimum-demerits path in the graph of +% the feasible breakpoints, which has been constructed for the paragraph.} way to get +% here, i.\,e., |@@17| is via~\sample{->} breakpoint~\sample{@@}~16.\specialsectionendhere +% \end{enumerate} +% \end{example} +% +% \begin{note} +% When package~\packagename{microtype}'s font expansion feature jumps in the reports on +% \doublequotes{Loose \textbackslash hbox (badness \dots)} and \doublequotes{Tight +% \textbackslash hbox (badness \dots)} \shiftedmarginnote{All of our guillemets were raised +% by \milliem{\the\typogget{raiseguillemets}}.} contain the amount of shrinking or expansion +% as parenthesized values (units are thousandths of the current font's~em) like, e.\,g., +% +% \begin{codeexample} +% \textbackslash T1/erewhon-LF/m/n/9/@/@ (-13) \dots +% \end{codeexample} +% +% or +% +% \begin{codeexample} +% \textbackslash T1/erewhon-LF/m/n/9/@/@/10ls (+7) \dots +% \end{codeexample} +% +% An \sample{ls} appended to the font name specification indicates that +% \packagename{microtype}'s letter~spacing feature is active and changed the tracking by that +% many thousands on an em as indicated before~\sample{ls}. +% \end{note} +% +% +% \paragraph{Investigating page-breaks.}\index{page break} +% +% Use \code{\cs{tracingpages}=1} or the \hyperref[syn:typoginspect]{typoginspect}~environment +% to switch on tracing of \TeX's page-break +% information~\cite[p.~112n]{knuth:1986}.\footnote{See also the discussion of the \TeX~output +% routines by \propername{Solomon}~\cite{solomon:1990}.} +% +% The first time vertical material enters a new page, \TeX{} logs +% +% \begingroup\tt +% \centering +% \%\% goal height=\meta{text-height}, max depth=\meta{max-depth} \\ +% \par +% \endgroup +% +% \noindent +% where \meta{text-height} is the total height \TeX{} wants to achieve and~\meta{max-depth} is +% the maximum depth of the hbox in the last line of the page is allowed to have without +% considering \meta{text-height} to be exceeded. For example: +% +% \begingroup\tt +% \centering +% \%\% goal height=598.0, max depth=5.0 \\ +% \par +% \endgroup +% +% For every vertical breakpoint \TeX{} records +% +% \begingroup\tt +% \centering +% \% t=\meta{total-height} g=\meta{goal-height} b=\meta{badness} p=\meta{penalty} c=\meta{cost} +% \par +% \endgroup +% +% Here, \meta{total-height} and \meta{goal-height} are the current total height of the page and +% the current goal height to achieve with respect to this vertical breakpoint. +% +% The value of \meta{penalty} and \meta{cost} can be infinite, which would be indicated with an +% asterisk~\sample{\texttt{*}} instead of a numerical value. The best vertical breakpoint +% found so far on the current page is indicated by a trailing sharp-sign~\sample{\texttt{\#}}. +% +% \begin{example} +% \let\oldsample=\sample +% \renewcommand*{\sample}[1]{\oldsample{\texttt{#1}}} +% \begin{widecodeexample} +% \% t=351.3 plus 11.0 minus 1.0 g=553.9 b=10000 p=-300 c=100000\# +% \end{widecodeexample} +% +% \begin{enumerate}[noitemsep, notopsep] +% \item At this vertical breakpoint the total page height~\sample{t} is 351.3\,pt. We have +% picked up glue with 11\,pt~stretchability and~1\,pt~shrinkability along the way. +% +% \item The current goal height~\sample{g} is 553.9\,pt. If the initial goal height was +% 598\,pt we can deduce that some space for other vertical material was subtracted. +% +% \item The badness~\sample{b} of this vertical break is horrendous which is expected for the +% first lines on a page since breaks so early are rightfully considered infinitely bad. +% +% \item The penalty~\sample{p} at this point actually is a bonus. +% +% \item As the badness is 10000 the cost for a break is calculated +% to~100000.\specialsectionendhere +% \end{enumerate} +% \end{example} +% +% +% \subsection{Hyphenation}\label{sec:latex-hyphenation} +% \index{hyphenation} +% +% \TeX's and thus \LaTeX's hyphenation algorithm is highly sophisticated, yet the document +% author sometimes lacks convenient macros to solve seemingly trivial typographic tasks. For +% example, to hyphenate a compound~word connected by a hyphen. +% +% \DescribeMacro{\allowhyphenation} +% \TeX{} inhibits breaks of the component words by default. The following macro rectifies the +% problem. +% +% \begin{synopsis} +% \cs{allowhyphenation} +% \end{synopsis} +% +% Macro~\cs{allowhyphenation}\index{hyphenation>re-enable automatic} re-enables automatic +% hyphenation after \TeX{} has turned it off, for example, in the innocuous case of a +% hyphenated compound. +% +% The admittedly simple rules when \TeX{} auto-hyphenates and when not give rise to so many +% different, yet interesting cases that we devote \cref{tab:hyphens-and-hyphenations} to them. +% \begingroup +% \let\textfrac=\nativetextfraction +% The seemingly special cases shown there are not that uncommon, e.\,g., consider +% \singlequotes{\mbox{spin-\textfrac{1}{2}}} which is coded as |\mbox{spin-\textfrac{1}{2}}|. +% A line break between the text and the fraction would garble the term. +% \endgroup +% +% \begin{usecases} +% All examples from the bottom of \cref{tab:hyphens-and-hyphenations} on +% \cpageref{tab:hyphens-and-hyphenations}.~\visualpar +% +% Fix line breaks of index-entries in a narrow index: +% +% \begin{codeexample} +% Halbgruppe, Transformations\cs{allowhyphenation}\cs{mbox}\{-\}\cs{,}-\nolig*-\nolig*- +% \end{codeexample} +% +% \noindent +% The first part, \singlequotes{Transformations} is allowed to be hyphenated, but a break +% after the hyphen is prohibited as it results in a prowling em-dash at the beginning of the +% next line.~\visualpar +% +% Re-enable hyphenation when a macro decays into a \cs{hbox}: +% +% \begin{codeexample} +% Einselement\cs{allowhyphenation}\cs{rlap}\{,\}\cs{footnote}\{\dots\} +% \end{codeexample} +% +% where \cs{rlap} is equivalent to something like +% \code{\cs{makebox}[0pt]\{\#1\cs{hss}\}}.~\visualpar +% +% Use \cs{allowhyphenation} to turn on hyphenation of the first word of a paragraph as, +% e.\,g., in a narrow index or a \cs{marginpar}: +% +% \begin{codeexample} +% \cs{marginpar}\{\cs{allowhyphenation} Kontakttransformationen\} +% \end{codeexample} +% +% \noindent +% A common trick to sweet-talk \TeX{} into hyphenating the first word of a paragraph is to +% put \cs{hskip0pt} in front of it. +% \end{usecases} +% +% \begin{table}\small +% \centering +% \caption[Hyphens and automatic hyphenation] +% {\TeX{} offers plenty of possibilities to hyphenate a compound.~\visualpar We use +% the sample \singlequotes{hyphenated-compound} to show various code examples and +% the results that they produce. The parts are automatically hyphenated like this: +% \singlequotes{hyphenated}~\(\rightarrow\) \singlequotes{hy-phen-ated} and +% \singlequotes{compound}~\(\rightarrow\) \singlequotes{com-pound}.} +% \label{tab:hyphens-and-hyphenations} +% +% \begin{nofontexpansion} +% \newcommand*{\zbox}[1] +% {\hfuzz=\maxdimen +% \overfullrule=0pt +% \raisebox{\normalbaselineskip}{\parbox[t]{0pt}{\hspace{0pt}#1}}} +% +% \sbox{\listlabelbox}{hyphenated-compound} +% \begin{tabularx}{\linewidth}{@{}p{12em}l>{\fussy\RaggedRight}X@{}} +% \toprule +% \LaTeX-Code & \makebox[\wd\listlabelbox][l]{Result} & Note \\ +% \midrule +% \code{hyphenated-compound} & +% \zbox{hyphenated-compound} & +% Most frequently used code; the hyphen~\sample{\code{-}} expands to +% \code{\cs{discretionary}\mbox{\{-\}\{\}\{-\}}} rendering the parts un-breakable \\ +% +% \code{hyphenated\cs{mbox}\{-\}\%}\newline +% \code{compound} & +% \zbox{hyphenated\mbox{-}compound} & +% Suppress hyphenation with the \cs{mbox} in the compound \\ +% +% \code{\cs{mbox}\{hyphenated-\%}\newline +% \code{compound\}} & +% \zbox{\mbox{hyphenated-compound}} & +% Avoid line break and thus hyphenation \\ +% +% \midrule +% +% \code{hyphenated\cs{hyp}}\newline +% \code{compound} & +% \zbox{hyphenated\hyp compound} & +% Macro~\cs{hyp} defined in package +% \packagename{hyphenat}~\cite{package:hyphenat} \\ +% +% \addlinespace +% \midrule +% +% \code{hyphenated\%}\newline +% \cs{allowhyphenation}\code{-\%}\newline +% \code{compound} & +% \zbox{hyphenated\allowhyphenation-compound} & +% Macro~\cs{allowhyphenation} of package~\packagename{typog}; only unblock +% hyphenation of the first part \\ +% +% \code{hyphenated-\%}\newline +% \cs{allowhyphenation}\newline +% \code{compound} & +% \zbox{hyphenated-\allowhyphenation compound} & +% Macro~\cs{allowhyphenation} of package~\packagename{typog}; only unblock +% hyphenation of the second part \\ +% +% \code{hyphenated\%}\newline +% \cs{allowhyphenation}\newline +% \cs{mbox}\code{\{-\}\%}\newline +% \code{compound} & +% \zbox{hyphenated\allowhyphenation\mbox{-}compound} & +% Macro~\cs{allowhyphenation} of package~\packagename{typog}; hyphenate first +% part and keep the original hyphen unbreakable \\ +% +% \code{hyphenated\%}\newline +% \cs{allowhyphenation}\code{-\%}\newline +% \cs{allowhyphenation}\newline +% \code{compound} & +% \zbox{hyphenated\allowhyphenation-\allowhyphenation compound} & +% Macro~\cs{allowhyphenation} of package~\packagename{typog}; hyphenate both +% parts, similar to \cs{hyp} shown above \\ +% +% \addlinespace +% \bottomrule +% \end{tabularx} +% \end{nofontexpansion} +% \end{table} +% +% \noindent +% Whenever using \cs{-}, the short-hand form of \cs{discretionary\{-\}\{\}\{\}}, authors +% writing in a foreign language should reconsider whether it really beats \cs{hyphenation} or +% \cs{babelhyphenation}\footnote{\cs{babelhyphenation} is the multi-lingual extension of \TeX's +% \cs{hyphenation} and it is defined in package~\packagename{babel}~\cite{package:babel}}. in +% the particular situation. However, sometimes \cs{-} actually \emph{is} the way to go. +% +% Let us assume we mark up proper names with +% +% \begin{codeexample} +% \cs{DeclareRobustCommand}*\= \{\cs{propername}\}[1] \\ +% \> \{\cs{mbox}\{\cs{textsc}\{\#1\}\}\} +% \end{codeexample} +% +% \noindent +% and we want to have hyphenatable \foreignphrase{\doublequotes{\propername{Abel}sche Gruppe}} +% or \foreignphrase{\doublequotes{\propername{Euklid}ischer Vektorraum}} without dropping the +% markup. To that end we define commands that insert a hyphenation point at the right place: +% +% \begin{codeexample} +% \cs{newcommand*}\= \{\cs{abelsche}\} \\ +% \> \{\cs{propername}\{Abel\}\cs{-}sche\} \\ +% \cs{newcommand*}\> \{\cs{euklidischer}\} \\ +% \> \{\cs{propername}\{Euklid\}i\cs{-}scher\} +% \end{codeexample} +% +% \noindent +% which are impossible to encode with \cs{hyphenation} or~\cs{babelhyphenation} as these expect +% only letters and dashes as their arguments with spaces separating the words. +% +% \begin{tip}[Typewriter Fonts] +% Sometimes it is desired to get a hyphenatable typewriter font. \LaTeX{} suppresses any +% hyphenation for fonts in \cs{ttfamily} by un-defining their \cs{hyphenchar}s. If these are +% reassigned, the usual hyphenation occurs again. +% +% So, a fictitious macro `\cs{code}' to typeset short pieces of code could look like this: +% +% \begin{codeexample} +% \cs{newcommand*}\= \{\cs{code}\}[1] \\ +% \> \{\{\= \cs{ttfamily} \\ +% \> \> \cs{hyphenchar}\cs{font}=`\cs{-}\cs{relax} \#1\}\}\specialsectionendhere +% \end{codeexample} +% \end{tip} +% +% \DescribeMacro{\breakpoint} +% \DescribeMacro{\breakpoint*} +% The empty discretionary construct~\cite[p.~95]{knuth:1986}, \cs{discretionary\{\}\{\}\{\}}, +% is so helpful that it deserves its own macro --~with a descriptive name. +% +% \begin{synopsis} +% \cs{breakpoint} \\ +% \cs{breakpoint*} +% \end{synopsis} +% +% The starred form inserts an empty discretionary,\index{hyphenation>empty discretionary} which +% disables automatic hyphenation. The unstarred form inserts an empty discretionary and +% immediately re-enables automatic hyphenation. +% +% The difference between \cs{breakpoint} and the \LaTeX{} macro~\cs{allowbreak} is not only +% that the former has a starred form, but the penalty associated with \cs{breakpoint} is the +% current\footnote{At this point in the document +% \code{\string\exhyphenpenalty=\the\exhyphenpenalty} holds.} \cs{exhyphenpenalty}, whereas +% \cs{allowbreak} statically assigns a zero~penalty. +% +% \begin{usecase} +% Prefixes that end in a hyphen inside of a pair of parenthesis: +% +% \begin{codeexample} +% \cs{mbox}\{(pre-)\}\cs{breakpoint*} \cs{propername}\{Hilbert\} space\specialsectionendhere +% \end{codeexample} +% \end{usecase} +% +% \DescribeEnv{hyphenmin} +% \sinceversion{Since v0.3} +% Set the values of \cs{lefthyphenmin} and \cs{righthyphenmin} confined to an environment. +% +% \begin{synopsis}\label{syn:hyphenmin} +% \cs{begin}|{hyphenmin}|\oarg{left-hyphen-minimum}\marg{hyphen-minimum} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{hyphenmin}| +% \end{synopsis} +% +% Without optional argument |hyphenmin| sets both \cs{lefthyphenmin} and \cs{righthyphenmin} to +% \meta{hyphen-minimum}. When called with an optional argument it sets \cs{lefthyphenmin} to +% \meta{left-hyphen-minimum} and \cs{righthyphenmin} to \meta{hyphen-minimum}.\footnote{The +% current values for \cs{lefthyphenmin} and \cs{righthyphenmin} in this document +% are~\the\lefthyphenmin{} and~\the\righthyphenmin, respectively.} +% +% \begin{usecase} +% If the hyphen minimums were \emph{increased} e.\,g.~in the preamble: Reduce the hyphen +% minimum in the index or other multi-column environments with narrow lines to regain +% hyphenation possibilities.~\visualpar Use a large \meta{hyphen-minimum} to disable +% hyphenation. +% \end{usecase} +% +% +% \subsection{Disable\kernedslash Break Ligatures}\label{sec:break-ligatures} +% \index{ligature} +% +% \DescribeMacro{\nolig*} +% Break a ligature without introducing a hyphenation opportunity. +% +% \begin{synopsis}\label{syn:nolig-star} +% \cs{nolig*}\oarg{kerning} +% \end{synopsis} +% +% Inserting \cs{nolig*} disables a ligature at the given point by a kern. Set the size of the +% kern\index{kerning>ligature} with \hyperref[item:ligaturekern]{|ligaturekern|} or override +% this value with \meta{kerning} as thousandths of the current font's~em. +% +% \begin{usecases} +% \cs{nolig*} can be useful in headings, where additional hyphenation points are +% unwelcome.~\visualpar In fonts with an overly rich set of ligatures \cs{nolig*} offers a +% straightforward means to suppress unwanted ligatures at non-hyphenatable +% positions.~\visualpar Rectify the appearance of a pseudo ligature, i.\,e., two adjacent +% characters that look like a ligature, but actually are not. +% \end{usecases} +% +% \noindent +% \DescribeMacro{\nolig} +% Break a ligature and introduce a hyphenation opportunity. +% +% \begin{synopsis}\label{syn:nolig} +% \cs{nolig}\oarg{kerning} +% \end{synopsis} +% +% Inserting \cs{nolig} disables a ligature at the given point as \cs{nolig*} does \emph{and} +% introduces a hyphenation opportunity with +% penalty~\hyperref[item:breakpenalty]{|breakpenalty|}. +% +% \begin{important}[\packagename{hyperref} bookmarks]\index{hyperref=\packagename{hyperref} (package)} +% If a \cs{nolig} --~whether starred or un-starred~-- occurs in an argument that is processed +% with package~\packagename{hyperref} for inclusion into the document's +% \acronym{PDF}-bookmarks\index{PDF=\acronym{PDF}}\index{bookmark} an additional argument is +% necessary to parse the macro. This argument either is \cs{relax} or~the empty +% group~(\code{\{\}}). +% +% \begin{synopsis} +% \begin{tabbing} +% \cs{nolig*}\oarg{kerning}\cs{relax}\qquad\= \cs{nolig}\oarg{kerning}\cs{relax} \\ +% \cs{nolig*}\oarg{kerning}\code{\{\}}\> \cs{nolig}\oarg{kerning}\code{\{\}} +% \end{tabbing} +% \end{synopsis} +% +% The prototypical places where this processing-for-\acronym{PDF}-bookmarks happens are the +% sectioning macros, e.\,g., \cs{chapter}, \cs{section}, \cs{subsection},~etc. +% +% \LaTeX{} will bail out with an error if the extra argument is not passed to \cs{nolig} in +% these situations. +% +% Alternatively use \cs{texorpdfstring}~\cite[Sec.~4.1.2, p.~22]{package:hyperref}. +% \end{important} +% +% \begin{usecases} +% \cs{nolig} can be used with just about any ligature that needs to be split into its +% parts.~\visualpar It also has proven beneficial in separating pairs of characters that are +% kerned to tightly (e.\,g.~the \sample{ij}, as in bi\itcorr{2}jection, which is particularly +% distractive here, for it occurs at the boundary of two syllables). +% \end{usecases} +% +% +% \subsection{Manual Italic Correction}\label{sec:manual-italic-correction}\label{italic correction} +% +% \DescribeMacro{\itcorr} +% \DescribeMacro{\itcorr*} +% The italic correction offered by \TeX{} or \LaTeX{} sometimes needs a helping hand. +% +% \begin{synopsis}\label{syn:itcorr} +% \cs{itcorr}\marg{strength} \\ +% \cs{itcorr*}\marg{strength} +% \end{synopsis} +% +% In text mode macro~\cs{itcorr} inserts a kern whose width is proportional to \cs{fontdim1}, +% which is the font's italic correction. If \cs{fontdim1} happens to be zero (e.\,g.~for an +% upright font), \cs{itcorr} uses the value set with +% \hyperref[item:textitalicscorrection]{\code{textitalicscorrection}} instead of \cs{fontdim1}. +% The starred version always uses +% \hyperref[item:textitalicscorrection]{\code{textitalicscorrection}}. In math mode +% macro~\cs{itcorr} uses the value set with +% \hyperref[item:mathitalicscorrection]{\code{mathitalicscorrection}}\footnote{Separate +% adjustments may be desirable if the math font's italics have markedly different slants.} in +% both the starred and the unstarred form. +% +% Typical slant angles of serif italics fonts range from 8\textdegree{} to~18\textdegree{} and +% thus values for |textitalicscorrection| from .14 to~.32. Note: \meta{strength} can be +% negative and fractional \meta{strength}s are allowed. +% +% \begin{usecases} +% Stronger or weaker correction than |\/|.~\visualpar Correct a non-slanted or non-italicized +% font.~\visualpar Negative correction at the left-hand side\footnote{Groff has the machinery +% for left-italic-correction. Its font-metrics files support per glyph +% left-italic-correction values and users can access them conveniently via~\sample*{\cs{,}}.} +% of italics, i.\,e., compensate \doublequotes{shift-to-the-right effect} of +% italics.~\visualpar Positive correction at the left-hand side of italics, e.\,g., an +% opening parenthesis or square bracket followed by an +% italic~\sample{\itshape\itcorr{8}f\itcorr{7}} (before:~8, after:~7) or +% \sample{\itshape\itcorr{4}y\itcorr{1}} (before:~4, after:~1) reaching far to the left below +% the baseline. +% \end{usecases} +% +% +% \paragraph{The \meta{strength} parameter explained.} +% +% \TeX{} records the slant angle~\(\alpha\) of a font in \cs{fontdim1} as \(\mbox{1\,pt} \times +% \sin\alpha\). Rephrased the formula means: \emph{How much horizontal space is required for a +% letter slanted with ~\(\alpha\) that is 1\,pt high?} So, \cs{itcorr}\marg{strength} +% calculates +% \begin{displaymath} +% \meta{strength} \times \mbox{1\,pt} \times \sin\alpha. +% \end{displaymath} +% +% A well-chosen \meta{strength} should be the absolute minimum value which avoids that the +% glyphs typeset in italics collide with other --~usually non-italics~-- letters or symbols +% unless this disturbs the consistency of the overall tracking. +% +% Correction of the right-hand side and \mbox{\(\alpha > 0\)}: A reasonable first guess of +% \meta{strength} is the highest point where the rightmost part of the letter would touch a +% rule angled at \(\alpha\) with respect to the baseline. The correction of the left-hand side +% and \mbox{\(\alpha > 0\)} considers the lowest \singlequotes{touching} point below the +% baseline on the left-hand side of the letter. Negative values of \(\alpha\) exchange the +% reference points. +% +% \iffalse +%<*slantangle> +prologues := 3; +truecorners := 1; +linecap := butt; + +input TEX; +TEXPRE("%&latex" & char(10) & "\documentclass{article}\begin{document}"); +TEXPOST("\end{document}"); + +string roman_font; +roman_font := "pplr8r"; % URW Palladio L - Roman + +string italics_font; +italics_font := "pplri8r"; % URW Palladio L - Italic + +u := 360; + +font_scale := 10; + +pair loc[]; +loc[1] := .2[origin, (u, 0)]; +loc[2] := .5[origin, (u, 0)]; +loc[3] := .8[origin, (u, 0)]; + +picture letter_H; +letter_H := thelabel.top("H" infont italics_font scaled font_scale, loc[1]); + +picture letter_L; +letter_L := thelabel.top("L" infont italics_font scaled font_scale, loc[2]); + +picture letter_a; +letter_a := thelabel.top("a" infont italics_font scaled font_scale, loc[3]); + +path slant_angle; +slant_angle := lrcorner letter_H + (14, 0) -- lrcorner letter_H + (-6, 0) -- urcorner letter_H + (3.5, 0); + +pair base_point; +base_point := (xpart point 2 of slant_angle, ypart point 0 of slant_angle) ; + +pair angle_label; +angle_label := point 2 of slant_angle + (0, -12); + + +beginfig(1); + draw letter_H; + draw slant_angle; + draw point 2 of slant_angle -- base_point dashed evenly; + draw point 1 of slant_angle -- base_point withpen pencircle scaled 2pt; + + label.rt(TEX("$\alpha$"), angle_label); + + draw letter_L; + draw slant_angle shifted (xpart lrcorner letter_L - xpart lrcorner letter_H + 2, 0); + + draw letter_a; + draw slant_angle shifted (xpart lrcorner letter_a - xpart lrcorner letter_H - 3, 0); +endfig; +end +%</slantangle> +% \fi +% +% \Cref{fig:slant-angle} shows how \meta{strength} and \(\alpha\) are related. Moreover, it +% demonstrates how intricate italics correction is. +% +% \begin{figure} +% \centering +% \includegraphics{slant-angle-1.mps} +% \caption[Some letters of an italics font.] +% {Some letters of an italics font. We use the capital~\sample{H} to measure the +% angle~\(\alpha\) between the plumb-line (drawn dashed) and a tangent to the +% rightmost parts of the glyph. The length of the plumb-line is proportional to +% \meta{strength} and the short, thick part of the baseline symbolizes the resulting +% italics correction.~\visualpar The middle example, the capital~\sample{L}, shares +% \(\alpha\) with \sample{H} but obviously needs a far smaller \meta{strength} or +% even no correction at all.~\visualpar The \sample{a} at the right-hand side is an +% example of why \TeX{} allows to assign an italic~correction to each individual +% character of a font. Not only features the lowercase~\sample{a} a +% larger~\(\alpha\) --~despite being a member of the same font~-- but its serif adds +% as much to the width as the slanted stem.\label{fig:slant-angle}} +% \vspace{-3\baselineskip} +% \llap{\parbox{\marginparwidth} +% {\marginnoteformat +% We center the last lines of each figure and table caption with the help of +% \hyperref[syn:lastlinecenteredpar]{\code{lastlinecenteredpar}}.} +% \hspace*{\marginparsep}} +% \end{figure} +% +% +% \subsection{Apply Extra Kerning}\label{sec:extra-kerning} +% \index{kerning>extra} +% +% Package \packagename{typog} supplies two sets of macros to kern some of the punctuation +% symbols. One is for forward slashes the other, more extensive one, for hyphens. +% +% +% \subsubsection{Slash}\label{sec:slash-with-kern} +% \index{kerning>forward slash} +% +% \DescribeMacro{\kernedslash} +% \DescribeMacro{\kernedslash*} +% Macro~\cs{kernedslash} expands to a forward slash~(\sample{\itcorr{3}\char`/}) with some +% extra space around it. +% +% \begin{synopsis}\label{syn:kernedslash} +% \cs{kernedslash} \\ +% \cs{kernedslash*} +% \end{synopsis} +% +% The starred form is unbreakable, the non-starred version introduces a break point with +% penalty~\hyperref[item:breakpenalty]{|breakpenalty|} after the slash. Configure the kerning +% around the slash with~\hyperref[item:slashkern]{|slashkern|}. +% +% If the word following the slash should not be hyphenated append \cs{nobreak} after +% \cs{kernedslash*}. +% +% \begin{usecases} +% \cs{kernedslash} improves the appearance of pairs of years typeset in lining numerals: +% \meta{year\textsubscript{1}}/\meta{year\textsubscript{2}}.~\visualpar The macro has proven +% helpful in many cases where the right hand side of the slash starts with a capital as, for +% example, \meta{city}/\meta{state-code} (\acronym{US}-specific) or +% \meta{anything}/\meta{noun} (any language that capitalizes \meta{noun}). +% \end{usecases} +% +% +% \subsubsection{Hyphen}\label{sec:hyphen-with-kern} +% \index{kerning>hyphen} +% +% \DescribeMacro{\kernedhyphen} +% \DescribeMacro{\kernedhyphen*} +% Macros \cs{kernedhyphen*} and \cs{kernedhyphen} expand to a hyphen~(\sample{-}) with given +% kerning to its left and to its right. +% +% \begin{synopsis}\label{syn:kernedhyphen} +% \cs{kernedhyphen}\oarg{raise}\marg{left-kerning}\marg{right-kerning} \\ +% \cs{kernedhyphen*}\oarg{raise}\marg{left-kerning}\marg{right-kerning} +% \end{synopsis} +% +% Typeset an unbreakable hyphen with \cs{kernedhyphen*} or a breakable hyphen (like \cs{hyp} of +% package \packagename{hyphenat}~\cite{package:hyphenat}) with \cs{kernedhyphen} and apply some +% kerning to left and to the right of it. The values \meta{left-kerning} and +% \meta{right-kerning} are multiplied with one thousandth of the current font's~em to get the +% size of the kern. +% +% The optional argument~\meta{raise}, also given in \nativetextfraction{1}{1000}\,em, allows to +% adjust the height of the hyphen similar to the macros described in +% \cref{sec:raise-characters}. In text mode the special argument~\sample{|*|} for \meta{raise} +% transfers the current value of \hyperref[item:raisecapitalhyphen]{\code{raisecapitalhyphen}}. +% The default for \meta{raise} is zero. +% +% \DescribeMacro{\leftkernedhyphen} +% \DescribeMacro{\leftkernedhyphen*} +% \DescribeMacro{\rightkernedhyphen} +% \DescribeMacro{\rightkernedhyphen*} +% We also define specialized versions for kerning on the left-hand side or the right-hand side +% only. These macros work like their two-argument counterparts and set the appropriate other +% kerning to zero. +% +% \begin{synopsis}\label{syn:leftkernedhyphen}\label{syn:rightkernedhyphen} +% \cs{leftkernedhyphen}\oarg{raise}\marg{left-kerning} \\ +% \cs{leftkernedhyphen*}\oarg{raise}\marg{left-kerning} \\ +% \cs{rightkernedhyphen}\oarg{raise}\marg{right-kerning} \\ +% \cs{rightkernedhyphen*}\oarg{raise}\marg{right-kerning} +% \end{synopsis} +% +% \begin{usecases} +% Composites in the form \meta{math}-\meta{noun} in languages where nouns are +% capitalized.~\visualpar Composites where one or both sides of the hyphen are typeset in +% different fonts, like, \meta{small-caps}-\meta{roman}. +% \end{usecases} +% +% +% \subsection{Raise Selected Characters}\label{sec:raise-characters} +% \index{raised character} +% +% Usually all hyphens and dashes of a font are designed to join lowercase letters. This holds +% also true for most of our \cs{labelitem}\meta{N} markers, bullets, stars, and even fancy +% dingbats. If these hyphens and dashes connect uppercase letters (or lining numerals) they +% sometimes appear to low; they disrespect the glyphs' symmetry axis. A similar situation +% arises if |itemize|~list markers precede an uppercase letter, a lining numeral, or a big +% mathematical operator. +% +% We introduce a set of macros for the most common cases that allow typsetting these characters +% at a user definable, adjusted height above the baseline. Users can base their own +% definitions of raised characters on their associated dimensions.\footnote{Also compare with +% Ex.~12 in Ref.~\citenum{wermuth:2023} for an attempt to automate vertical alignment.} +% +% \begin{caution} +% The height adjustment disables a font's built-in kerning. +% \end{caution} +% +% \noindent +% General note for all raised hyphen-like macros: Prefer the starred version if applied in +% front of any punctuation. +% +% +% \subsubsection{Capital Hyphen}\label{sec:capital-hyphen} +% \index{raised character>hyphen} +% +% \DescribeMacro{\capitalhyphen} +% \DescribeMacro{\capitalhyphen*} +% In many fonts the height of the hyphen character~\sample{-} above the baseline is optimized +% for lowercase letters. In languages that capitalize their nouns as, e.\,g., German, this may +% be too low for compounds involving capitals. +% +% \begin{synopsis}\label{syn:capitalhyphen} +% \cs{capitalhyphen} \\ +% \cs{capitalhyphen*} +% \end{synopsis} +% +% The unstarred version introduces a hyphenation opportunity right after the hyphen character +% (with penalty~\hyperref[item:breakpenalty]{|breakpenalty|}) whereas the starred version does +% not. The actual amount the hyphen gets raised in \cs{capitalhyphen} is determined by +% \hyperref[item:raisecapitalhyphen]{|raisecapitalhyphen|}. +% +% \begin{usecases} +% In languages that capitalize their nouns, the typical use-case is between an +% \meta{ab\-bre\-vi\-a\-tion} and a \meta{noun} when \meta{ab\-bre\-vi\-a\-tion} is a string +% of uppercase letters. The same holds true for a connection of an uppercase variable in +% mathematical mode and a \meta{noun} starting with a capital letter.~\visualpar Abbreviated +% compound first names (e.\,g., A.\capitalhyphen* M.~Legendre) can be joined with the starred +% version.~\visualpar Also, the starred form is suited for \acronym{ISO~8601}-formatted dates +% if they are composed with lining-style numerals. +% \end{usecases} +% +% +% \subsubsection{Capital Dash}\label{sec:capital-dash} +% \index{raised character>en-dash} +% +% \DescribeMacro{\capitalendash} +% \DescribeMacro{\capitalendash*} +% \DescribeMacro{\capitaldash} +% \DescribeMacro{\capitaldash*} +% The situation of the en-dash~\sample{--} is almost identical to the one of the hyphen +% character~\sample{-} described in the previous section or the number dash to be introduced in +% the next section. +% +% \begin{synopsis}\label{syn:capitalendash}\label{syn:capitaldash} +% \begin{tabbing} +% \cs{capitalendash}\qquad\= \cs{capitaldash} (alias) \\ +% \cs{capitalendash*} \> \cs{capitaldash*} (alias) +% \end{tabbing} +% \end{synopsis} +% +% The unstarred version introduces a hyphenation opportunity right after the dash (with +% penalty~\hyperref[item:breakpenalty]{|breakpenalty|}) whereas the starred version does not. +% The actual amount the hyphen gets raised in \cs{capitaldash} is determined by +% \hyperref[item:raisecapitalhyphen]{|raisecapitaldash|}. +% +% \begin{usecases} +% Letter ranges as used in the title of an index.~\visualpar Any mixed letter-digit ranges +% (of capital letters and lining-style numerals) as in e.\,g., Sec.~B\capitaldash* 2. +% \end{usecases} +% +% \noindent +% \DescribeMacro{\capitalemdash} +% \DescribeMacro{\capitalemdash*} +% For completeness we also introduce a raised em-dash~\sample{---}. It behaves just like its +% en-dash sibling. +% +% \begin{synopsis}\label{syn:capitalemdash} +% \cs{capitalemdash} \\ +% \cs{capitalemdash*} +% \end{synopsis} +% +% \begin{usecases} +% Item symbols in \code{itemized} lists if the item text starts with an uppercase +% letter.~\visualpar Theorem headings, like, e.\,g., \mbox{Definition 6.2 \capitalemdash{} +% \textsc{Lie} Algebra}. +% \end{usecases} +% +% +% \subsubsection{Number Dash (Figure Dash)}\label{sec:number-dash} +% \index{raised character>number dash} +% +% \DescribeMacro{\figuredash} +% \DescribeMacro{\figuredash*} +% The en-dash often gets used as separator for numerical ranges. In most fonts it has the +% correct height above baseline for oldstyle numerals, +% e.\,g.~\oldstylenums{12}--\oldstylenums{34}--\oldstylenums{56}--\oldstylenums{78}, but with +% lining numerals --~depending on the font~-- it may look like it suffers from +% \doublequotes{broken suspenders}: +% 12\textendash34\textendash56\textendash78.\marginnote{\cs{figuredash} yields +% 12\figuredash34\figuredash56\figuredash78 for sans-serif and {\rm +% 12\figuredash34\figuredash56\figuredash78} for the roman typeface.} The situation is similar +% to \cs{capitaldash} and \cs{capitalhyphen} discussed in +% \cref{sec:capital-hyphen,sec:capital-dash}. +% +% \begin{synopsis}\label{syn:figuredash} +% \cs{figuredash} \\ +% \cs{figuredash*} +% \end{synopsis} +% +% The unstarred version introduces a hyphenation opportunity right after the en-dash with +% penalty~\hyperref[item:breakpenalty]{|breakpenalty|} whereas the starred version does not. +% The actual amount the en-dash gets raised in \cs{figuredash} is determined by +% \hyperref[item:raisefiguredash]{|raisefiguredash|}. +% +% Values of .05em to .1em are typical for fonts that need this kind of correction and~.1em is a +% good starting point. \Cref{tab:raisefiguredash} summarizes some findings. +% +% \begin{table} +% \centering +% \caption[Suggested raise amounts for \cs{figuredash}]% +% {Suggested values for raising the en-dash between lining numerals of some selected +% fonts.} +% \label{tab:raisefiguredash} +% +% \begin{tabfigures} +% \begin{tabular}{@{}l>{\RaggedRight}p{20em}@{}} +% \toprule +% Raise & Font Name \\ +% em & \\ +% \midrule +% 0 & Alegreya\index{font>Alegreya}, Arvo\index{font>Arvo}, +% Bitter\index{font>Bitter}, Clara\index{font>Clara}, +% \acronym{EB}~Garamond\index{font>EB Garamond=\acronym{EB} Garamond}, +% Gentium\index{font>Gentium}, +% Ibarra Real Nova\index{font>Ibarra Real Nova}, +% \acronym{Inria}~Serif\index{font>Inria Serif=\acronym{Inria} Serif}, +% Libertine\index{font>Libertine}, Libertinus\index{font>Libertinus}, +% Merriweather\index{font>Merriweather}, +% \acronym{PT}~Serif\index{font>PT Serif=\acronym{PT} Serif}, +% Roboto Slab\index{font>Roboto Slab}, Spectral\index{font>Spectral}, +% \acronym{STIX}\index{font>STIX=\acronym{STIX}}, and many more \\ +% .05 & fbb\index{font>fbb}, Source Serif Pro\index{font>Source Serif Pro} \\ +% .0667 & Libre Baskerville\index{font>Libre Baskerville}, +% Crimson Pro\index{font>Crimson Pro}, +% Erewhon\index{font>Erewhon}, Droid Serif\index{font>Droid Serif} \\ +% .1 & \acronym{GFS}~Artemisia\index{font>GFS Artemisia=\acronym{GFS} Artemisia}, +% Libre Caslon\index{font>Libre Caslon}, +% Coelacanth\index{font>Coelacanth}, Crimson Pro\index{font>Crimson Pro}, +% Crimson Text\index{font>Crimson Text}, +% \TeX{} Gyre~Pagella\index{font>TeX Gyre Pagella=\TeX{} Gyre Pagella}, +% Quattrocento\index{font>}, +% \acronym{TX}~Fonts\index{font>TX Fonts=\acronym{TX} Fonts}, +% \acronym{ADF}~Venturis\index{font>ADF Venturis=\acronym{ADF} Venturis}, +% and many more \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{table} +% +% Other macros may be redefined with \cs{figuredash} for a consistent appearance of the copy, +% like, for example, \cs{citedash} (package~\packagename{cite}~\cite{package:cite}), or +% \cs{crefrangeconjunction} (package~\packagename{cleveref}~\cite{package:cleveref}). +% +% \begin{usecase} +% The key customers of \cs{figuredash} are the |PAGES|~entries of bibliography +% databases.~\visualpar In an index generated with \command{makeindex} the range +% delimiter~\code{delim\_r} is a candidate for \cs{figuredash*}. +% \end{usecase} +% +% +% \subsubsection[Multiplication Sign]% +% {Multiplication Sign -- Times~\sample{\texttimes}}\label{sec:mult-sign} +% \index{raised character>multiplication sign} +% +% \DescribeMacro{\capitaltimes} +% The \cs{capitaltimes}~macro is a variation of the +% \hyperref[syn:capitalhyphen]{\cs{capitalhyphen}}~theme. +% +% \begin{synopsis}\label{syn:capitaltimes} +% \cs{capitaltimes} +% \end{synopsis} +% +% In text mode it expands to an appropriately raised \cs{texttimes}, and in math~mode to a +% raised \cs{times} binary~operator, where +% \hyperref[item:raisecapitaltimes]{|raisecapitaltimes|} determines the amount of +% upward-shifting applied; it never inserts any break points. +% +% \begin{usecase} +% Prime use are two- or higher-dimensional shape specifications with lining numerals or +% uppercase letters in mathematical mode as, for example, matrix or tensor sizes. +% \end{usecase} +% +% +% \subsubsection{Guillemets}\label{sec:guillemets} +% \index{raised character>guillemets} +% +% Another possible typographic problem this package addresses is that both sets --~single and +% double quotes~-- of guillemets may suffer from a too small distance to the baseline. +% +% For the implementation \packagename{typog} relies on the T1\footnote{Font +% encoding~T1\index{font>encoding} can be forced via \cs{usepackage}|[T1]\{fontenc\}| in the +% document preamble.}~font encoding not on package~\packagename{babel}. +% +% +% \paragraph{Lowercase Versions.} +% \DescribeMacro{\singleguillemetleft} +% \DescribeMacro{\singleguillemetright} +% \DescribeMacro{\doubleguillemetleft} +% \DescribeMacro{\doubleguillemetright} +% \begin{synopsis}\label{syn:singleguillemetleft}\label{syn:doubleguillemetleft} +% \begin{tabbing} +% \cs{singleguillemetleft}\qquad\= \cs{singleguillemetright} \\ +% \cs{doubleguillemetleft}\> \cs{doubleguillemetright} +% \end{tabbing} +% \end{synopsis} +% +% \noindent +% For consistency and easy accessibility we define height-adjusted left and right single +% guillemets as \cs{singleguillemetleft} and \cs{singleguillemetright}; double guillemets are +% available with \cs{doubleguillemetleft} and \cs{doubleguillemetright}. Their heights above +% the baseline are collectively adjusted with +% \hyperref[item:raiseguillemets]{|raiseguillemets|}. +% +% +% \paragraph{Uppercase Versions.} +% +% \DescribeMacro{\Singleguillemetleft} +% \DescribeMacro{\Singleguillemetright} +% \DescribeMacro{\Doubleguillemetleft} +% \DescribeMacro{\Doubleguillemetright} +% \begin{synopsis}\label{syn:Singleguillemetleft}\label{syn:Doubleguillemetleft} +% \begin{tabbing} +% \cs{Singleguillemetleft}\qquad\= \cs{Singleguillemetright} \\ +% \cs{Doubleguillemetleft}\> \cs{Doubleguillemetright} +% \end{tabbing} +% \end{synopsis} +% +% \noindent +% The companion set of single, double, left, and right quotes corrected for uppercase letters +% or lining numerals is \cs{Singleguillemetleft} and \cs{Singleguillemetright} and +% \cs{Doubleguillemetleft} and \cs{doubleguillemetright}. Mnemonic: These macros start with an +% uppercase letter. Their height above the baseline is adjusted with +% \hyperref[item:raisecapitalguillemets]{|raisecapitalguillemets|}. Values of .025em to .075em +% are typical for fonts that need this kind of correction. \Cref{tab:raiseguillemets} +% summarizes some findings. +% +% \begin{table} +% \centering +% \caption[Suggested raise amounts for guillemets]% +% {Suggested values for raising guillemets of some selected fonts.} +% \label{tab:raiseguillemets} +% +% \begin{tabfigures} +% \begin{tabular}{@{}cc>{\RaggedRight}p{20em}@{}} +% \toprule +% \multicolumn{2}{@{}c}{Raise} & Font Name \\ +% Lowercase & Uppercase & \\ +% em & em & \\ +% \midrule +% 0 & .05\hphantom{00} & +% \acronym{EB}~Garamond\index{font>EB Garamond=\acronym{EB} Garamond}, +% Libertinus\index{font>Libertinus}, +% Merriweather\index{font>Merriweather}, and many more \\ +% .025 & .05\hphantom{00} & Gentium\index{font>Gentium} \\ +% .04\hphantom{0} & .0667 & +% \acronym{ADF}~Baskervald\index{font>ADF Baskervald=\acronym{ADF} Baskervald} \\ +% .05\hphantom{0} & .0625 & +% \acronym{GFS}~Artemisia\index{font>GFS Artemisia=\acronym{GFS} Artemisia}, +% \acronym{GFS}~Didot\index{font>GFS Didot=\acronym{GFS} Didot} \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{table} +% +% \begin{tip} +% Define shorthand macros that simplify the application of guillemets, like, e.\,g., +% +% \begin{codeexample} +% \cs{newcommand*}\= \{\= \cs{singlequotes}\}[1] \\ +% \> \{\cs{singleguillemetright} \#1\% \\ +% \> \> \cs{singleguillemetleft}\} \\ +% \cs{let}\cs{sq}=\cs{singlequotes} +% \end{codeexample} +% +% and similar definitions for \cs{Singlequotes}, \cs{doublequotes}, and~\cs{Doublequotes}. +% +% Users working according to the French typesetting conventions will want to add extra +% spacing between the guillemets and the macro argument already in these macros. +% \end{tip} +% +% \noindent +% Whether the guillemets must be height-adjusted for lowercase letters depends on the font. +% Careful judgment at various magnifications with a variety of samples is necessary. +% +% +% \paragraph{Interaction with package~\packagename{csquotes}.} +% \index{csquotes=\packagename{csquotes} (package)} +% +% The users of package~\packagename{csquotes} +% can hook up the guillemets as defined by \packagename{typog} +% with \cs{DeclareQuoteStyle}: +% +% \begin{codeexample} +% 12\=\kill +% \cs{DeclareQuoteStyle}\{typog-guillemets\} \\ +% \> \{\cs{doubleguillemetright}\}\%\qquad\= opening outer mark \\ +% \> \{\cs{doubleguillemetleft}\}\% \> closing outer mark \\ +% \> \{\cs{singleguillemetright}\}\% \> opening inner mark \\ +% \> \{\cs{singleguillemetleft}\}\% \> closing inner mark +% \end{codeexample} +% +% \noindent +% As always, the influence of package~\packagename{babel} on \packagename{csquotes} has to be +% put into consideration. See Sec.~8 of the \packagename{csquotes}~manual for a description of +% its configuration possibilities. +% +% \begin{usecase} +% All-capital words as for example acronyms put in guillemets that are raised somewhat almost +% always look better, whether using the French typographic convention (guillemets pointing +% outward plus some extra kerning) or the other way round (guillemets pointing inward). +% \end{usecase} +% +% \begin{futuredirection} +% A correction in the other direction, i.\,e., lowering certain characters may also be +% desirable, to visually align them to the surrounding copy. Parentheses and in particular +% square brackets around all-lowercase text come into mind. +% \end{futuredirection} +% +% +% \subsection[Align Last Line] +% {Align Last Line of a Paragraph}\label{sec:align-last-line} +% \index{paragraph>align last line} +% +% The usual algorithms of \LaTeX{} typeset the last line of a paragraph flush with the left +% margin unless |center|, |raggedleft| or |Centering|, |FlushRight| +% (package~\packagename{ragged2e}~\cite{package:ragged2e}) are in effect. For an instructive +% discussion consult Ch.~17, \doublequotes{Paragraph End}, of Ref.~\citenum{eijkhout:2007}. +% The following environments allow to adjust the last lines of paragraphs in different ways. +% +% \DescribeEnv{lastlineraggedleftpar} +% \DescribeEnv{lastlineflushrightpar} +% The environment |lastlineraggedleftpar|\index{paragraph>align last line>flush right} adjusts +% the various skips such that the last lines of the paragraphs gets typeset flush with the +% right margin. +% +% \begin{synopsis}\label{syn:lastlineraggedleftpar}\label{syn:lastlineflushrightpar} +% \cs{begin}|{lastlineraggedleftpar}| \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{lastlineraggedleftpar}| \\[\smallskipamount] +% |lastlineflushrightpar|~(alias) +% \end{synopsis} +% +% The name |lastlineflushrightpar| is an alias for~\code{lastlineraggedleftpar}. +% +% \DescribeEnv{lastlinecenteredpar} +% Center\index{paragraph>align last line>centered} the last lines of the paragraphs enclosed by +% this environment.\footnote{Also compare the approach taken in Ref.~\citenum{wermuth:2018}.} +% +% \begin{synopsis}\label{syn:lastlinecenteredpar} +% \cs{begin}|{lastlinecenteredpar}| \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{lastlinecenteredpar}| +% \end{synopsis} +% +% \begin{usecases} +% |lastlineflushrightpar|: Narrow, justified parts of the text put flush against the right +% margin.~\visualpar |lastlinecenteredpar|: Table or figure captions typeset justified as +% centered boxes. +% \end{usecases} +% +% +% \needtocspace +% \subsection[Fill Last Line] +% {Fill Last Line of a Paragraph}\label{sec:fill-last-line} +% \index{paragraph>fill last line} +% +% The problem of when and how to \singlequotes{fill} the last line of a paragraph is quite +% intricate. We first define the problem then we proceed to general purpose functions and we +% close the section with specific environments to control the length of the last line. +% +% +% \subsubsection{Problem Definition} +% +% Depending on the value of \cs{parindent}, either zero or nonzero, there may be the desire to +% control the length of the last line of a paragraph. +% +% \iffalse +%<*crookedparagraphs> +prologues := 3; + +def draw_filled_rectangle(expr lower_left, upper_right, color) = + fill lower_left -- (xpart upper_right, ypart lower_left) -- + upper_right -- (xpart lower_left, ypart upper_right) -- + cycle + withcolor color; +enddef; + + +u := 100; + +em := 10; +linelength := 2u; +baselineskip := 1.2em; +parskip := 3; +parindent := 2.5em; + +cmykcolor line_color; +line_color := (.08, 0, 0, .18); % cold silver + +color customred[]; +customred[1] := (.890, .282, .282); +customred[2] := (.831, .110, .110); +customred[3] := (.686, .043, .043); +customred[4] := (.569, .000, .000); +customred[5] := (.420, .000, .000); + +color margin_color; +margin_color := customred[2]; + + +beginfig(1); % short line -- gap + y := 0; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (1.1em, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((parindent, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + + draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip), margin_color); + draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip), margin_color); +endfig; + + +beginfig(2); % short line -- covered + y := 0; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (2parindent, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((parindent, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + + draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip), margin_color); + draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip), margin_color); +endfig; + + +beginfig(3); % completely filled line -- no clear paragraph break + y := 0; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + y := y - baselineskip - parskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + + draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip - parskip), margin_color); + draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip - parskip), + margin_color); +endfig; + + +beginfig(4); % completely filled line -- opened right margin + y := 0; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - parindent, y + 1em), line_color); + y := y - baselineskip - parskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); + + draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip - parskip), margin_color); + draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip - parskip), + margin_color); +endfig; +end +%</crookedparagraphs> +% \fi +% +% \begin{enumerate} +% \item\label{item:o1} +% \(\cs{parindent} > 0\) \cite[O1]{wermuth:2018} +% +% \begin{minipage}{\linewidth} +% If the last line of a paragraph is shorter than the \cs{parindent} of the following +% paragraph a visual gap tears open. +% +% \begin{center} +% \includegraphics{crooked-paragraphs-1.mps} +% \end{center} +% \end{minipage} +% +% The same problem arises with displayed math in a flush-left\footnote{The common practice of +% centering displayed equations does not call for the manipulations of a paragraph's last +% line discussed here.} setting, e.\,g., \packagename{amsmath}~\cite{package:amsmath} and +% option~|fleqn|.\footnote{For displayed equations and \packagename{amsmath} the relevant +% parameter is~\cs{mathindent}.} +% +% \begin{minipage}{\linewidth} +% A possible remedy is to reflow the paragraph in a way that its last line is clearly wider +% than \cs{parindent}; a typical suggestion being twice the~\cs{parindent}. +% +% \begin{center} +% \includegraphics{crooked-paragraphs-2.mps} +% \end{center} +% \end{minipage} +% +% \item\label{item:o2} +% \(\cs{parindent} = 0\) \cite[O2]{wermuth:2018} +% +% \begin{minipage}{\linewidth} +% If the last line of a paragraph is completely filled with text, i.\,e., flush with the +% right margin, it may become hard to spot the start of the following paragraph unless +% \cs{parskip} is large.\footnotemark +% +% \begin{center} +% \includegraphics{crooked-paragraphs-3.mps} +% \end{center} +% \end{minipage}\footnotetext{Package~\packagename{parskip} defines \cs{parskip} +% as \mbox{6pt plus 2pt} for a base size of~10pt.} +% +% \medskip +% \begin{minipage}{\linewidth} +% A possible, more legible solution is to reformat the paragraph in a way such that its +% last line leaves a marked gap with respect to the right margin. +% +% \begin{center} +% \includegraphics{crooked-paragraphs-4.mps} +% \end{center} +% \end{minipage} +% +% The suggestions for the gap-width vary from two~em to twice the width of a +% \singlequotes{typical} \cs{parindent}\footnote{% For example, \LaTeX's class +% \packagename{article} uses a \cs{parindent} of~25pt.} for the gap~\cite{carlisle:1996}. +% \end{enumerate} +% +% \begin{tip} +% In theory both problems, O1 and O2 can be resolved by either shortening or prolonging the +% last line of the paragraph. For the concrete case it is up to the user to decide which +% direction to go and to choose the method that yields the most pleasing typographic results. +% +% \TeX{} always considers the paragraph in its entirety. Thus any change the user demands +% \doublequotes{just for the last line} will permeate the whole paragraph and in unfortunate +% cases botch it. +% +% Prudent users check the appearance of the problematic, original paragraph against one or +% more corrected versions of it~-- at least visually. Quantitative comparisons can be +% performed with the help of~\cs{tracingparagraphs}. +% \end{tip} +% +% \begin{important} +% For the techniques in the following two subsections to work the paragraphs treated with +% them should have certain advantageous properties. +% +% \begin{itemize} +% \item Technically, the paragraphs need to contain enough glue (see +% e.\,g.~\cref{sec:sloppy-paragraphs}) to achieve a low badness such that the desired +% paragraph end is deemed feasible by \TeX. +% +% \item Aesthetically, the paragraphs must be long enough to absorb the change in last-line +% fill level otherwise their gray-values visibly deviate from the +% average.\specialsectionendhere +% \end{itemize} +% \end{important} +% +% +% \subsubsection{Manual Changes}\label{sec:fill-last-line-other-methods} +% +% Most \hyperref[item:o1]{O1} or \hyperref[item:o2]{O2} situations can be navigated with +% do-it-yourself methods. Here are some common recipes. +% +% \begin{enumerate} +% \item End-of-paragraph intervention.\label{enum:end-of-paragraph-intervention} +% +% \begin{enumerate}[notopsep] +% \item Tie~\sample{\texttt{\char126}}\label{enum:tie-last-words}\index{paragraph>fill last line>tie} +% +% Tie the last words. +% +% The problem with the tie may be a hyphenation of one of the words that participates in +% the tie. The next item avoids this disadvantage. +% +% \item \cs{mbox}\label{enum:mbox-last-words}\index{paragraph>fill last line>mbox=\cs{mbox}} +% +% Join the last words or inline equation at the end of the paragraph with an~\cs{mbox}. +% +% \item \cs{linebreak}\label{enum:linebreak}\index{paragraph>fill last line>linebreak=\cs{linebreak}} +% +% Add a \cs{linebreak} to the back part of the paragraph (approximately where the +% \cs{mbox} of item~\ref{enum:mbox-last-words} would start) in a way that the last line +% receives the desired length~\cite{wermuth:2022-8-2}. In turn the next-to-last lines +% may become unsightly. Counteract this degradation e.\,g.~with +% recipes~\ref{enum:vary-spacing} to~\ref{enum:vary-font-expansion}. +% \end{enumerate} +% +% Tying and \cs{mbox}ing lend themselves to generalizations. We need not only tie at end of +% a paragraph but fuse logical units of sentences or inline equations so that the relevant +% information literally stays in the reader's focus. Cementing together text of course finds +% an end when overfull lines start to show up. +% +% \item Uniform paragraph change.\label{enum:uniform-paragraph-change} +% +% \begin{enumerate}[notopsep] +% \item Vary spacing.\label{enum:vary-spacing}\index{font>spacing} +% +% Modify the inter-word spacing, for example, with the macros introduced in +% \cref{sec:looser-tighter-spacing}. +% +% Enclose the paragraph in either \hyperref[syn:loosespacing]{|loosespacing|} +% or~\hyperref[syn:tightspacing]{|tightspacing|}. +% Increase the spacing~\meta{level} until the last line gets the desired length. +% +% \item Vary font tracking.\label{enum:vary-font-tracking}\index{font>tracking} +% +% Enclose the paragraph in a \hyperref[syn:setfonttracking]{\code{setfonttracking}}~group. +% See \cref{sec:tracking-control}. Increase or decrease the tracking in steps of +% \nativetextfraction{1}{1000}\,em until the last line looks good. +% +% \item Vary font expansion.\label{enum:vary-font-expansion}\index{font>expansion} +% +% Enclose the paragraph in a \hyperref[syn:setfontexpand]{\code{setfontexpand}}~group. See +% \cref{sec:font-expansion-control}. +% \end{enumerate} +% +% \item A combination of any of the above items. +% +% \item Some curveballs.\label{enum:gonzo-tips}\par +% \begin{enumerate}[notopsep] +% \item If the paragraph already suffers from one of the problems that \TeX{} addresses with +% \cs{doublehyphendemerits}, \cs{finalhyphendemerits}, or~\cs{adjdemerits}, crank up one or +% all of these values to~10000 and observe whether the length of last line changes in the +% desired direction. +% +% \item If any influential \packagename{microtype} features have been enabled try with one +% more more of them \emph{disabled}. See, e.\,g., +% environment~\hyperref[syn:nofontexpansion]{\code{nofontexpansion}} in +% \cref{sec:font-expansion-control}. +% \end{enumerate} +% \end{enumerate} +% +% +% \subsubsection{Multi\capitalhyphen Purpose Environments}\label{sec:fill-last-line-gp-environments} +% +% \DescribeEnv{shortenpar} +% \DescribeEnv{prolongpar} +% The two environments |shortenpar|\index{paragraph>fill last +% line>shortenpar=\code{shortenpar}} and |prolongpar|\index{paragraph>fill last +% line>prolongpar=\code{prolongpar}} can be employed in quite general situations when a +% paragraph should be typeset one line longer or shorter, e.\,g., to avoid a +% widow~line\footnote{The last line of a paragraph becomes a \singlequotes{widow}\index{forlorn +% line>widow} (ger.~\foreignphrase{Hurenkind}) if it starts the following page or column.} or +% a club~line\footnote{The first line of a paragraph is called +% \singlequotes{club}\index{forlorn line>club} or~\singlequotes{orphan}\index{forlorn +% line>orphan} (ger.~\foreignphrase{Schusterjunge}) if it appears at the bottom of the page or +% column.}~[\citenum{knuth:1986}, p.~104 and~\citenum{mittelbach:2018c}]. (See also +% \cref{sec:vtie-paragraph} for special functions to avoid clubs or widows.) +% \singlequotes{Accidentally}, they also change the length of the last line of the paragraph. +% +% \begin{synopsis}\label{syn:shortenpar} +% \cs{begin}|{shortenpar}| +% \dots{} +% \cs{end}|{shortenpar}| +% \end{synopsis} +% +% Environment |shortenpar| decreases the \cs{looseness} of the paragraph.\footnote{Command +% \cs{looseness} is a \TeX{}~primitive~\cite[p.~103n]{knuth:1986}. A thorough discussion of +% the interaction of \cs{linepenalty} and \cs{looseness} can be found in +% Ref.~\citenum{wermuth:2017c}.} It performs well if the last line of the paragraph is short +% or the whole paragraph is loose. +% +% \begin{synopsis}\label{syn:prolongpar} +% \cs{begin}|{prolongpar}| +% \dots{} +% \cs{end}|{prolongpar}| +% \end{synopsis} +% +% This environment increases the \cs{looseness} of the paragraph, which is why it works best +% with decent or tight last lines that are almost full. +% +% +% \subsubsection{Specialized Environments}\label{sec:fill-last-line-specialized-environments} +% +% We introduce environments not just skips to get the correct behavior --~set up all paragraph +% parameters \emph{before} the paragraph ends~-- and, at the same time, limit the range of this +% parameter change. +% +% \DescribeEnv{covernextindentpar} +% Environment |covernextindentpar|\index{paragraph>fill last line>covernextindentpar=\code{covernextindentpar}} +% can be helpful for \hyperref[item:o1]{case~O1}, i.\,e., a too short last line. +% +% \begin{synopsis}\label{syn:covernextindentpar} +% \cs{begin}|{covernextindentpar}|\oarg{dim} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{covernextindentpar}| +% \end{synopsis} +% +% The environment asks \TeX{} to extend the last line of a paragraph such that it takes at +% least +% \makeatletter\dumpmacro{\typog@covernextindentpar@nonzero@parindent}\makeatother{} +% (if \(\cs{parindent} \not= 0\)), +% \makeatletter\typog@covernextindentpar@zero@parindent\makeatother{} +% (if \(\cs{parindent} = 0\)), or \meta{dim} if called with an optional argument. +% +% \DescribeEnv{openlastlinepar} +% The next environment, |openlastlinepar|,\index{paragraph>fill last +% line>openlastlinepar=\code{openlastlinepar}} takes care of \hyperref[item:o2]{case~O2}, +% i.\,e., a last line in a paragraph that is almost full or completely filled. +% +% \begin{synopsis}\label{syn:openlastlinepar} +% \cs{begin}|{openlastlinepar}|\oarg{dim} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{openlastlinepar}| +% \end{synopsis} +% +% It may resolve \hyperref[item:o2]{case~O2} as it attempts to prevent a completely filled line +% by introducing a partly unshrinkable \cs{parfillskip}. Without optional argument the +% threshold of unused last-line length is either +% \makeatletter\dumpmacro{\typog@openlastlinepar@nonzero@parindent}\makeatother{} (if +% \(\cs{parindent} \not= 0\)) or +% \makeatletter\typog@openlastlinepar@zero@parindent\makeatother{} (if \(\cs{parindent} = 0\)). +% The optional argument~\meta{dim} directly sets the gap threshold. +% +% Note that the application of this environment can be successful, this is, a completely filled +% last line is avoided, but the result may be of \hyperref[item:o1]{type~O1} nonetheless. +% +% +% \needtocspace +% \Needspace{150pt} +% \subsection{Spacing}\label{sec:spacing-control}\index{font>spacing} +% +% \begin{whittyquote} +% 90~\% of design is typography. \\ +% And the other 90~\% is whitespace. \\ +% \capitalemdash*~\propername{Jeffrey Zeldman} +% \end{whittyquote} +% +% \noindent +% The functions described in this section rely only on plain \LaTeX. No extra packages are +% required. Compare to the \packagename{microtype}-based functionality of +% \cref{sec:microtype-frontend}. +% +% +% \subsubsection[Looser\kernedslash Tighter]{Looser or Tighter Spacing}\label{sec:looser-tighter-spacing}\index{font>spacing>loose}\index{font>spacing>tight} +% +% +% \begin{whittyquote} +% Never try to adjust lines by squeezing or stretching the tracking. \\ +% Go for the subtle solution: adjust word spacing instead. \\ +% \capitalemdash*~\propername{Jan Middendorp}~\cite[p.~119]{middendorp:2014} +% \end{whittyquote} +% +% \noindent +% The environments in this section directly influence the spacing, this is, they change the +% width and stretchability of the horizontal space. +% +% They at the one hand act gently by adjusting the spacing only by a small amount. On the +% other hand they operate decidedly in controlling the glue associated with the adjusted space. +% The latter also being important to ensure the monotonicity of the different \meta{level}s. +% However, the strictly managed stretchability\slash shrinkability may lead to many overfull +% boxes with \cs{fussy} or when applied to short lines. +% +% \DescribeEnv{loosespacing} +% \DescribeEnv{tightspacing} +% Environments |loosespacing| and |tightspacing| introduce four \meta{level}s of +% \singlequotes{looseness} or \singlequotes{tightness}, where \meta{level}~=~0 disables the +% functionalities. The higher the \meta{level} the looser or tighter the text will by typeset, +% respectively. +% +% \begin{synopsis}\label{syn:loosespacing} +% \cs{begin}|{loosespacing}|\oarg{level} +% \dots{} +% \cs{end}|{loosespacing}| +% \end{synopsis} +% +% Environment~|loosespacing| increases the width of a space by the percentages given in the +% \cref{tab:loosespacing}. +% +% \begin{SCtable}[10] +% \caption[Spacing changes made by \code{loosespacing}]% +% {Adjustments made by environment |loosespacing| to \cs{spaceskip}. +% The mapping of \meta{level} to the exact skip definitions are +% \(1 \mapsto \formatskip{1.05}{.5}{.1}\), +% \(2 \mapsto \formatskip{1.1}{.5}{.1}\), +% \(3 \mapsto \formatskip{1.2}{.6}{.2}\), and +% \(\ge 4 \mapsto \formatskip{1.3}{.8}{.3}\), +% where all factors scale with \cs{dimen2}, +% the current font's space-width.} +% \label{tab:loosespacing} +% +% \begin{tabfigures} +% \def~{\hphantom{0}}% +% \begin{tabular}{@{}ccl@{}} +% \toprule +% \meta{level} & Adjustment & Comment \\ +% {} & \% & \\ +% \midrule +% 0 & n/a & neutral \\ +% 1 & +5~ & default \\ +% 2 & +10 & \\ +% 3 & +20 & \\ +% \(\ge\)\:4 & +30 & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{SCtable} +% +% The default level of |loosespacing| is~1. +% +% \begin{synopsis}\label{syn:tightspacing} +% \cs{begin}|{tightspacing}|\oarg{level} +% \dots{} +% \cs{end}|{tightspacing}| +% \end{synopsis} +% +% Environment~|tightspacing| decreases the width of a space by the percentages given in +% \cref{tab:tightspacing}. +% +% \begin{SCtable}[10] +% \caption[Spacing changes made by \code{tightspacing}]% +% {Adjustments made by environment |tightspacing| to \cs{spaceskip}. +% The mapping of \meta{level} to the exact skip definitions are +% \(1 \mapsto \formatskip{.9875}{.0125}{.5\hphantom{000}}\)\!, +% \(2 \mapsto \formatskip{.975}{.025}{.5\hphantom{00}}\)\!, +% \(3 \mapsto \formatskip{.95}{.05}{.5\hphantom{0}}\)\!, and +% \(\ge 4 \mapsto \formatskip{.9}{.1}{.5}\), +% where all factors scale with \cs{dimen2}, +% the current font's space-width.} +% \label{tab:tightspacing} +% +% \begin{tabfigures} +% \def~{\hphantom{0}}% +% \begin{tabular}{@{}ccl@{}} +% \toprule +% \meta{level} & Adjustment & Comment \\ +% {} & \% & \\ +% \midrule +% 0 & n/a & neutral \\ +% 1 & ~{-}1.25 & default \\ +% 2 & ~{-}2.5~ & \\ +% 3 & ~{-}5\hphantom{.00} & \\ +% \(\ge\)\:4 & -10\hphantom{.00} & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{SCtable} +% +% The default level of |tightspacing| is~1. +% +% \begin{note} +% At a given \meta{level} the changes of |loosespacing| are much larger than those of +% |tightspacing|. +% \end{note} +% +% \begin{usecases} +% Nudge line breaks or hyphenation points.~\visualpar Separate clashing descenders and +% ascenders.~\visualpar Eliminate rivers. +% \end{usecases} +% +% +% \subsubsection{Wide Space}\label{sec:wide-space}\index{wide space} +% +% The \cs{widespace} macro and its companion \cs{narrowspace} derive their appearances from +% several of the current font's \cs{fontdimen}\meta{number}s. \TeX{} addresses the latter by +% integers, which is totally non-memnonic. Therefore, we play softball by first presenting +% \cref{tab:fontdimen} that associates the \cs{fontdimen}\meta{number}s with their meanings and +% also reports on their current values (for this document).\footnote{The association is given +% in Appendix~F (p.~433) of Ref.~\citenum{knuth:1986}. For a concise and understandable +% explanation of the \TeX~\cs{fontdimen} parameters consult Ref.~\citenum{carlisle:2013}.} +% +% \begin{SCtable} +% \caption[\cs{fontdimen}\meta{number} parameters] +% {The first column~\sample{\#} states the index of the \cs{fontdimen} parameter: +% \meta{number}. Column~2 presents short descriptions of the +% \cs{fontdimen}\meta{number} parameters. As examples, the values for the current +% font are shown in column~3; they are normalized to the quad-size.\bottomstrut} +% \label{tab:fontdimen} +% +% \begin{tabfigures} +% \def~{\hphantom{0}}% +% \ExplSyntaxOn +% \def\straightfontdimen#1{\fp_eval:n {\the\fontdimen#1\font}} +% \def\roundfontdimen#1{\fp_eval:n {round (1000 * \the\fontdimen#1\font) / 1000}} +% \def\relativefontdimen#1{\fp_eval:n {round (1000 * \the\fontdimen#1\font / \the\fontdimen6\font) / 10}} +% \ExplSyntaxOff +% +% \begin{tabular}{@{}lll@{}} +% \toprule +% \# & Description & Value \\ +% {} & & \multicolumn{1}{c}{\%} \\ +% \midrule +% 1 & Slant per 1\,pt height & ~~\relativefontdimen1\topstrut \\ +% 2 & Interword space width & ~\relativefontdimen2 \\ +% 3 & Interword stretch & ~\relativefontdimen3 \\ +% 4 & Interword shrink & ~~\relativefontdimen4 \\ +% 5 & \sample{\itcorr{2}x\itcorr{2}} height & ~\relativefontdimen5 \\ +% 6 & \cs{quad} height & \relativefontdimen6 \\ +% 7 & Extra space width & ~~\relativefontdimen7 \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{SCtable} +% +% \DescribeMacro{\widespace} +% \DescribeMacro{\widespace*} +% \sinceversion{Starred form since v0.2} +% Typeset a wide, sentence-ending space as if in \cs{nonfrenchspacing}~mode. Consult +% \Cref{tab:space-sizes} for a comparison of the various sizes. +% +% \begin{synopsis}\label{syn:widespace} +% \cs{widespace} \\ +% \cs{widespace*} +% \end{synopsis} +% +% The unstarred macro~\cs{widespace} inserts a space that is as wide as the font's +% sentence-ending space in \cs{nonfrenchspacing}~mode, this is +% \begin{equation*} +% |\fontdimen2| + \cs{widespacestrength} \times |\fontdimen7|. +% \end{equation*} +% +% \noindent +% Its width is independent of any \cs{frenchspacing} or \cs{nonfrenchspacing}~settings, but +% depends on \cs{widespacestrength} which defaults +% to~\widespacestrength\widespace\marginnote{The sentence that ends with +% \singlequotes{\widespacestrength} uses \cs{widespace} after the period.} The latter can be +% overridden by the user to get a more or less pronounced effect. +% +% If |\fontdimen7| happens to be zero \cs{widespace} uses +% \begin{equation*} +% \cs{widespacescale} \times |\fontdimen2| +% \end{equation*} +% +% \noindent +% as width instead, where \cs{widespacescale} defaults to \widespacescale. The stretchability +% and shrinkability of \cs{widespace} always are scaled with \cs{widespacescale}. The +% \cs{widespacescale} too can be redefined by the user to achieve different effects. +% +% The starred form, \cs{widespace*}, unconditionally uses the \(|\fontdimen7| = 0\) code-path. +% +% \begin{usecase} +% Useful as a sentence-ending space if, for example, the sentence ends in an abbreviation +% with a period or decimal number without trailing digits \emph{and} the next sentence should +% be delimited in a clearer way.~\visualpar Open tight lines with a series +% of~\cs{widespace}s.\footnote{\label{fn:widespace}See also \doublequotes{Investigating the +% badness of a paragraph} on \Cpageref{sec:investigating-paragraph-badness}.} +% \end{usecase} +% +% +% \subsubsection{Narrow Space}\label{sec:narrow-space}\index{narrow space} +% +% \DescribeMacro{\narrowspace} +% \DescribeMacro{\narrowspace*} +% \sinceversion{Since v0.2} +% Typeset a narrow space. Consult \Cref{tab:space-sizes} for a comparison of the various +% sizes. +% +% \begin{synopsis}\label{syn:narrowspace} +% \cs{narrowspace} \\ +% \cs{narrowspace*} +% \end{synopsis} +% +% The unstarred macro~\cs{narrowspace} inserts a narrow space with the width +% \begin{equation*} +% |\fontdimen2| - \cs{narrowspacestrength} \times |\fontdimen7| +% \end{equation*} +% +% \noindent +% if |\fontdimen7| is different from zero or otherwise +% \begin{equation*} +% \cs{narrowspacescale} \times |\fontdimen2|. +% \end{equation*} +% +% \noindent +% The starred version, \cs{narrowspace*}, unconditionally uses the \(\cs{fontdimen7} = 0\) +% code-path. Refer to \Cref{tab:fontdimen} for the meanings of the various +% \cs{fontdimen}~parameters. +% +% The stretchability and shrinkability of \cs{narrowspace} always get scaled with +% \cs{narrowspacescale}. Both factors, \cs{narrowspacestrength} and \cs{narrowspacescale} can +% be redefined by the user; their defaults are \narrowspacestrength{} and \narrowspacescale, +% respectively. +% +% \begin{usecase} +% Tighten loose lines with a series of~\cs{narrowspace}s.\footnote{Footnote +% \ref{fn:widespace} again applies.} +% \end{usecase} +% +% \begin{table} +% \centering +% \caption[Comparison of some space sizes] +% {Exemplary comparison of standard \cs{space} versus \cs{narrowspace} and +% \cs{widespace}. All values are relative to the size of the current font's quad +% size. \cs{narrowspace} and \cs{widespace} use the package's defaults.~\visualpar +% The upper values in the Width-column for \cs{narrowspace}, and \cs{widespace} +% refer to the \(\cs{fontdimen7} \not= 0\) case and the lower ones to the +% \(\cs{fontdimen7} = 0\) code-path.} +% \label{tab:space-sizes} +% +% \begin{tabfigures} +% \def~{\hphantom{0}}% +% \ExplSyntaxOn +% \def\relativedimen#1{\fp_eval:n {round (1000 * (#1) / \the\fontdimen6\font) / 10}} +% \def\relativefontdimen#1{\relativedimen{\the\fontdimen#1\font}} +% \ExplSyntaxOff +% \def\nrows{1.75} +% +% \begin{tabular}{@{}llll@{}} +% \toprule +% Name & Width & Stretch & Shrink \\ +% {} & \% & \% & \% \\ +% \midrule +% \multirow{\nrows}{*}{\cs{narrowspace}} & +% \relativedimen{\the\fontdimen2\font - \narrowspacestrength * \the\fontdimen7\font} & +% \multirow{\nrows}{*}{\relativedimen{\narrowspacescale * \the\fontdimen3\font}} & +% \multirow{\nrows}{*}{\relativedimen{\narrowspacescale * \the\fontdimen4\font}} \\[-.25\normalbaselineskip] +% {} & \relativedimen{\narrowspacescale * \the\fontdimen2\font} & & \\ +% \cs{space} & \relativefontdimen2 & \relativefontdimen3 & \relativefontdimen4 \\ +% \multirow{\nrows}{*}{\cs{widespace}} & +% \relativedimen{\the\fontdimen2\font + \widespacestrength * \the\fontdimen7\font} & +% \multirow{\nrows}{*}{\relativedimen{\widespacescale * \the\fontdimen3\font}} & +% \multirow{\nrows}{*}{\relativedimen{\widespacescale * \the\fontdimen4\font}} \\[-.25\normalbaselineskip] +% {} & \relativedimen{\widespacescale * \the\fontdimen2\font} & & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{table} +% +% +% \subsection{\packagename{Microtype} Front\capitalhyphen End}\label{sec:microtype-frontend} +% \index{microtype=\packagename{microtype} (package)} +% +% The functionalities are just front-ends of selected macros in +% package~\packagename{microtype} -- welcome syntactic sugar. +% +% \begin{important} +% All macros and environments introduced in this section require that +% package~\packagename{microtype}~\cite{package:microtype} has been loaded, preferably +% \emph{before} package~\packagename{typog} +% +% \begin{codeexample} +% \cs{usepackage}[\meta{microtype-options}\dots]\{microtype\} \\ +% \cs{usepackage}[\meta{typog-options}\dots]\{typog\} +% \end{codeexample} +% +% \noindent +% in the document preamble. +% \end{important} +% +% +% \subsubsection{Tracking}\label{sec:tracking-control}\index{font>tracking} +% +% \begin{caution} +% The tracking changes may interfere with implicit changes of tracking declared with +% \cs{SetTracking}. Explicit calls to \cs{textls} remain in effect. +% \end{caution} +% +% \noindent +% \DescribeEnv{setfonttracking} +% Override the default tracking for all fonts. +% +% \begin{synopsis}\label{syn:setfonttracking} +% \cs{begin}|{setfonttracking}|\marg{delta} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{setfonttracking}| +% \end{synopsis} +% +% The environment~|setfonttracking| manages a group for \cs{lsstyle} of +% package~\packagename{microtype}. The change \meta{delta} in tracking is given as multiples +% of \nativetextfraction{1}{1000}\,em. Positive as well as negative values of \meta{delta} are +% allowed. +% +% See Sec.~5.3, \singlequotes{Tracking}, and~7, \doublequotes{Letterspacing revisited}, in the +% documentation of \packagename{microtype}~\cite{package:microtype} for a detailed explanation. +% +% For font combinations involving monospaced fonts (\TeX{} lingo: typewriter) an overly large +% spacing may show up at the borders where fonts change. This is caused by the calculation of +% the \doublequotes{outer spacing} described in Sec.~5.3 of the \packagename{microtype}~manual. +% +% Use configuration variable~\hyperref[item:trackingttspacing]{\code{trackingttspacing}} to +% reduce the outer spacing to a reasonable value either directly at package-load time +% +% \begin{codeexample} +% \cs{usepackage}[trackingttspacing=\{250, 75, 50\}]\{typog\} +% \end{codeexample} +% +% \noindent +% or with the help of \cs{typogsetup} in the document \emph{preamble} (after loading +% \packagename{microtype} and \packagename{typog}) +% +% \begin{codeexample} +% \cs{typogsetup}\{trackingttspacing=\{250, 75, 50\}\} +% \end{codeexample} +% +% If the argument of option~\code{trackingttspacing} is omitted the outer spacing defaults to +% \makeatletter\mbox{\typog@trackingttspacing}\makeatother. +% +% \begin{usecases} +% Nudge line breaks or hyphenation points.~\visualpar Avoid clashes of descenders and +% ascenders, e.\,g., for \cs{smash}ed symbols of inline math.~-- Think of +% integrals.~\visualpar Control the length of the last line in a paragraph. +% \end{usecases} +% +% +% \subsubsection{Font Expansion}\label{sec:font-expansion-control}\index{font>expansion} +% +% \DescribeEnv{setfontshrink} +% \DescribeEnv{setfontstretch} +% Adjust the limits of either only stretchability or only shrinkability and zero the other +% component, i.\,e., shrinkability and stretchability, respectively. +% +% \begin{synopsis}\label{syn:setfontshrink}\label{syn:setfontstretch} +% \cs{begin}|{setfontshrink}|\marg{level} +% \dots{} +% \cs{end}|{setfontshrink}| \\ +% \cs{begin}|{setfontstretch}|\marg{level} +% \dots{} +% \cs{end}|{setfontstretch}| +% \end{synopsis} +% +% A \meta{level} of zero is a no-op. \Cref{tab:setfontshrink-values,tab:setfontstretch-values} +% summarize the values for |stretch| and |shrink| in these environments. +% +% \begin{SCtable} +% \caption[Shrink values of \code{setfontshrink}]% +% {\slightlysloppy[2] Preconfigured values for |shrink| inside of +% environment~\code{setfontshrink}. Note that all |stretch| values are zero, so the fonts +% only can shrink.} +% \label{tab:setfontshrink-values} +% +% \begin{tabfigures} +% \begin{tabular}{@{}cccl@{}} +% \toprule +% \meta{level} & |stretch| & |shrink| & Comment \\ +% {} & \nativetextfraction{1}{1000}\,em & \nativetextfraction{1}{1000}\,em & \\ +% \midrule +% 0 & n/a & n/a & no operation \\ +% 1 & 0 & \hphantom{0}\makeatletter\typog@shrink@i\makeatother & default \\ +% 2 & 0 & \makeatletter\typog@shrink@ii\makeatother & \\ +% 3 & 0 & \makeatletter\typog@shrink@iii\makeatother & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{SCtable} +% +% \begin{SCtable} +% \centering +% \caption[Stretch values of \code{setfontstretch}]% +% {\slightlysloppy[2] Preconfigured values for |stretch| inside of +% environment~\code{setfontstretch}. Note that all |shrink| values are zero, so the fonts +% only can stretch.} +% \label{tab:setfontstretch-values} +% +% \begin{tabfigures} +% \begin{tabular}{@{}cccl@{}} +% \toprule +% \meta{level} & |stretch| & |shrink| \\ +% {} & \nativetextfraction{1}{1000}\,em & \nativetextfraction{1}{1000}\,em & \\ +% \midrule +% 0 & n/a & n/a & no operation \\ +% 1 & \hphantom{0}\makeatletter\typog@stretch@i\makeatother & 0 & default \\ +% 2 & \makeatletter\typog@stretch@ii\makeatother & 0 & \\ +% 3 & \makeatletter\typog@stretch@iii\makeatother & 0 & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{SCtable} +% +% The three (nonzero) shrink limits of \code{setfontshrink} can be configured with package +% option~\hyperref[item:shrinklimits]{\code{shrinklimits}} and --~in the same way~-- the three +% (nonzero) stretch limits of \code{setfontstretch} with package +% option~\hyperref[item:stretchlimits]{\code{stretchlimits}}. +% +% \begin{usecases} +% Nudge line breaks or hyphenation points.~\visualpar Control the length of the last line in +% a paragraph. +% \end{usecases} +% +% \noindent +% \DescribeEnv{setfontexpand} +% Manipulate both, |stretch| and |shrink|~values at the same time. +% +% \begin{synopsis}\label{syn:setfontexpand} +% \cs{begin}|{setfontexpand}|\marg{level} +% \dots{} +% \cs{end}|{setfontexpand}| +% \end{synopsis} +% +% \Cref{tab:setfontexpand-values} gives an overview of the values associated with \meta{level}. +% +% \begin{SCtable} +% \caption[Shrink and stretch values of \code{setfontexpand}]% +% {\slightlysloppy[2] Preconfigured values for |shrink| and |stretch| inside of +% environment~\code{setfontexpand}. Note that both |shrink| and |stretch| values are +% nonzero, so the fonts can shrink or expand.} +% \label{tab:setfontexpand-values} +% +% \begin{tabfigures} +% \begin{tabular}{@{}cccl@{}} +% \toprule +% \meta{level} & |stretch| & |shrink| & Comment \\ +% {} & \nativetextfraction{1}{1000}\,em & \nativetextfraction{1}{1000}\,em & \\ +% \midrule +% 0 & n/a & n/a & no operation \\ +% 1 & \hphantom{0}\makeatletter\typog@stretch@i\makeatother & \hphantom{0}\makeatletter\typog@stretch@i\makeatother & default \\ +% 2 & \makeatletter\typog@stretch@ii\makeatother & \makeatletter\typog@stretch@ii\makeatother & \\ +% 3 & \makeatletter\typog@stretch@iii\makeatother & \makeatletter\typog@stretch@iii\makeatother & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{SCtable} +% +% The six shrink and stretch limits of \code{setfontexpand} can be configured with package +% options~\hyperref[item:shrinklimits]{\code{shrinklimits}} +% and~\hyperref[item:stretchlimits]{\code{stretchlimits}}. +% +% \begin{notes} +% \begin{itemize}[notopsep] +% \item Environment~|setfontexpand| shares its +% \hyperref[item:shrinklimits]{\code{shrinklimits}} with \code{setfontshrink} and its +% \hyperref[item:stretchlimits]{\code{stretchlimits}} with \code{setfontstretch}. +% +% \item These environments do not nail down any font's expansion but only set up its +% available range. See Sec.~3.3, \doublequotes{Font Expansion}, in the +% \packagename{microtype} documentation~\cite{package:microtype}. +% +% Moreover, a text may not \singlequotes{respond} neither to \code{setfontshrink}, +% \code{setfontstretch}, nor~\code{setfontexpand} because \TeX{} already considers it +% optimal without expansion or within the previous expansion limits, e.\,g., those set at +% \packagename{microtype} load~time as opposed to \packagename{typog}'s +% load~time.\specialsectionendhere +% \end{itemize} +% \end{notes}\unskip +% +% \begin{usecases} +% Nudge line breaks or hyphenation points.~\visualpar Control the length of a paragraph, +% e.\,g., to avoid a widow. +% \end{usecases} +% +% \noindent +% \DescribeEnv{nofontexpansion} +% Disable the \packagename{microtype} feature~\singlequotes{expansion} inside of the +% environment. +% +% \begin{synopsis}\label{syn:nofontexpansion}\label{syn:nofontexpand} +% \cs{begin}|{nofontexpansion}| +% \dots{} +% \cs{end}|{nofontexpansion}| \\[\smallskipamount] +% |nofontexpand|~(alias) +% \end{synopsis} +% +% The name |nofontexpand| is an alias for~|nofontexpansion|. +% +% \begin{usecases} +% Nudge line breaks or hyphenation points.~\visualpar Prevent severe scaling effects in +% paragraphs strongly manipulated by other means, e.\,g., +% \hyperref[syn:shortenpar]{\code{shortenpar}} +% or~\hyperref[syn:prolongpar]{\code{prolongpar}}. +% \end{usecases} +% +% +% \subsubsection{Character Protrusion}\label{sec:protrusion}\index{font>protrusion} +% +% \DescribeEnv{nocharprotrusion} +% Disable the \packagename{microtype} feature~\singlequotes{protrusion} inside of the +% environment. +% +% \begin{synopsis}\label{syn:nocharprotrusion} +% \cs{begin}|{nocharprotrusion}| +% \dots{} +% \cs{end}|{nocharprotrusion}| +% \end{synopsis} +% +% \begin{usecases} +% Table of Contents or similar tables with aligned section numbers.~\visualpar Any table with +% left- or right-aligned numerals in particular tabular numerals.~\visualpar Index. +% \end{usecases} +% +% +% \FloatBarrier +% \subsection{Sloppy Paragraphs}\label{sec:sloppy-paragraphs}\index{paragraph>sloppy} +% +% Experienced \LaTeX{} users know that \cs{sloppy} is more of a problem by itself and not +% really a viable solution of the \doublequotes{overfull~box} syndrome. +% +% \DescribeMacro{\slightlysloppy} +% \DescribeEnv{slightlysloppypar} +% We define the macro~\cs{slightlysloppy} and the associated environment, +% \code{slightlysloppypar}, with a user-selectable \meta{sloppiness} parameter. The +% constructions recover the known settings \cs{fussy} (\meta{sloppiness}~=~0) and \cs{sloppy} +% (\meta{sloppiness}~\(\ge\)~8), and introduce seven intermediate +% \meta{sloppiness}~levels.\footnote{Also compare the findings for \cs{emergencystretch} in +% Ref.~\citenum{wermuth:2017a}.} The default \meta{sloppiness} is 1. +% +% \begin{synopsis}\label{syn:slightlysloppy}\label{syn:slightlysloppypar} +% \cs{slightlysloppy}\oarg{sloppiness} \\[\smallskipamount] +% \cs{begin}|{slightlysloppypar}|\oarg{sloppiness} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{slightlysloppypar}| +% \end{synopsis} +% +% \Cref{tab:slightlysloppy} summarizes the adjustments that \cs{slightlysloppy} makes depending +% on the \meta{sloppiness}~level. +% +% \begin{table} +% \centering +% \caption[Parameter adjustments of \cs{slightlysloppy}]% +% {Adjustments made by \cs{slightlysloppy} to various \TeX~parameters at different +% levels of \meta{sloppiness}.} +% \label{tab:slightlysloppy} +% +% \newcommand*{\tolerancemark}{\tablenotemark{\dag}}% +% \newcommand*{\scaledmark}{\tablenotemark{\ddag}}% +% +% \begin{suspendshortverb} +% \begin{tabfigures} +% \begin{tabular}{@{}ccccl@{}} +% \toprule +% \meta{sloppiness} & \cs{toler-} & \cs{hfuzz} & \cs{emergency-} & Comment \\ +% {} & \code{ance} & \cs{vfuzz} & \code{stretch}~\(G\) & \\ +% {} & & pt & em & \\ +% \midrule +% 0 & \hphantom{0}200\hphantom{\tolerancemark} & .1\hphantom{0} & 0\hphantom{.000\scaledmark} & \TeX: \verb+\fussy+ \\ +% 1 & \hphantom{0}330\tolerancemark & .15 & \hphantom{0}.375\scaledmark & default \\ +% 2 & \hphantom{0}530\tolerancemark & .2\hphantom{0} & \hphantom{0}.75\scaledmark\hphantom{0} & \\ +% 3 & \hphantom{0}870\tolerancemark & .25 & 1.125\scaledmark & \\ +% 4 & 1410\tolerancemark & .3\hphantom{0} & 1.5\scaledmark\hphantom{00} & \\ +% 5 & 2310\tolerancemark & .35 & 1.875\scaledmark & \\ +% 6 & 3760\tolerancemark & .4\hphantom{0} & 2.25\scaledmark\hphantom{0} & \\ +% 7 & 6130\tolerancemark & .45 & 2.625\scaledmark & \\ +% \(\ge\)\:8 & 9999\hphantom{\tolerancemark} & .5\hphantom{0} & 3\hphantom{.000\scaledmark} & \TeX: \verb+\sloppy+ \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% \end{suspendshortverb} +% +% \begin{tablenotes} +% \tolerancemark\enspace +% All intermediate levels set \(\cs{pretolerance} = \cs{tolerance} / 2\). +% +% \scaledmark\enspace +% The intermediate levels scale the amount of available glue~\(G\) (indicated in column~4 +% of the table) for \cs{emergencystretch} with the actual line length, this means, in these +% levels +% \begin{equation*} +% \cs{emergencystretch} = G \times \frac{\cs{linewidth}}{\cs{textwidth}}. +% \end{equation*} +% to prevent excessive stretchability in narrow lines. +% \end{tablenotes} +% \end{table} +% +% Environment~|slightlysloppypar|\oarg{sloppiness} mimics \LaTeX's~\code{sloppypar}, while +% offering the flexibility of~\cs{slightlysloppy}. +% +% \begin{usecases} +% Drop-in replacement for \cs{sloppy}, whether explicit or implicit (think of +% \cs{parbox}).~\visualpar Initial paragraphs in theorem environments (e.\,g., as defined by +% \packagename{amsmath} or \packagename{amsthm}), where the theorem~head already takes a lot +% of space.~\visualpar Bibliographies as environment~\code{thebibliography} sets~\cs{sloppy}. +% \end{usecases} +% +% +% \FloatBarrier +% \subsection{Vertically Partially-Tied Paragraphs}\label{sec:vtie-paragraph}\index{paragraph>vertically tied} +% +% \LaTeX{} provides several macros and environments to tie material vertically~-- most +% prominently |samepage| and |minipage|.\footnote{A valuable complement to these is +% package~\packagename{needspace}~\cite{package:needspace} which takes a different approach and +% reliably works in \emph{mixed} horizontal and vertical mode situations.} +% \packagename{Typog's} macros and environments constitute more sophisticated but weaker forms +% of these. They tie only the first or last couple of lines in a paragraph while the rest of +% the paragraph gets broken into pages by \TeX{} in the usual way. +% +% The macros and environments described in this section locally set \eTeX{} penalty +% arrays~\cite[Sec.~3.8]{package:etex}. In addition the environments~\code{vtietoppar}, +% \code{vtiebotpar}, and~\code{vtiebotdisptoppar} explicitly issue a \cs{par} at the end of the +% group. +% +% \DescribeMacro{\vtietop} +% \DescribeEnv{vtietoppar} +% Avoid a club\index{forlorn line>club} line in each partial paragraph. +% +% \begin{synopsis}\label{syn:vtietop}\label{syn:vtietoppar} +% \cs{vtietop}\oarg{number-of-lines} \\[\smallskipamount] +% \cs{begin}|{vtietoppar}|\oarg{number-of-lines} +% \dots{} +% \cs{end}|{vtietoppar}| +% \end{synopsis} +% +% Vertically tie the first \meta{number\hyp{}of\hyp{}lines} in a paragraph. Zero or one for +% \meta{number\hyp{}of\hyp{}lines} are no-ops. Up to nine lines can be fused. The default is +% to link three lines. +% +% \begin{usecases} +% String together the first paragraph right after a sectioning command.~\visualpar Tie the +% first line of an itemized, enumerated, or a description list\index{list} with the paragraph +% following~\cs{item}. +% \end{usecases} +% +% \noindent +% \DescribeMacro{\splicevtietop} +% Inside of a \code{list} a one-off solution simply concatenates \cs{item}[\dots]\cs{vtietop} +% to fuse the line with the \code{item\#}, the representation of the \code{enum\#}, or the +% description term with the first paragraph. For a systematic use prefer \cs{splicevtietop} +% and apply it as the first thing in the \code{list}~body. +% +% \begin{synopsis}\label{syn:splicevtietop} +% \cs{splicevtietop}\oarg{number-of-lines} +% \end{synopsis} +% +% Use this macro \emph{inside} of a \code{list}-like environment to equip each \cs{item} with +% \cs{vtietop}\oarg{number-of-lines}. The default \meta{number-of-lines} is three as for any +% of the \code{vtie\dots}~functions. +% +% Example for a \code{description}~list and plain \LaTeX: +% +% \begin{codeexample} +% 12\=\kill +% \cs{begin}\{description\} \\ +% \> \cs{splicevtietop}[2] \\ +% \> \cs{item}[...] \\ +% \cs{end}\{description\} +% \end{codeexample} +% +% Alternatively with package~\packagename{enumitem}~\cite{package:enumitem}: +% +% \begin{codeexample} +% 12\=\kill +% \cs{begin}\= \{description\}[first=\cs{splicevtietop[2]}] \\ +% \> \cs{item}[...] \\ +% \cs{end}\{description\} +% \end{codeexample} +% +% \noindent +% or shorter and with the default \meta{number-of-lines},~3, using the \packagename{enumitem} +% style\footnote{The documentation of \packagename{enumitem} prosaically calls them +% \singlequotes{keys} (Section~3) not \singlequotes{styles}.}~\code{vtietop}: +% +% \DescribeEnumItemKey{vtietop} +% \begin{codeexample} +% \cs{usepackage}\{enumitem\} \\ +% \cs{begin}\= \{description\}[vtietop] \\ +% ~~\cs{item}[...] \\ +% \cs{end}\{description\} +% \end{codeexample} +% +% \medskip +% +% \noindent +% \DescribeMacro{\vtiebot} +% \DescribeEnv{vtiebotpar} +% Avoid a widow\index{forlorn line>widow} line in each partial paragraph. +% +% \begin{synopsis}\label{syn:vtiebot}\label{syn:vtiebotpar} +% \cs{vtiebot}\oarg{number-of-lines} \\[\smallskipamount] +% \cs{begin}|{vtiebotpar}|\oarg{number-of-lines} +% \dots{} +% \cs{end}|{vtiebotpar}| +% \end{synopsis} +% +% Vertically tie the last \meta{number\hyp{}of\hyp{}lines} in a paragraph. Zero or one for +% \meta{number\hyp{}of\hyp{}lines} are no-ops. Up to nine lines can be fused. The default is +% to link three lines. +% +% \noindent +% \DescribeEnv{vtiebotdisp} +% Avoid a display widow\index{forlorn line>display widow} line in each partial paragraph. +% +% \begin{synopsis}\label{syn:vtiebotdisp}\label{syn:vtiebotdisppar} +% \cs{begin}|vtiebotdisp|\oarg{before-disp-number-of-lines} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{vtiebotdisp}| +% \end{synopsis} +% +% Vertically tie the last \meta{before\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} in a paragraph +% before a display. Zero or one for \meta{before\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} are +% no-ops. Up to nine lines can be fused. The default is to link three lines. +% +% To use the function bracket the paragraph before the display (the one that needs protection) +% and the associated displayed math: +% +% \begin{codeexample} +% \cs{begin}\{vtiebotdisp\} \\ +% ~~\% vertically tied paragraph before the math display \\ +% ~~\cs{begin}\{equation\} \\ +% ~~~~\% math \\ +% ~~\cs{end}\{equation\} \\ +% \cs{end}\{vtiebotdisp\} +% \end{codeexample} +% +% \DescribeEnv{vtiebotdisptoppar} +% Avoid a display widow, compound the display with its preceding \emph{and} following +% paragraph, and avoid a club line in the paragraph right after the display. +% +% \begin{synopsis}\label{syn:vtiebotdisptop}\label{syn:vtiebotdisptoppar} +% \begin{tabbing} +% \cs{begin}|{vtiebotdisptoppar}|\= \oarg{before-disp-number-of-lines} \\ +% \> \oarg{after-disp-number-of-lines} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{vtiebotdisptoppar}| +% \end{tabbing} +% \end{synopsis} +% +% Vertically tie the last \meta{before\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} in the +% paragraph before a display and the first +% \meta{after\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} in the paragraph after the display. +% Moreover, turn the paragraphs and the display into an un-breakable unit.\footnote{The +% paragraphs and the display are concreted together by setting both \cs{predisplaypenalty} +% and~\cs{postdisplaypenalty} to~10000.} +% +% Zero or one for \meta{before-disp-number\hyp{}of\hyp{}lines} as well as +% \meta{after\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} are no-ops for the respective +% paragraph. Up to nine lines each can be fused. +% +% Both optional arguments default to three. If only the first argument is given the second +% acquires the same value. +% +% +% To use the function bracket the paragraphs before and after the display: +% +% \begin{codeexample} +% \cs{begin}\{vtiebotdisptoppar\} \\ +% ~~\% vertically tied paragraph before the math display \\ +% ~~\cs{begin}\{equation\} \\ +% ~~~~\% math \\ +% ~~\cs{end}\{equation\} \\ +% ~~\% vertically tied paragraph after the math display \\ +% \cs{end}\{vtiebotdisptoppar\} +% \end{codeexample} +% +% \smallskip +% +% \noindent +% See also \cref{sec:fill-last-line-gp-environments} for other methods to avoid club or widow +% lines. +% +% \begin{typoginspectpar}{partial-paragraphs} +% \setlength{\smoothraggedrightragwidth}{8pt} +% \paragraph{Partial Paragraphs And Counting Lines.} The top-of-paragraph ties, \cs{vtietop} +% and \code{vtietoppar} count \meta{number\hyp{}of\hyp{}lines} from the beginning of every +% partial paragraph. Each displayed math in the paragraph resets the count. The +% bottom-paragraph ties, \cs{vtiebot}, \code{vtiebotpar}, \cs{vtiebotdisp}, and +% \code{vtiebotdisppar} count backward from the end of each partial paragraph. Again, each +% displayed math in the paragraph resets the count. According to \TeX's rules, a displayed +% math formula always is counted as \emph{three} lines no matter its contents. +% \Cref{tab:partial-paragraph-line-counts} summarizes these rules with the help of an +% example. +% \end{typoginspectpar} +% +% \begin{table} +% \centering +% \caption[Partial paragraph line counts] +% {Exemplary, eight-line paragraph compounded of two partial paragraphs of three and +% two lines and a displayed math formula of arbitrary size sandwiched in between.} +% \label{tab:partial-paragraph-line-counts} +% +% \newcommand*{\clubmark}{\tablenotemark{\dag}} +% \newcommand*{\widowmark}{\tablenotemark{\ddag}} +% +% \begin{tabfigures} +% \begin{tabular}{@{}clcc@{}} +% \toprule +% Continuous & Example & \cs{vtietop}\clubmark & \cs{vtiebot}\widowmark \\ +% Line Number & Contents & Count & Count \\ +% \midrule +% 1 & Text line\textsubscript{1} & 1 & 3 \\ +% 2 & Text line\textsubscript{2} & 2 & 2 \\ +% 3 & Text line\textsubscript{3} & 3 & 1 \\ +% 4 & & & \\ +% 5 & \(\smash{\Biggr\}}\) \parbox[c][0pt]{3.5em}{Display \\[-.12em] math} & & \\ +% 6 & & & \\ +% 7 & Text line\textsubscript{4} & 1 & 2 \\ +% 8 & Text line\textsubscript{5} & 2 & 1 \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% +% \begin{tablenotes} +% \clubmark\enspace +% This is \eTeX's counting scheme of \cs{clubpenalties}; it also holds for +% \code{vtietoppar}. +% +% \widowmark\enspace +% The same counting scheme also holds for \code{vtiebotpar}, \cs{vtiebotdisp}, +% and~\code{vtiebotdisppar}. It is implied by \eTeX's line counts of \cs{widowpenalties} +% and~\cs{displaywidowpenalties} on which the functions of this package are based. +% \end{tablenotes} +% \end{table} +% +% \begin{tips} +% \begin{itemize}[notopsep] +% \item The environments can be combined to arrive at paragraphs that simultaneously are +% protected against club lines and (display) widow lines. +% +% \item For very long derivations that are not interrupted and thus made breakable with the +% help of \cs{intertext}\footnote{Introduced in +% package~\packagename{amsmath}~\cite{package:amsmath}.} or +% \cs{shortintertext}\footnote{Defined in +% package~\packagename{mathtools}~\cite{package:mathtools}.} it is desirable to make the +% display breakable. This is achieved with \cs{allowdisplaybreaks} or the +% environment~\code{breakabledisplay} which will be described +% in~\cref{sec:breakable-display}.\specialsectionendhere +% \end{itemize} +% \end{tips}\unskip +% +% \begin{usecases} +% Fix widows and orphans, e.\,g., those turned up by +% package~\packagename{widows-and-orphans}~\cite{package:widows-and-orphans}.~\visualpar +% Extend the typographic convention of \doublequotes{three to four lines instead of a single +% club or widow line} to a context-dependent number of lines that tries to keep all (well, +% dream on) the information together the reader needs at that particular point. +% \end{usecases} +% +% +% \FloatBarrier +% \subsection{Breakable Displayed Equations}\label{sec:breakable-display}\index{page break} +% +% \DescribeEnv{breakabledisplay} +% Package~\packagename{amsmath}\index{amsmath=\packagename{amsmath} (package)} offers +% \cs{allowdisplaybreaks} to render displayed equations breakable at each of their lines. +% Environment~\cs{breakabledisplay} is a wrapper around it which limits the macro's influence +% to the environment. Furthermore, the default \meta{level} of \code{breakabledisplay} is~3 +% whereas that of \cs{allowdisplaybreaks} is~4. This makes \code{breakabledisplay} less eager +% to break a displayed equation and thus better suited to full automation of the page-breaking +% process. +% +% \begin{synopsis}\label{syn:breakabledisplay} +% \cs{begin}|{breakabledisplay}|\oarg{level} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{breakabledisplay}| +% \end{synopsis} +% +% Environment~|breakabledisplay| simply passes on \meta{level} to \cs{allowdisplaybreaks}. +% \Cref{tab:allowdisplaybreaks-penalties} shows the default penalties that +% \packagename{amsmath} associated with each of the \meta{level}s. +% +% \begin{table} +% \centering +% \caption[Env.~\code{breakabledisplay} and \cs{interdisplaylinepenalty}]% +% {Penalties~\cs{interdisplaylinepenalty} associated with different \meta{level}s of +% environment~\code{breakabledisplay}. Depending on the version of +% package~\packagename{amsmath} the actual penalties may differ.} +% \label{tab:allowdisplaybreaks-penalties} +% +% \newcommand*{\clubmark}{\tablenotemark{\dag}} +% +% \begin{tabfigures} +% \begin{tabular}{@{}ccl@{}} +% \toprule +% \meta{level} & \cs{interdisplay-} & Comment \\ +% {} & \code{linepenalty} & \\ +% \midrule +% 0 & 10000 & no operation \\ +% 1 & \hphantom{0}9999 & \\ +% 2 & \hphantom{0}6999 & \\ +% 3 & \hphantom{0}2999 & default \\ +% 4 & \hphantom{0000}0\rlap{\clubmark} & \\ +% \bottomrule +% \end{tabular} +% \end{tabfigures} +% +% \begin{tablenotes} +% \clubmark\enspace +% This is the default of \cs{allowdisplaybreaks}. +% \end{tablenotes} +% \end{table} +% +% \begin{tips} +% \begin{itemize}[notopsep] +% \item Terminating a line with \code{\textbackslash\textbackslash*} inhibits a break after +% this line. +% +% \item A \cs{displaybreak}\oarg{level} can be set for \emph{each} line of the displayed +% equation separately. \LaTeX{} resumes with the original value of +% \cs{interdisplaylinepenalty} in the following lines. +% +% \item If a discretionary break of the displayed equation is to be accompanied with some aid +% for the reader, team \cs{intertext} (or \cs{shortintertext}) with \cs{displaybreak} as, +% e.\,g., +% +% \begin{codeexample} +% \cs{newcommand*}\{\cs{discretionarydisplaybreak}\} \\ +% 12\=3\=\kill +% \> \{ \> \cs{intertext}\{\cs{hfill} Eq.\textasciitilde cont.\textasciitilde on next page.\}\% \\ +% \> \> \cs{displaybreak} \\ +% \> \> \cs{intertext}\{Eq.\textasciitilde cont.\textasciitilde +% from prev.\textasciitilde page.\cs{hfill}\}\}\specialsectionendhere +% \end{codeexample} +% \end{itemize} +% \end{tips}\unskip +% +% \begin{usecases} +% Extremely long derivations without interspersed \cs{intertext} or +% \cs{shortintertext}.~\visualpar Draft phase of a document. +% \end{usecases} +% +% +% \FloatBarrier +% \clearpage +% \subsection{\packagename{Setspace} Front-End}\label{sec:setspace-frontend} +% +% Package \packagename{setspace} \cite{package:setspace} is a base hit when it comes to +% consistently setting the line skip for a document via the macro~\cs{setstretch}. The +% interface of \cs{setstretch} though is unintuitive as it asks for an obscure +% factor.\fontsizeinfo{setspacefontsizeinfo}\marginnote{In the copy of this document gets +% typeset with~\setspacefontsizeinfo*.} The \LaTeX{} user however prefers to keep her eyes on +% the ball and set the line skip\index{baseline skip} directly (e.\,g.~12.5pt) or the lines' +% leading\index{leading} to a length or percentage of the font's size.\footnote{To find out +% about the current font's size and the \cs{baselineskip} in printable form check out +% \cref{sec:font-information} on \cpageref{sec:font-information}.} This is where the following +% macros go to bat. +% +% \begin{important} +% All macros that are introduced in this section rely on macro~\cs{setstretch}. So +% package~\packagename{setspace} must have been loaded with +% +% \begin{codeexample} +% \cs{usepackage}\{setspace\} +% \end{codeexample} +% +% \noindent +% in the document preamble. +% \end{important} +% +% \DescribeMacro{\setbaselineskip} +% \sinceversion{Since v0.3} +% Set the line skip using an absolute length -- technically: a |dimen|. +% +% \begin{synopsis}\label{syn:setbaselineskip} +% \cs{setbaselineskip}\marg{baseline-skip} +% \end{synopsis} +% +% Set the \cs{baselineskip} to \meta{baseline-skip}. This is what a non-initiated user expects +% from the assignment +% +% \begin{codeexample} +% \cs{setlength}\{\cs{baselineskip}\}\{\meta{baseline-skip}\} +% \end{codeexample} +% +% The \meta{baseline-skip} can contain a rubber (stretch/shrink) component, however, +% \cs{setbaselineskip} will discard of it and issue a warning that only the fixed-length part +% will be used in the computation. +% +% \begin{example} +% Let us assume we want to lighten the gray value of the copy a tad with a \cs{baselineskip} +% increased (from e.g.~12pt) to~12.5pt. To this end we say: +% +% \begin{codeexample} +% \cs{setbaselineskip}\{12.5pt\}\specialsectionendhere +% \end{codeexample} +% \end{example} +% +% \begin{tip} +% To set the \cs{baselineskip} relative to the current value use +% +% \begin{codeexample} +% \cs{setbaselineskip}\{\meta{factor}\cs{baselineskip}\} +% \end{codeexample} +% +% \noindent +% where \meta{factor} is a floating-point number. +% \end{tip} +% +% \DescribeMacro{\resetbaselineskip} +% \sinceversion{Since v0.3} +% Reset the \cs{baselineskip} to its original value. +% +% \begin{synopsis}\label{syn:resetbaselineskip} +% \cs{resetbaselineskip} +% \end{synopsis} +% +% This macro simply expands to |\setstretch{1}|. So, we rely on \packagename{setspace}'s +% notion of what is a single-line \cs{baselineskip}. +% +% +% \DescribeMacro{\setbaselineskippercentage} +% \sinceversion{Since v0.3} +% Set the \cs{baselineskip} with a relative value calculated as a percentage of the current +% font's design size. +% +% \begin{synopsis}\label{syn:setbaselineskippercentage} +% \cs{setbaselineskippercentage}\marg{baselineskip-percentage} +% \end{synopsis} +% +% Set \cs{baselineskip} to \(\cs{typogfontsize} \times \meta{baselineskip-percentage} / 100\). +% +% \begin{example} +% We modify the previous example and assume a font design size of 10pt, but now write +% +% \begin{codeexample} +% \cs{setbaselineskippercentage}\{125\} +% \end{codeexample} +% +% \noindent +% which sets \cs{baselineskip} to \(10\text{pt} \times 125 / 100 = 12.5\text{pt}\). +% \end{example} +% +% \DescribeMacro{\setleading} +% \sinceversion{Since v0.3} +% Set the \cs{baselineskip} with an absolute length that gets \emph{added to} \cs{typogfontsize}. +% +% \begin{synopsis}\label{syn:setleading} +% \cs{setleading}\marg{leading} +% \end{synopsis} +% +% Set the \cs{baselineskip} to \cs{typogfontsize} plus \meta{leading}. Note that +% \meta{leading} can be negative, e.\,g.~to set solid. +% +% \begin{example} +% Another solution of the previous example, given a font design size of 10pt is to write +% +% \begin{codeexample} +% \cs{setleading}\{2.5pt\} +% \end{codeexample} +% +% \noindent +% which sets \cs{baselineskip} to \(10\text{pt} + 2.5\text{pt} = 12.5\text{pt}\). +% \end{example} +% +% \DescribeMacro{\setleadingpercentage} +% \sinceversion{Since v0.3} +% Set the \cs{baselineskip} to \cs{typogfontsize} \emph{plus} a relative value calculated as a +% percentage of \cs{typogfontsize}. +% +% \begin{synopsis}\label{syn:setleadingpercentage} +% \cs{setleadingpercentage}\marg{leading-percentage} +% \end{synopsis} +% +% Set \cs{baselineskip} to \(\cs{typogfontsize} \times (1 + \meta{leading-percentage} / 100)\). +% +% \begin{example} +% We modify the previous example and again assume a font design size of 10pt, but now write +% +% \begin{codeexample} +% \cs{setleadingpercentage}\{25\} +% \end{codeexample} +% +% \noindent +% which sets \cs{baselineskip} to \(10\text{pt} \times (1 + 25 / 100) = 12.5\text{pt}\). +% \end{example} +% +% \smallskip +% +% \DescribeLaTeXDimen{\typogfontsize} +% \sinceversion{Since v0.3} +% The macros \cs{setbaselineskippercentage}, \cs{setleading}, and \cs{setleadingpercentage} all +% depend on the font size. By changing \cs{typogfontsize} they can be configured for different +% font sizes. +% +% The length \cs{typogfontsize} gets initialized at the end of the preamble to the default +% font's quad size:\footnote{For an overview of the various +% \cs{fontdimen}\meta{number}~parameters consult \cref{tab:fontdimen} on +% \cpageref{tab:fontdimen}.} +% +% \begin{codeexample} +% \cs{typogfontsize}=\cs{fontdimen6}\cs{font} +% \end{codeexample} +% +% \noindent +% which is also called its \doublequotes{nominal size} or its \doublequotes{design size}. This +% assignment can be repeated at any point in the document to record a reference font's size. +% To set just \cs{typogfontsize} without changing the current font, encapsulate the font change +% in a group and export the new value: +% +% \begin{codeexample} +% \cs{begingroup} \\ +% ~~\cs{usefont}\{T1\}\{Arvo-TLF\}\{m\}\{n\}\cs{selectfont} \\ +% ~~\cs{normalsize} \\ +% ~~\cs{global}\cs{typogfontsize}=\cs{fontdimen6}\cs{font} \\ +% \cs{endgroup} +% \end{codeexample} +% +% An alternative to relying on the design size is using the actual size of an uppercase letter: +% +% \begin{codeexample} +% \cs{settoheight}\{\cs{typogfontsize}\}\{CEMNORSUVWXZ\} +% \end{codeexample} +% +% \noindent +% With \cs{typogfontsize} defined this way it becomes trivial to set solid: +% +% \begin{codeexample} +% \cs{setleading}\{0pt\} +% \end{codeexample} +% +% \noindent +% or +% +% \begin{codeexample} +% \cs{setleadingpercentage}\{0\} +% \end{codeexample} +% +% \begin{tip} +% All macros in this section actually accept expressions of their respective argument types, +% though the sick rules of \TeX{} \meta{dimen}- and \meta{skip}-expressions apply. +% +% Here are some forms that do work: +% +% \begin{codeexample} +% \cs{setbaselineskip}\{12pt + 0.6667pt\} \\ +% \cs{setbaselineskip}\{12pt * 110 / 100\} \\ +% \cs{setbaselineskippercentage}\{100 + 25\} \\ +% \cs{setleading}\{1pt / -2.0\} \\ +% \cs{setleadingpercentage}\{10 - 25 / 2\}\specialsectionendhere +% \end{codeexample} +% \end{tip} +% +% +% \FloatBarrier +% \clearpage +% \subsection{Smooth Ragged}\label{sec:smooth-ragged}\index{ragged right} +% +% \begin{whittyquote} +% The attention someone gives \\ +% to what he or she makes \\ +% is reflected in the end result, \\ +% whether it is obvious or not. \\ +% \capitalemdash*~\propername{Erik Spiekermann} +% \end{whittyquote} +% +% \noindent +% Package \packagename{typog} implements a novel approach to typeset ragged paragraphs. +% Instead of setting the glue inside of a paragraph to zero and letting the line-widths vary +% accordingly~\cite{wermuth:2020} we prescribe the line-widths with the \cs{parshape}~primitive +% and leave alone the stretchability or shrinkability of the glue. +% +% \begin{slightlysloppypar} +% \hangindent=5.5em\hangafter=-5 +% \DescribeEnv{smoothraggedrightshapetriplet} +% \DescribeEnv{smoothraggedrightshapequintuplet} +% \DescribeEnv{smoothraggedrightshapeseptuplet} +% We introduce three environments that allow for setting three, five, or seven different +% line-lengths: \code{smoothraggedrightshapetriplet}, +% \code{smoothraggedrightshapequintuplet}, and \code{smoothraggedrightshapeseptuplet}; they +% work for paragraphs up to +% \makeatletter +% \typog@triplet@max@lines, \typog@quintuplet@max@lines, or \typog@septuplet@max@lines~lines, +% \makeatother +% respectively. +% \end{slightlysloppypar} +% +% +% \begin{maxipage} +% \begin{synopsis}\label{syn:smoothraggedrightshapetriplet}\label{syn:smoothraggedrightshapequintuplet}\label{syn:smoothraggedrightshapeseptuplet} +% \cs{begin}|{smoothraggedrightshapetriplet}|\oarg{option\dots}\marg{width1}\marg{width2}\marg{width3} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{smoothraggedrightshapetriplet}| \\[\smallskipamount] +% \cs{begin}|{smoothraggedrightshapequintuplet}|\oarg{option\dots}\marg{width1}\marg{width2}\dots\marg{width5} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{smoothraggedrightshapequintuplet}| \\[\smallskipamount] +% \cs{begin}|smoothraggedrightshapeseptuplet|\oarg{option\dots}\marg{width1}\marg{width2}\dots\marg{width7} +% \hspace*{1em}\dots \\ +% \cs{end}|{smoothraggedrightshapeseptuplet}| +% \end{synopsis} +% \end{maxipage} +% +% The environments take \(N\) = 3, 5, or~7 mandatory line-width parameters, where each +% \meta{width\itcorr{3}I}, \(I = 1,\dots, N\) is a skip, i.\,e.,~a dimen that can include some +% glue. +% +% +% \paragraph{Options} +% +% \begin{description}[style=nextline] +% \item[|leftskip=|\meta{dim}] +% Set the left margin for the smooth ragged paragraph to \meta{dim}. Similar to the \TeX{} +% parameter~\cs{leftskip}. +% +% \item[|parindent=|\meta{dim}] +% Set the first-line indent for the smooth ragged paragraph to \meta{dim}. Similar to the +% \TeX{} parameter~\cs{parindent}. +% \end{description} +% +% \noindent +% \DescribeEnv{smoothraggedrightpar} +% Environment~|smoothraggedrightpar| builds upon the three generators. It typesets a single +% paragraph with a given \meta{ragwidth} of the ragged, right margin, where the rag~width is +% the length-difference of the longest and the shortest lines. +% +% \begin{synopsis}\label{syn:smoothraggedrightpar} +% \cs{begin}|{smoothraggedrightpar}|\oarg{option\dots} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{smoothraggedrightpar}| +% \end{synopsis} +% +% The line lengths equally divide the ragged margin, i.\,e., they are arithmetic means with +% respect to the generator size. +% +% \iffalse +%<*smoothparshapes> +prologues := 3; + +def draw_filled_rectangle(expr lower_left, upper_right, color) = + fill lower_left -- (xpart upper_right, ypart lower_left) -- + upper_right -- (xpart lower_left, ypart upper_right) -- + cycle + withcolor color; +enddef; + + +u := 100; + +em := 10; +linelength := 2u; +baselineskip := 1.2em; +parskip := 3; +parindent := 2.5em; +ragwidth := 2em; + +cmykcolor line_color; +line_color := (.08, 0, 0, .18); % cold silver + +color customred[]; +customred[1] := (.890, .282, .282); +customred[2] := (.831, .110, .110); +customred[3] := (.686, .043, .043); +customred[4] := (.569, .000, .000); +customred[5] := (.420, .000, .000); + +color margin_color; +margin_color := customred[2]; + + +beginfig(1); % triplet + y := 0; + draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (3) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - ragwidth/2, y + 1em), line_color); % (2) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (3) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - ragwidth/2, y + 1em), line_color); % (2) + + draw_filled_rectangle((-.667em, 1em), (-.333em, -5baselineskip), margin_color); + draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -5baselineskip), margin_color); +endfig; + + +beginfig(2); % quintuplet + y := 0; + draw_filled_rectangle((0, y), (linelength - .75ragwidth, y + 1em), line_color); % (2) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (5) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (3) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .25ragwidth, y + 1em), line_color); % (4) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .75ragwidth, y + 1em), line_color); % (2) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (5) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (3) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .25ragwidth, y + 1em), line_color); % (4) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1) + + draw_filled_rectangle((-.667em, 1em), (-.333em, -9baselineskip), margin_color); + draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -9baselineskip), margin_color); +endfig; + + +beginfig(3); % septuplet + y := 0; + draw_filled_rectangle((0, y), (linelength - .6667ragwidth, y + 1em), line_color); % (3) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .1667ragwidth, y + 1em), line_color); % (6) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .3333ragwidth, y + 1em), line_color); % (5) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .8333ragwidth, y + 1em), line_color); % (2) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (7) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (4) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .6667ragwidth, y + 1em), line_color); % (3) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .1667ragwidth, y + 1em), line_color); % (6) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .3333ragwidth, y + 1em), line_color); % (5) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .8333ragwidth, y + 1em), line_color); % (2) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (7) + y := y - baselineskip; + draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (4) + + draw_filled_rectangle((-.667em, 1em), (-.333em, -13baselineskip), margin_color); + draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -13baselineskip), margin_color); +endfig; +end +%</smoothparshapes> +% \fi +% +% \begin{itemize}[noindent] +% \item +% \begin{minipage}[t]{\linewidth} +% The triplet generator repeats a \emph{short~line -- long~line -- middle-length~line} +% sequence. Shown below are two complete cycles. +% +% \begin{center} +% \includegraphics{smooth-parshapes-1.mps} +% \end{center} +% \end{minipage} +% +% \item +% \begin{minipage}[t]{\linewidth} +% The quintuplet generator varies the theme of the triplets and avoids the +% \singlequotes{ladder} of lines~2\figuredash3\figuredash4 (or, if numbered by +% cycle:~1.2\figuredash1.3\figuredash2.1) there. Shown here are two cycles. +% +% \begin{center} +% \includegraphics{smooth-parshapes-2.mps} +% \end{center} +% \end{minipage} +% +% \item +% \begin{minipage}[t]{\linewidth} +% The septuplet generator uses a permutation that looks \singlequotes{random}. At least it +% hides the boundaries of cycles well. Shown here are two of them. +% +% \begin{center} +% \includegraphics{smooth-parshapes-3.mps} +% \end{center} +% \end{minipage} +% \end{itemize} +% +% \noindent +% \DescribeEnv{smoothraggedright} +% Environment~|smoothraggedright| is the multi-paragraph version of +% \code{smoothraggedrightpar}. It takes the same optional arguments. +% +% \begin{synopsis}\label{syn:smoothraggedright} +% \cs{begin}|{smoothraggedright}|\oarg{option\dots} \\ +% \hspace*{1em}\dots \\ +% \cs{end}|{smoothraggedright}| +% \end{synopsis} +% +% +% \paragraph{Options} +% +% \begin{description}[style=nextline] +% \item[|linewidth=|\meta{dim}] +% Override the length of the longest line. The default line-width is \cs{linewidth}. +% \end{description} +% +% +% \paragraph{Global Parameters} +% +% \begin{description}[style=nextline] +% \item[\cs{smoothraggedrightfuzzfactor}=\meta{factor}] +% The environment adds glue to every line-width\footnote{The shortest line only gets +% stretchability, the longest only receives shrinkability. All other lines are both +% stretchable and shrinkable.} to achieve a more convincing \doublequotes{ragged appearance} +% and to reduce the number of overfull lines. The algorithm divides the smooth margin into +% 3, 5, or~7 parts depending on the chosen \cs{smoothraggedrightgenerator} (see below). The +% \cs{smoothraggedrightfuzzfactor} is the amount of glue of each line expressed as a multiple +% of the distance between the division points. The default of 1.0 means to add as much glue +% such that the lines just do not overlap (assuming justification is feasible). +% +% \item[\cs{smoothraggedrightgenerator}] +% Select a generator to use. Valid generator names: +% \begin{itemize}[noitemsep] +% \item |triplet|, +% \item |quintuplet|, +% \item |septuplet|. +% \end{itemize} +% +% The default generator is |triplet|. +% +% \item[\cs{smoothraggedrightleftskip}=\meta{dim}] +% Value for |leftskip| to pass to the generator. Default:~0pt. +% +% \item[\cs{smoothraggedrightparindent}=\meta{dim}] +% Value for |parindent| to pass to the generator. Default:~0pt. +% +% \item[\cs{smoothraggedrightragwidth}=\meta{dim}] +% Value for the width of the ragged right margin. Default:~2em. +% \end{description} +% +% \begin{usecases} +% Replacement for \cs{RaggedRight}~\cite{package:ragged2e}.~\visualpar Design alternative for +% fully justified paragraphs if used with a small rag-width. +% \end{usecases} +% +% +% \addtocontents{toc}{\par\bigskip\hfill\textit{Table of Contents continued on next page.}} +% \addtocontents{toc}{\clearpage} +% +% +% \sectionfinish +% \clearpage +% \section{Other Packages for Fine \LaTeX~Typography}\label{sec:other-typography-packages} +% +% Many other packages help with getting better output from \LaTeX. Here is a list --~in +% alphabetical order~-- of the ones the author considers particularly valuable. +% +% \sbox{\listlabelbox}{\packagename{microtype}} +% \begin{description}[font=\normalfont, labelsep*=1em, labelwidth=\wd\listlabelbox, leftmargin=!] +% \item[\packagename{enumitem}] +% Flexible and consistent definition of all basic \LaTeX-list types plus inline +% lists~\cite{package:enumitem}. +% +% \item[\packagename{geometry}] +% Powerful and sophisticated setup of the page layout~\cite{package:geometry}. Best +% accompanied by \packagename{layout}~\cite{package:layout} to visualize the page geometries. +% +% \item[\packagename{hyphenat}] +% Hyphens that do not inhibit further auto-hyphenation of a compound +% word~\cite{package:hyphenat}. +% +% \item[\packagename{microtype}] +% Fine control of spacing, tracking, sidebearings, character protrusion into the margins, +% font expansion, and much more~\cite{package:microtype}. +% +% See also \propername{Khirevich's} discussion~\cite{khirevich:2013}. +% +% \item[\packagename{ragged2e}] +% Improved versions of environments |raggedleft|, |raggedright|, and +% |center|~\cite{package:ragged2e}. +% +% \item[\packagename{setspace}] +% Consistently set the document's line-spacing, i.\,e., +% \cs{baselineskip}~\cite{package:setspace}. +% \end{description} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% \MaybeStop{ +% \sectionfinish +% \clearpage +% \section{typog-grep} +% \label{app:typog-grep} +% +% The companion program \programname{typog-grep} for analyzing the output of +% \hyperref[syn:typoginspect]{\code{typoginspect}} and +% \hyperref[syn:typoginspect]{\code{typoginspectpar}} has its own manual page. We reproduce +% it here for completeness of the documentation. +% +% \begin{suspendshortverb} +% \setlength{\parindent}{0pt} +% \setlength{\parskip}{6.0pt plus 2.0pt minus .5pt} +% \input typog-grep +% \end{suspendshortverb} +% +% \sectionfinish +% \clearpage +% \phantomsection +% \resetfancyhead +% \addcontentsline{toc}{section}{Change History} +% \PrintChanges +% +% \sectionfinish +% \clearpage +% \phantomsection +% \addcontentsline{toc}{section}{References} +% \begin{RaggedRight} +% \begin{thebibliography}{88} +% \bibitem{abrahams:2020} +% \bibauthor{Abrahams, Paul~W.}, +% \bibauthor{Hargreaves, Kathryn~A.,} and +% \bibauthor{Karl Berry}. +% \bibtitle{\TeX{} for the Impatient}. +% 2020, +% \biburl{http://tug.ctan.org/info/impatient/book.pdf}. +% +% \bibitem{package:amsmath} +% \bibauthor{American Mathematical Society} and the +% \bibauthor{\LaTeXIII\ Project Team}. +% \bibtitle{Package~\packagename{amsmath}}. +% 2020, +% \biburl{https://ctan.org/pkg/amsmath}. +% +% \bibitem{package:cite} +% \bibauthor{Arseneau, Donald}. +% \bibtitle{Package~\packagename{cite}}. +% 2015, +% \biburl{https://ctan.org/pkg/cite}. +% +% \bibitem{package:enumitem} +% \bibauthor{Bezos, Javier}. +% \bibtitle{Package~\packagename{enumitem}}. +% 2019, +% \biburl{https://ctan.org/pkg/enumitem}. +% +% \bibitem{package:babel} +% \bibauthor{Bezos, Javier}. +% \bibtitle{Package~\packagename{babel}}. +% 2021, +% \biburl{https://ctan.org/pkg/babel}. +% The original author of package~\packagename{babel} was \bibauthor{J. L. Braams}. +% +% \bibitem{package:etex} +% \bibauthor{Breitenlohner, Peter} and +% the \bibauthor{\(\mathcal{N\kern-.1em\raisebox{-.2em}{T}\kern-.1emS}\)~Team}. +% \bibtitle{\eTeX}. +% 1998, +% \biburl{https://mirrors.ctan.org/systems/doc/etex/etex_man.pdf}. +% +% \bibitem{carlisle:1996} +% \bibauthor{Carlisle, David}. +% \bibtitle{Russian Paragraph Shapes}. +% Baskerville, 6(1), 13\figuredash15, +% 1996, +% \biburl{http://uk-tug-archive.tug.org/wp-installed-content/uploads/2008/12/61.pdf}. +% +% \bibitem{carlisle:2013} +% \bibauthor{Carlisle, David}. +% \bibtitle{What do different \cs{fontdimen<num>} mean}. +% 2013\figuredash*1\figuredash*2, +% \biburl{https://tex.stackexchange.com/questions/88991/what-do-different-fontdimennum-mean}. +% +% \bibitem{package:cleveref} +% \bibauthor{Cubitt, Toby}. +% \bibtitle{Package~\packagename{cleveref}}. +% 2018, +% \biburl{https://ctan.org/pkg/cleveref}. +% +% \bibitem{eijkhout:2007} +% \bibauthor{Eijkhout, Victor}. +% \bibtitle{\TeX\ By Topic, A Texnician's Reference}. +% 2007, +% \biburl{https://www.eijkhout.net/tex/tex-by-topic.html}. +% +% \bibitem{package:mathtools} +% \bibauthor{H{\o}gholm, Morten}, +% \bibauthor{Madsen, Lars} and +% the \bibauthor{\LaTeXIII\ Project Team}. +% \bibtitle{Package~\packagename{mathtools}}. +% 2020, +% \biburl{https://ctan.org/pkg/mathtools}. +% +% \bibitem{khirevich:2013} +% \bibauthor{Khirevich, Siarhei}. +% \bibtitle{Tips on Writing a Thesis in \LaTeX}. +% 2013, +% \biburl{http://www.khirevich.com/latex/microtype}. +% +% \bibitem{knuth:1986} +% \bibauthor{Knuth, Donald Ervin}. +% \bibtitle{The \TeX{}book}. +% Addison Wesley, Reading\kernedslash MA, +% 1986. +% +% \bibitem{package:layout} +% \bibauthor{McPherson, Kent}. +% \bibtitle{Package~\packagename{layout}}. +% 2014, +% \biburl{https://ctan.org/pkg/layout}. +% The package was converted to \LaTeXe\ by \bibauthor{J. L. Braams} +% and modified by \bibauthor{H. Umeki}. +% +% \bibitem{middendorp:2014} +% \bibauthor{Middendorp, Jan}. +% \bibtitle{Shaping Text}. +% \acronym{BIS}~publishers, Amsterdam, +% 2014. +% +% \bibitem{mittelbach:2018c} +% \bibauthor{Mittelbach, Frank}. +% \bibtitle{Managing forlorn paragraph lines (a.\,k.\,a.~widows and orphans) in \LaTeX}. +% TUGboat, 39(3), 246\figuredash251, 2018, +% \biburl{https://tug.org/TUGboat/tb39-3/tb123mitt-widows.pdf}. +% +% \bibitem{package:widows-and-orphans} +% \bibauthor{Mittelbach, Frank}. +% \bibtitle{Package~\packagename{widows-and-orphans}}. +% 2020, +% \biburl{https://ctan.org/pkg/widows-and-orphans}. +% +% \bibitem{package:hyperref} +% \bibauthor{Rahtz, Sebastian,} and \bibauthor{Frank Mittelbach}. +% \bibtitle{Package~\packagename{hyperref}}. +% 2020, +% \biburl{https://ctan.org/pkg/hyperref}. +% The package is maintained by the \LaTeXIII~Project Team. +% +% \bibitem{package:microtype} +% \bibauthor{Schlicht, Robert}. +% \bibtitle{Package~\packagename{microtype}}. +% 2020, +% \biburl{https://ctan.org/pkg/microtype}. +% +% \bibitem{package:ragged2e} +% \bibauthor{Schr\"oder, Martin}. +% \bibtitle{Package~\packagename{ragged2e}}. +% 2019, +% \biburl{https://ctan.org/pkg/ragged2e}. +% +% \bibitem{solomon:1990} +% \bibauthor{Solomon, David}. +% \bibtitle{Output Routines: Examples and Techniques. Part~I: Introduction and Examples}. +% TUGboat, 11(1), 69\figuredash85, 1990, +% \biburl{http://www.tug.org/TUGboat/Articles/tb11-1/tb27salomon.pdf}. +% +% \bibitem{package:setspace} +% \bibauthor{Tobin, Geoffrey,} and \bibauthor{Robin Fairbairns}. +% \bibtitle{Package~\packagename{setspace}}. +% 2011, +% \biburl{https://ctan.org/pkg/setspace}. +% +% \bibitem{package:geometry} +% \bibauthor{Umeki, Hideo}. +% \bibtitle{Package~\packagename{geometry}}. +% 2020, +% \biburl{https://ctan.org/pkg/geometry}. +% +% \bibitem{wermuth:2016} +% \bibauthor{Wermuth, Udo}. +% \bibtitle{Tracing paragraphs}. +% TUGboat, 37(3), 358\figuredash373, 2016, +% \biburl{https://tug.org/TUGboat/tb37-3/tb117wermuth.pdf}. +% +% \bibitem{wermuth:2017a} +% \bibauthor{Wermuth, Udo}. +% \bibtitle{The optimal value for \cs{emergencystretch}}. +% TUGboat, 38(1), 65\figuredash86, 2017, +% \biburl{https://tug.org/TUGboat/tb38-1/tb118wermuth.pdf}. +% +% \bibitem{wermuth:2017c} +% \bibauthor{Wermuth, Udo}. +% \bibtitle{A note on \cs{linepenalty}}. +% TUGboat, 38(3), 400\figuredash414, 2017, +% \biburl{https://tug.org/TUGboat/tb38-3/tb120wermuth.pdf}. +% +% \bibitem{wermuth:2018} +% \bibauthor{Wermuth, Udo}. +% \bibtitle{Experiments with \cs{parfillskip}}. +% TUGboat, 39(3), 276\figuredash303, 2018, +% \biburl{https://tug.org/TUGboat/tb39-3/tb123wermuth-parfillskip.pdf}. +% +% \bibitem{wermuth:2020} +% \bibauthor{Wermuth, Udo}. +% \bibtitle{An attempt at ragged-right typesetting}. +% TUGboat, 41(1), 73\figuredash94, 2020, +% \biburl{https://tug.org/TUGboat/tb41-1/tb127wermuth-ragged.pdf}. +% +% \bibitem{wermuth:2022-8-2} +% \bibauthor{Wermuth, Udo}. +% Personal communication. +% August~2, 2022. +% +% \bibitem{wermuth:2023} +% \bibauthor{Wermuth, Udo}. +% \bibtitle{Vertical alignments in plain \TeX}. +% TUGboat, 44(3), 427\figuredash440, 2023, +% \biburl{https://tug.org/TUGboat/tb44-3/tb138wermuth-valign.pdf}. +% +% \bibitem{package:hyphenat} +% \bibauthor{Wilson, Peter}. +% \bibtitle{Package~\packagename{hyphenat}}. +% 2004, +% \biburl{https://ctan.org/pkg/hyphenat}. +% The package is maintained by \bibauthor{W. Robertson}. +% +% \bibitem{wilson:2007} +% \bibauthor{Wilson, Peter}. +% \bibtitle{Glisterings}. +% TUGboat, 28(2), 229\figuredash232, 2007, +% \biburl{https://tug.org/TUGboat/tb28-2/tb89glister.pdf}. +% +% \bibitem{package:needspace} +% \bibauthor{Wilson, Peter}. +% \bibtitle{Package~\packagename{needspace}}. +% 2010, +% \biburl{https://ctan.org/pkg/needspace}. +% The package is maintained by \bibauthor{W. Robertson}. +% \end{thebibliography} +% \end{RaggedRight} +% +% \sectionfinish +% \clearpage +% \begin{RaggedRight} +% \setcounter{IndexColumns}{2} +% \setlength{\columnsep}{30pt} +% \label{sec:index} +% \phantomsection +% \addcontentsline{toc}{section}{Index} +% \PrintIndex +% \end{RaggedRight} +% } +% +% +% \sectionfinish +% \clearpage +% \appendix +% \section{Package Code}\label{sec:package-code} +% \addtocontents{toc}{\begingroup\small} +% \addtocontents{toc}{\protect\begin{multicols}{2}} +% \addtocontents{toc}{\protect\raggedcolumns} +% +% This is the \doublequotes{Reference Manual}~section of the documentation +% where we describe the package's code +% and explain its implementation details. +% +% +% \begin{macrocode} +%<*package> +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{typog} + [2024/05/07 v0.3 TypoGraphic extensions] + +\RequirePackage{etoolbox} +\RequirePackage{everyhook} +\RequirePackage{xkeyval} + +% \end{macrocode} +% +% \bigskip +% +% \subsection*{Declarations of Lengths, Skips, etc.} +% +% \begin{macro}{\typog@TYPOG} +% Define a macro that unequivocally identifies this very package. +% +% \begin{macrocode} +\newcommand*{\typog@TYPOG}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typoglogo} +% We have our own, low-key logo. +% +% \begin{macrocode} +\newcommand*{\typoglogo}{\textsf{T\itcorr*{-5}\textsl{y}poG}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\iftypog@debug} +% Our switch for debug information. +% +% \begin{macrocode} +\newif\iftypog@debug +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@typeout} +% Our debug information printer. +% +% \begin{macrocode} +\newcommand*{\typog@typeout}[1] + {\iftypog@debug + \typeout{typog: #1}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@trim@spaces} +% Pull \cs{tl\_trim\_spaces} into the \singlequotes{classic} namespace. +% +% \begin{macrocode} +\ExplSyntaxOn +\let\typog@trim@spaces=\tl_trim_spaces:o +\ExplSyntaxOff + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@register@pdfsubstitute} +% We often need to register (simple) substitute commands +% suitable for \acronym{PDF}~bookmarks. +% This is a convenient abbreviation for that task. +% +% \begin{macrocode} +\newcommand{\typog@register@pdfsubstitute}[1]{% + \AtBeginDocument{% + \ifdefined\pdfstringdefDisableCommands + \pdfstringdefDisableCommands{#1}% + \fi}} + +% \end{macrocode} +% \end{macro} +% +% Some functionality depends on package~\packagename{microtype}. +% To complicate matters for certain setup operations, e.\,g., \cs{SetExpansion}, +% \packagename{microtype} must be loaded \emph{before} package~\packagename{typog}, +% a fact that we encode in \cs{iftypog@microtype@preloaded}. +% +% \begin{macro}{\iftypog@microtype@preloaded} +% \begin{macrocode} +\newif\iftypog@microtype@preloaded + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@require@preloaded@microtype} +% It is easy to determine whether \packagename{microtype} has been sourced. +% We raise to the occasion and define a pair of check macros +% which simplify the test for the correct \packagename{microtype} load~state. +% +% \begin{macrocode} +\ifdefined\MT@MT + \typog@typeout{package microtype preloaded}% + \typog@microtype@preloadedtrue + \def\typog@require@preloaded@microtype{\relax} +\else + \typog@microtype@preloadedfalse + \def\typog@require@preloaded@microtype + {\PackageError{typog}% + {package microtype not (pre-)loaded}% + {package microtype must be loaded before package typog}} +\fi + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\iftypog@microtype@loaded} +% \begin{macrocode} +\newif\iftypog@microtype@loaded + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@require@microtype} +% This code duplicates \cs{typog@require@preloaded@microtype}; +% the only difference is that we call the test \emph{after} the preamble was processed. +% +% \begin{macrocode} +\AtBeginDocument{ + \ifdefined\MT@MT + \typog@typeout{package microtype loaded}% + \typog@microtype@loadedtrue + \def\typog@require@microtype{\relax} + \else + \typog@microtype@loadedfalse + \def\typog@require@microtype + {\PackageError{typog}% + {package microtype not loaded}% + {require package microtype before package typog}}% + \fi +} + +% \end{macrocode} +% \end{macro} +% +% Our own state\dots +% +% \begin{macro}{\typog@mathitalicscorrection} +% \begin{macrocode} +\newmuskip\typog@mathitalicscorrection +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@textitalicscorrection} +% \begin{macrocode} +\newlength{\typog@textitalicscorrection} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@ligaturekern} +% \begin{macrocode} +\newlength{\typog@ligaturekern} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@raisecapitaldash} +% \begin{macrocode} +\newlength{\typog@raisecapitaldash} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@raisecapitalguillemets} +% \begin{macrocode} +\newlength{\typog@raisecapitalguillemets} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@raisecapitalhyphen} +% \begin{macrocode} +\newlength{\typog@raisecapitalhyphen} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@raisecapitaltimes} +% \begin{macrocode} +\newlength{\typog@raisecapitaltimes} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@raiseguillemets} +% \begin{macrocode} +\newlength{\typog@raiseguillemets} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@raisefiguredash} +% \begin{macrocode} +\newlength{\typog@raisefiguredash} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@slashkern} +% \begin{macrocode} +\newlength{\typog@slashkern} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@breakpenalty} +% \begin{macrocode} +\newcommand*{\typog@breakpenalty}{\exhyphenpenalty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@dim@unit} +% We would like to express the argument values +% for example of \cs{kernedhyphen*} and \cs{kernedhyphen} +% as multiples of a thousandth of an~em. +% Therefore, we define a dimen as \doublequotes{base unit} which simplifies matters greatly. +% +% \begin{macrocode} +\newlength{\typog@dim@unit} +\setlength{\typog@dim@unit}{.001em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@trackingttspacing} +% \begin{macrocode} +\newcommand*{\typog@trackingttspacing}{300, 90, 60} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@default@shrink@i} +% The default configuration for shrink values. +% +% \begin{macrocode} +\newcommand*{\typog@default@shrink@i}{5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@default@shrink@ii} +% \begin{macrocode} +\newcommand*{\typog@default@shrink@ii}{10} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@default@shrink@iii} +% \begin{macrocode} +\newcommand*{\typog@default@shrink@iii}{20} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@shrink@i} +% Configurable shrink values. +% Initialized from the \code{typog@default@shrink@} set. +% +% \begin{macrocode} +\newcommand*{\typog@shrink@i}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@shrink@ii} +% \begin{macrocode} +\newcommand*{\typog@shrink@ii}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@shrink@iii} +% \begin{macrocode} +\newcommand*{\typog@shrink@iii}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@default@stretch@i} +% The default configuration for stretch values. +% +% \begin{macrocode} +\newcommand*{\typog@default@stretch@i}{5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@default@stretch@ii} +% \begin{macrocode} +\newcommand*{\typog@default@stretch@ii}{10} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@default@stretch@iii} +% \begin{macrocode} +\newcommand*{\typog@default@stretch@iii}{20} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@stretch@i} +% Configurable stretch values. +% Initialized from the \code{typog@default@stretch} set. +% +% \begin{macrocode} +\newcommand*{\typog@stretch@i}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@stretch@ii} +% \begin{macrocode} +\newcommand*{\typog@stretch@ii}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@stretch@iii} +% \begin{macrocode} +\newcommand*{\typog@stretch@iii}{} +% \end{macrocode} +% \end{macro} +% +% \iffalse + +\def\typog@one@of@three#1,#2,#3\relax{\typog@trim@spaces{#1}} +\def\typog@two@of@three#1,#2,#3\relax{\typog@trim@spaces{#2}} +\def\typog@three@of@three#1,#2,#3\relax{\typog@trim@spaces{#3}} + +\newcommand*{\typog@triple@get@i}[1]{\expandafter\typog@one@of@three #1\relax} +\newcommand*{\typog@triple@get@ii}[1]{\expandafter\typog@two@of@three #1\relax} +\newcommand*{\typog@triple@get@iii}[1]{\expandafter\typog@three@of@three #1\relax} + +\newcommand*{\typog@set@shrink@limits} + {\edef\typog@@star{*}% + \edef\typog@@limit{\typog@triple@get@i{\typog@shrinklimits}}% + \unless\ifx\typog@@limit\typog@@star\edef\typog@shrink@i{\number\typog@@limit}\fi + \edef\typog@@limit{\typog@triple@get@ii{\typog@shrinklimits}}% + \unless\ifx\typog@@limit\typog@@star\edef\typog@shrink@ii{\number\typog@@limit}\fi + \edef\typog@@limit{\typog@triple@get@iii{\typog@shrinklimits}}% + \unless\ifx\typog@@limit\typog@@star\edef\typog@shrink@iii{\number\typog@@limit}\fi} + +\newcommand*{\typog@set@stretch@limits} + {\edef\typog@@star{*}% + \edef\typog@@limit{\typog@triple@get@i{\typog@stretchlimits}}% + \unless\ifx\typog@@limit\typog@@star\edef\typog@stretch@i{\number\typog@@limit}\fi + \edef\typog@@limit{\typog@triple@get@ii{\typog@stretchlimits}}% + \unless\ifx\typog@@limit\typog@@star\edef\typog@stretch@ii{\number\typog@@limit}\fi + \edef\typog@@limit{\typog@triple@get@iii{\typog@stretchlimits}}% + \unless\ifx\typog@@limit\typog@@star\edef\typog@stretch@iii{\number\typog@@limit}\fi} + +\DeclareOptionX<typog>{breakpenalty}% + {\renewcommand*{\typog@breakpenalty}{#1}} +\DeclareOptionX<typog>{debug}{\typog@debugtrue} +\DeclareOptionX<typog>{mathitalicscorrection}[.4mu]% + {\typog@mathitalicscorrection=#1\relax}% +\DeclareOptionX<typog>{nodebug}{\typog@debugfalse} +\DeclareOptionX<typog>{textitalicscorrection}[.02em]% + {\setlength{\typog@textitalicscorrection}{#1}} +\DeclareOptionX<typog>{ligaturekern}[.033333em]% + {\setlength{\typog@ligaturekern}{#1}} +\DeclareOptionX<typog>{raisecapitaldash}[\z@]% + {\setlength{\typog@raisecapitaldash}{#1}} +\DeclareOptionX<typog>{raisecapitalguillemets}[\z@]% + {\setlength{\typog@raisecapitalguillemets}{#1}} +\DeclareOptionX<typog>{raisecapitalhyphen}[\z@]% + {\setlength{\typog@raisecapitalhyphen}{#1}} +\DeclareOptionX<typog>{raisecapitaltimes}[\z@]% + {\setlength{\typog@raisecapitaltimes}{#1}} +\DeclareOptionX<typog>{raiseguillemets}[\z@]% + {\setlength{\typog@raiseguillemets}{#1}} +\DeclareOptionX<typog>{raisefiguredash}[\z@]% + {\setlength{\typog@raisefiguredash}{#1}} +\DeclareOptionX<typog>{raise*}[\z@]% + {\setlength{\typog@raisecapitaldash}{#1}% + \setlength{\typog@raisecapitalhyphen}{#1}% + \setlength{\typog@raisecapitaltimes}{#1}% + \setlength{\typog@raisefiguredash}{#1}} +\DeclareOptionX<typog>{shrinklimits}% + [\typog@default@shrink@i, \typog@default@shrink@ii, \typog@default@shrink@iii]% + {\typog@require@preloaded@microtype + \ifx\@onlypreamble\@notprerr + \PackageWarning{typog}{option `shrinklimits' can only be used in the preamble}% + \else + \edef\typog@shrinklimits{#1}% + \typog@set@shrink@limits + \fi} +\DeclareOptionX<typog>{slashkern}[.05em]% + {\setlength{\typog@slashkern}{#1}} +\DeclareOptionX<typog>{stretchlimits}% + [\typog@default@stretch@i, \typog@default@stretch@ii, \typog@default@stretch@iii]% + {\typog@require@preloaded@microtype + \ifx\@onlypreamble\@notprerr + \PackageWarning{typog}{option `stretchlimits' can only be used in the preamble}% + \else + \edef\typog@stretchlimits{#1}% + \typog@set@stretch@limits + \fi} +\DeclareOptionX<typog>{trackingttspacing}[\typog@trackingttspacing]% + {\typog@require@preloaded@microtype + \ifx\@onlypreamble\@notprerr + \PackageWarning{typog}{option `trackingttspacing' can only be used in the preamble}% + \else + \typog@typeout{trackingttspacing=#1}% + \SetTracking[outer spacing={#1}]{encoding=*, family=tt*}{0}% + \fi} + +\newcommand*{\typog@initialize@options} + {\ExecuteOptionsX<typog>{ + ligaturekern, + mathitalicscorrection, textitalicscorrection, + raisecapitaldash, raisecapitalhyphen, raisecapitaltimes, + raiseguillemets, raisecapitalguillemets, + raisefiguredash, + slashkern} + \ifdefined\MT@MT + \unless\ifx\@onlypreamble\@notprerr + \ExecuteOptionsX<typog>{shrinklimits, stretchlimits} + \fi + \fi} + +\typog@initialize@options +\ProcessOptionsX<typog> + +% \fi +% +% +% \subsection*{Setup} +% +% \begin{environment}{typogsetup} +% An empty argument list resets all initialized values to their defaults. +% +% \begin{macrocode} +\NewDocumentEnvironment{typogsetup}{m} + {\def\typog@@arg{#1}% + \ifx\typog@@arg\empty + \typog@initialize@options + \else + \setkeys{typog}{#1}% + \fi + \ignorespaces} + {\ignorespacesafterend} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\typogget} +% \begin{macrocode} +\NewDocumentCommand{\typogget}{m}{\csname typog@#1\endcsname} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Information} +% +% \begin{macro}{\typog@round@dim@to@tenths} +% \begin{macrocode} +\ExplSyntaxOn +\newcommand*{\typog@round@dim@to@tenths}[1] + {\fp_to_decimal:n {round(10 * \dim_to_fp:n{#1} / 1\p@) / 10}} +\ExplSyntaxOff + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@formatsizeinfo} +% Arguments 1 and~2 are the font size and the line spacing. +% The third parameter adds (decorative) units to both numbers. +% +% \begin{macrocode} +\newcommand*{\typog@formatsizeinfo}[3] + {#1#3\kernedslash #2#3} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fontsizeinfo} +% All macros defined inside of \cs{fontsizeinfo} must be global +% because the call can occur inside of a group. +% +% The two \cs{edef}s at the beginning capture the desired values +% at the point where the macro \emph{is called}. +% The user-macro is tricky for we need +% a global macro with a constructed name +% and an associated starred version. +% +% \begin{implementationnote} +% \cs{@ifstar} caused too many problems which \cs{@ifnextchar} in combination with +% \cs{@gobble} avoid. +% \end{implementationnote} +% +% \begin{macrocode} +\NewDocumentCommand{\fontsizeinfo}{s m} + {\global\expandafter\edef\csname typog@fontsize@#2\endcsname + {\typog@round@dim@to@tenths{\fontdimen6\font}}% + \global\expandafter\edef\csname typog@linespacing@#2\endcsname + {\typog@round@dim@to@tenths{\baselineskip}}% + \protected\expandafter\gdef\csname #2\endcsname + {\@ifnextchar*{\typog@formatsizeinfo + {\csname typog@fontsize@#2\endcsname}% + {\csname typog@linespacing@#2\endcsname}% + {}% no unit + \ignorespaces % eat spaces after star + \@gobble} % consume the star itself + {\typog@formatsizeinfo + {\csname typog@fontsize@#2\endcsname}% + {\csname typog@linespacing@#2\endcsname}% + {\,pt}% decorative unit `pt' + }}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@default@inspect@id@prefix} +% Id-prefix for those |typoinspect|~environments +% that were not identified by the user. +% +% \begin{macrocode} +\newcommand*{\typog@default@inspect@id@prefix}{a-} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{typog@inspect@count} +% Counter to supply unique number and in turn \meta{id} +% for those |typoinspect|~environments +% that were not identified by the user. +% +% \begin{macrocode} +\newcounter{typog@inspect@count} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{typoginspect} +% \begin{macrocode} +\define@key[typog]{typoginspect}{tracingboxes}[\maxdimen]% + {\def\typog@@typoginspect@tracingboxes{#1}} +\NewDocumentEnvironment{typoginspect}{O{} m} + {\def\typog@@typoginspect@tracingboxes{\m@ne}% + \setkeys[typog]{typoginspect}{#1}% +% \end{macrocode} +% +% If the user does not supply an \meta{id}, +% we fall back to out own counter +% and construct a hopefully unique \meta{id} from that. +% +% \begin{macrocode} + \edef\typog@@arg{#2}% + \ifx\typog@@arg\empty + \stepcounter{typog@inspect@count}% + \edef\typog@@id{\typog@default@inspect@id@prefix\arabic{typog@inspect@count}}% + \else + \edef\typog@@id{\typog@trim@spaces{\typog@@arg}}% + \fi + \typeout{<typog-inspect id="\typog@@id" job="\jobname" line="\the\inputlineno" page="\the\value{page}">}% +% \end{macrocode} +% +% Set both badness thresholds to absurdly low values as to activate \TeX's reports. +% +% \begin{macrocode} + \hbadness=\m@ne + \vbadness=\m@ne +% \end{macrocode} +% +% Carefully select the tracing functionality we want (to improve our typography). +% Too much trace data distracts +% and the user always can turn on more tracing at the beginning of the environment. +% +% \begin{macrocode} + \tracingnone + \tracingpages=\@ne + \tracingparagraphs=\@ne + \showboxbreadth=\typog@@typoginspect@tracingboxes + \showboxdepth=\typog@@typoginspect@tracingboxes} + {\typeout{</typog-inspect>}% + \ignorespacesafterend} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{typoginspectpar} +% Companion environment to |typoginspect| +% which adds a \cs{par} before the end of the group. +% +% \begin{macrocode} +\NewDocumentEnvironment{typoginspectpar}{m} + {\typoginspect{#1}} + {\par\endtypoginspect} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Hyphenation} +% +% \begin{macro}{\typog@allowhyphenation} +% Re-enable automatic hyphenation. +% +% The same or almost the same implementation can be found +% in \packagename{babel} as macro~\cs{bbl@allowhyphens} +% and \packagename{hyphenat} as macro~\cs{prw@zbreak}. +% +% \begin{macrocode} +\newcommand*{\typog@allowhyphenation} + {\ifvmode + \relax + \else + \nobreak + \hskip\z@skip + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\allowhyphenation} +% Define a user-visible alias unless the name is already used. +% +% \begin{macrocode} +\unless\ifdefined\allowhyphenation + \let\allowhyphenation=\typog@allowhyphenation +\fi + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\breakpoint} +% The starred form inhibits hyphenation of the right-hand component. +% +% \begin{macrocode} +\NewDocumentCommand{\breakpoint}{s} + {\discretionary{}{}{}% + \IfBooleanTF{#1}% + {\ignorespaces}% + {\typog@allowhyphenation}} + +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \def\breakpoint#1{\if*\detokenize{#1}\ignorespaces\fi}% +} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{hyphenmin} +% \changes{v0.3}{2024-05-04}{New environment.} +% No trickery here. -- We use the mandatory argument for the value of \cs{lefthyphenmin} if +% the optional argument has been omitted. +% +% \begin{macrocode} +\NewDocumentEnvironment{hyphenmin}{o m} + {\lefthyphenmin=\IfNoValueTF{#1}{#2}{#1}% + \righthyphenmin=#2} + {} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Disable/Break Ligatures} +% +% \begin{macro}{\typog@hyphen} +% We define our own hyphen so the user can override the definition in a pinch. +% +% \begin{macrocode} +\newcommand*{\typog@hyphen}{\char`-} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nolig} +% \begin{macrocode} +\NewDocumentCommand{\nolig}{s o} + {\dimen0=\IfNoValueTF{#2}{\typog@ligaturekern}{#2\typog@dim@unit}% + \IfBooleanTF{#1}% + {\kern\dimen0\ignorespaces}% + {\discretionary{\typog@hyphen}{}{\kern\dimen0}% + \typog@allowhyphenation + \IfNoValueF{#2}{\ignorespaces}}} + +% \end{macrocode} +% +% The \acronym{PDF}-ready version of \cs{nolig} cannot be implemented with \cs{futurelet}. +% Doh! +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \RenewExpandableDocumentCommand{\nolig}{s o m}{% + \ifx\typog@TYPOG#3\typog@TYPOG + \relax + \else + \ifx\relax#3\relax + \relax + \else + \PackageError{typog} + {Missing third argument of \nolig} + {Append empty group or \relax after macro invocation} + \fi + \fi} +} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Manual Italic Correction} +% +% \begin{macro}{\typog@itcorr@text@unconditional} +% Fallback italics correction for text mode. +% +% \begin{macrocode} +\newcommand*{\typog@itcorr@text@unconditional}[1] + {\kern#1\typog@textitalicscorrection} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@itcorr@text} +% Conditional italics correction depending on +% the current font's own italics correction, +% i.\,e., \cs{fontdimen1}. +% +% \begin{macrocode} +\newcommand*{\typog@itcorr@text}[1] + {\def\typog@@strength{#1}% + \dimen0=\fontdimen1\font + \ifdim\dimen0=\z@ + \typog@itcorr@text@unconditional{\typog@@strength}% + \else + \kern\typog@@strength\dimen0 + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@itcorr@math} +% Italics correction for math mode. +% +% \begin{macrocode} +\newcommand*{\typog@itcorr@math}[1] + {\mkern#1\typog@mathitalicscorrection} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\itcorr} +% If the font has no italics correction we fall back to out own length. +% In text mode the starred version always uses the fallback. +% The star is a no-op in math mode. +% +% \begin{macrocode} +\NewDocumentCommand{\itcorr}{s m} + {\ifmmode + \typog@itcorr@math{#2}% + \else + \IfBooleanTF{#1}% + {\typog@itcorr@text{#2}}% + {\typog@itcorr@text@unconditional{#2}}% + \fi} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \RenewExpandableDocumentCommand{\itcorr}{s m}{} +} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Apply Extra Kerning} +% +% \subsubsection*{Slash} +% +% \begin{macro}{\typog@forwardslash} +% We define our own forward-slash so the user can override the definition in a pinch. +% +% \begin{macrocode} +\newcommand*{\typog@forwardslash}{\char`/} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kernedslash} +% Macro~\cs{kernedslash} introduces a hyphenation possibility right after the dash, +% whereas the starred version does not. +% +% By the way, \cs{slash} expands to `|/|\cs{penalty}\cs{exhyphenpenalty}'. +% +% \begin{macrocode} +\NewDocumentCommand{\kernedslash}{s} + {\hspace*{\typog@slashkern}% + \typog@forwardslash + \IfBooleanTF{#1}% + {\hspace*{\typog@slashkern}\ignorespaces}% + {\typog@breakpoint\typog@allowhyphenation\hspace*{\typog@slashkern}}} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \def\kernedslash#1{\if*\detokenize{#1}/\ignorespaces\else/#1\fi}% +} + +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection*{Hyphen} +% +% \begin{macro}{\kernedhyphen} +% \begin{macrocode} +\NewDocumentCommand{\kernedhyphen}{s O{0} m m} + {\ifmmode + \mspace{\muexpr(#3 mu) * 18 / 1000}% + \raisebox{#2\typog@dim@unit}{$\m@th\mathord{-}$}% + \mspace{\muexpr(#4 mu) * 18 / 1000}% + \else + \def\typog@@auto{*}% + \def\typog@@optarg{#2}% + \hspace*{#3\typog@dim@unit}% + \raisebox{\ifx\typog@@optarg\typog@@auto + \typog@raisecapitalhyphen + \else + \typog@@optarg\typog@dim@unit + \fi}{\typog@hyphen}% + \hspace{#4\typog@dim@unit}% + \IfBooleanT{#1}{\nobreak}% + \fi} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \RenewExpandableDocumentCommand{\kernedhyphen}{s o m m}{-} +} +% \end{macrocode} +% \end{macro} +% +% One-argument shorthands. +% +% \begin{macro}{\leftkernedhyphen} +% Apply kerning on the left-hand side of the hyphen only. +% +% \begin{macrocode} +\NewDocumentCommand{\leftkernedhyphen}{s O{0} m} + {\IfBooleanTF{#1}% + {\kernedhyphen*[#2]{#3}{0}\ignorespaces}% + {\kernedhyphen[#2]{#3}{0}}} +% \end{macrocode} +% \end{macro} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \RenewExpandableDocumentCommand{\leftkernedhyphen}{s o m}{-} +} + +% \end{macrocode} +% +% \begin{macro}{\rightkernedhyphen} +% Apply kerning on the right-hand side of the hyphen only. +% +% \begin{macrocode} +\NewDocumentCommand{\rightkernedhyphen}{s O{0} m} + {\IfBooleanTF{#1}% + {\kernedhyphen*[#2]{0}{#3}\ignorespaces}% + {\kernedhyphen[#2]{0}{#3}}} +% \end{macrocode} +% \end{macro} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \RenewExpandableDocumentCommand{\rightkernedhyphen}{s o m}{-} +} + +% \end{macrocode} +% +% +% \subsection{Raise Selected Characters} +% +% \begin{macro}{\typog@breakpoint} +% We want our own penalty for a line-break at a particular point. +% The predefined \cs{allowbreak} is too eager. +% A package-private, user-configurable penalty fits best. +% +% \begin{macrocode} +\newcommand*{\typog@breakpoint} + {\penalty\typog@breakpenalty} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\capitalhyphen} +% Macro~\cs{capitalhyphen} introduces a hyphenation possibility right after the dash, +% whereas the starred version does not. +% +% \begin{macrocode} +\NewDocumentCommand{\capitalhyphen}{s} + {\raisebox{\typog@raisecapitalhyphen}{\typog@hyphen}% + \IfBooleanTF{#1}% + {\ignorespaces}% + {\typog@breakpoint\typog@allowhyphenation}} +% \end{macrocode} +% +% The non-hyperref version's code is straightforward. +% The \cs{pdfstringdefDisableCommands}~version must be expandable +% and must match the other version's signature. +% Yikes! +% We exploit the fact that conditions are expandable. +% However, we cannot use \cs{typog@hyphen} in the expansion as \cs{char} gets in the way. +% So, we fall back to the least~common denominator and use a bare dash. +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \def\capitalhyphen#1{% + \if*\detokenize{#1}% + -\ignorespaces + \else + -#1% + \fi} +} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\capitalendash} +% Macro~\cs{capitalendash} introduces a hyphenation possibility right after the dash; +% its starred version does not. +% +% \begin{macrocode} +\NewDocumentCommand{\capitalendash}{s} + {\raisebox{\typog@raisecapitaldash}{\textendash}% + \IfBooleanTF{#1}% + {\ignorespaces}% + {\typog@breakpoint\typog@allowhyphenation}} +\let\capitaldash=\capitalendash +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \def\capitalendash#1{% + \if*\detokenize{#1}% + \textendash\ignorespaces + \else + \textendash#1% + \fi} + \let\capitaldash=\capitalendash +} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\capitalemdash} +% Macro~\cs{capitalemdash} introduces a hyphenation possibility right after the dash; +% its starred version does not. +% +% \begin{macrocode} +\NewDocumentCommand{\capitalemdash}{s} + {\raisebox{\typog@raisecapitaldash}{\textemdash}% + \IfBooleanTF{#1}% + {\ignorespaces}% + {\typog@breakpoint\typog@allowhyphenation}} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \def\capitalemdash#1{% + \if*\detokenize{#1}% + \textemdash\ignorespaces + \else + \textemdash#1% + \fi} +} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\figuredash} +% Macro~\cs{figuredash} introduces a hyphenation possibility right after the dash; +% its starred version does not. +% +% \begin{macrocode} +\NewDocumentCommand{\figuredash}{s} + {\raisebox{\typog@raisefiguredash}{\textendash}% + \IfBooleanTF{#1}% + {\ignorespaces}% + {\typog@breakpoint\typog@allowhyphenation}} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\figuredash=\capitaldash} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\capitaltimes} +% \begin{macrocode} +\NewDocumentCommand{\capitaltimes}{} + {\ifmmode + \mathbin{\raisebox{\typog@raisecapitaltimes}{$\m@th\times$}}% + \else + \raisebox{\typog@raisecapitaltimes}{\texttimes}% + \fi} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{ + \RenewExpandableDocumentCommand{\capitaltimes}{}{\texttimes} +} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\singleguillemetleft} +% \begin{macrocode} +\NewDocumentCommand{\singleguillemetleft}{} + {\typog@allowhyphenation + \raisebox{\typog@raiseguillemets}{\guilsinglleft}} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\singleguillemetleft\guilsinglleft} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\singleguillemetright} +% \begin{macrocode} +\NewDocumentCommand{\singleguillemetright}{} + {\raisebox{\typog@raiseguillemets}{\guilsinglright}% + \typog@allowhyphenation} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\singleguillemetright\guilsinglright} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doubleguillemetleft} +% \begin{macrocode} +\NewDocumentCommand{\doubleguillemetleft}{} + {\typog@allowhyphenation + \raisebox{\typog@raiseguillemets}{\guillemotleft}} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\doubleguillemetleft\guillemotleft} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doubleguillemetright} +% \begin{macrocode} +\NewDocumentCommand{\doubleguillemetright}{} + {\raisebox{\typog@raiseguillemets}{\guillemotright}% + \typog@allowhyphenation} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\doubleguillemetright\guillemotright} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Singleguillemetleft} +% \begin{macrocode} +\NewDocumentCommand{\Singleguillemetleft}{} + {\typog@allowhyphenation + \raisebox{\typog@raisecapitalguillemets}{\guilsinglleft}} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\Singleguillemetleft\guilsinglleft} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Singleguillemetright} +% \begin{macrocode} +\NewDocumentCommand{\Singleguillemetright}{} + {\raisebox{\typog@raisecapitalguillemets}{\guilsinglright}% + \typog@allowhyphenation} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\Singleguillemetright\guilsinglright} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Doubleguillemetleft} +% \begin{macrocode} +\NewDocumentCommand{\Doubleguillemetleft}{} + {\typog@allowhyphenation + \raisebox{\typog@raisecapitalguillemets}{\guillemotleft}} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\Doubleguillemetleft\guillemotleft} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Doubleguillemetright} +% \begin{macrocode} +\NewDocumentCommand{\Doubleguillemetright}{} + {\raisebox{\typog@raisecapitalguillemets}{\guillemotright}% + \typog@allowhyphenation} +% \end{macrocode} +% +% \acronym{PDF}-substitute definition +% +% \begin{macrocode} +\typog@register@pdfsubstitute{\let\Doubleguillemetright\guillemotright} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection[Align Last Line]{Align Last Line of a Paragraph} +% +% The code of environment |lastlineraggedleftpar| +% has been inspired by macro~\cs{lastlineraggedleft}~\cite[Sec.~2]{wilson:2007}. +% +% \begin{environment}{lastlineraggedleftpar} +% \begin{macrocode} +\NewDocumentEnvironment{lastlineraggedleftpar}{} + {\lastlinefit=0% + \setlength{\leftskip}{\z@ \@plus 1fil}% + \setlength{\rightskip}{-\leftskip}% + \setlength{\parfillskip}{\leftskip}} + {\par} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{lastlineflushrightpar} +% Define |lastlineflushrightpar| as an alias of |lastlineraggedleftpar|. +% +% \begin{macrocode} +\let\lastlineflushrightpar=\lastlineraggedleftpar +\let\endlastlineflushrightpar=\endlastlineraggedleftpar + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{lastlinecenteredpar} +% The code of environment |lastlinecenteredpar| +% has been inspired by \textit{Tex By Topic}~\cite[Sec.~18.3.1]{eijkhout:2007}. +% +% \begin{macrocode} +\NewDocumentEnvironment{lastlinecenteredpar}{} + {\lastlinefit=0% + \setlength{\leftskip}{\z@ \@plus .5fil}% + \setlength{\rightskip}{-\leftskip}% + \setlength{\parfillskip}{\z@ \@plus 1fil}} + {\par} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection[Fill Last Line] +% {Fill Last Line of a Paragraph} +% +% \begin{environment}{shortenpar} +% \begin{macrocode} +\NewDocumentEnvironment{shortenpar}{} + {\advance\looseness by -1 + \ifnum\tracingparagraphs>0 + \typeout{@ looseness \the\looseness}% + \fi} + {\par} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{prolongpar} +% We try to be prudent and inhibit hyphenation of the next-to-last line +% just in case the longer paragraph could be cheaply achieved by hyphenation +% --~at the worst~-- of the last word. +% +% \begin{macrocode} +\NewDocumentEnvironment{prolongpar}{} + {\finalhyphendemerits=100000001 + \advance\looseness by 1 + \ifnum\tracingparagraphs>0 + \typeout{@ looseness \the\looseness}% + \fi} + {\par} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\typog@covernextindentpar@zero@parindent} +% This auxiliary macro and the following one +% are meant as an easy means to override the defaults +% of the user-visible environment~|covernextindentpar|. +% +% \begin{macrocode} +\newcommand*{\typog@covernextindentpar@zero@parindent}{2em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@covernextindentpar@nonzero@parindent} +% \begin{macrocode} +\newcommand*{\typog@covernextindentpar@nonzero@parindent}{2\parindent} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{covernextindentpar} +% \begin{macrocode} +\NewDocumentEnvironment{covernextindentpar}{o} + {\IfNoValueTF{#1} + {\ifdim\parindent=\z@ + \dimen0=\dimexpr\linewidth - \typog@covernextindentpar@zero@parindent + \else + \dimen0=\dimexpr\linewidth - \typog@covernextindentpar@nonzero@parindent + \fi} + {\dimen0=\dimexpr\linewidth - (#1)}% + \parfillskip=\dimen0 \@minus \dimen0 + \relax} + {\par} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\typog@openlastlinepar@zero@parindent} +% These auxiliary macros are meant as a means to override the defaults +% of the user-visible environment~|openlastlinepar|. +% +% \begin{macrocode} +\newcommand*{\typog@openlastlinepar@zero@parindent}{2em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@openlastlinepar@nonzero@parindent} +% \begin{macrocode} +\newcommand*{\typog@openlastlinepar@nonzero@parindent}{2\parindent} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{openlastlinepar} +% Compare with the suggestion in Ref.~\citenum{wermuth:2018}. +% +% \begin{macrocode} +\NewDocumentEnvironment{openlastlinepar}{o} + {\IfNoValueTF{#1} + {\ifdim\parindent=\z@ + \skip0=\typog@openlastlinepar@zero@parindent + \@plus 1fil + \@minus \typog@openlastlinepar@zero@parindent + \else + \skip0=\typog@openlastlinepar@nonzero@parindent + \@plus 1fil + \@minus \typog@openlastlinepar@nonzero@parindent + \fi} + {\dimen0=\dimexpr#1\relax + \skip0=\dimen0 \@plus 1fil \@minus \dimen0} + \parfillskip=\skip0} + {\par} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Spacing} +% +% \begin{macro}{\widespacestrength} +% Weight factor (``strength'') for \cs{fontdimen7}, the extra width of a sentence-ending +% space, we apply to construct our \cs{widespace} if \(\cs{fontdimen7} \not= 0\). Can be +% increased to get a more pronounced effect. +% +% \begin{macrocode} +\newcommand*{\widespacestrength}{1.} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\widespacescale} +% Scale factor we apply to the glue of the normal space to setup the glue of our +% \cs{widespacescale}. Also used in the fall-back calculation for the width if +% \(\cs{fontdimen7} = 0\). +% +% \begin{macrocode} +\newcommand*{\widespacescale}{1.125} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\widespace} +% \changes{v0.2}{2024-3-29}{Add fallback if \cs{fontdimen7} is zero. Extend with a starred version.} +% \begin{macrocode} +\NewDocumentCommand{\widespace}{s} + {\IfBooleanTF{#1}% + {\dimen0=\widespacescale\fontdimen2\font}% + {\ifdim\fontdimen7\font=\z@ + \dimen0=\widespacescale\fontdimen2\font + \else + \dimen0=\dimexpr\fontdimen2\font + + \widespacestrength\fontdimen7\font + \fi}% + \hskip \glueexpr\dimen0 + \@plus \widespacescale\fontdimen3\font + \@minus \widespacescale\fontdimen4\font + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\narrowspacestrength} +% Weight factor (``strength'') for \cs{fontdimen7}, the extra width of a sentence-ending +% space, we apply to construct our \cs{narrowspace} if \(\cs{fontdimen7} \not= 0\). Can be +% increased to get a more pronounced effect. +% +% \begin{macrocode} +\newcommand*{\narrowspacestrength}{.5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\narrowspacescale} +% Scale factor we apply to the glue of the normal space to setup the glue of our +% \cs{narrowspacescale}. Also used in the fall-back calculation for the width if +% \(\cs{fontdimen7} = 0\). +% +% \begin{macrocode} +\newcommand*{\narrowspacescale}{.9375} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\narrowspace} +% \changes{v0.2}{2024-3-29}{New macro.} +% \begin{macrocode} +\NewDocumentCommand{\narrowspace}{s} + {\IfBooleanTF{#1}% + {\dimen0=\narrowspacescale\fontdimen2\font}% + {\ifdim\fontdimen7\font=\z@ + \dimen0=\narrowspacescale\fontdimen2\font + \else + \dimen0=\dimexpr\fontdimen2\font - + \narrowspacestrength\fontdimen7\font + \fi}% + \hskip \glueexpr\dimen0 + \@plus \narrowspacescale\fontdimen3\font + \@minus \narrowspacescale\fontdimen4\font + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% +% See also: TeX by Topic \cite[ch.~20, p.~185\figuredash190]{eijkhout:2007}. +% +% \begin{environment}{loosespacing} +% \begin{macrocode} +\NewDocumentEnvironment{loosespacing}{O{1}} + {\dimen2=\fontdimen2\font + \ifcase #1 + \spaceskip=\z@ + \or % 1 +5% + \spaceskip=1.05\dimen2 \@plus .5\dimen2 \@minus .1\dimen2 + \or % 2 +10% + \spaceskip=1.1\dimen2 \@plus .5\dimen2 \@minus .1\dimen2 + \or % 3 +20% + \spaceskip=1.2\dimen2 \@plus .6\dimen2 \@minus .2\dimen2 + \else % >= 4 +30% + \spaceskip=1.3\dimen2 \@plus .8\dimen2 \@minus .3\dimen2 + \fi + \ignorespaces} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{tightspacing} +% \begin{macrocode} +\NewDocumentEnvironment{tightspacing}{O{1}} + {\dimen2=\fontdimen2\font + \ifcase #1 + \spaceskip=\z@ + \or % 1 -1.25% + \spaceskip=.9875\dimen2 \@plus .0125\dimen2 \@minus .5\dimen2 + \or % 2 -2.5% + \spaceskip=.975\dimen2 \@plus .025\dimen2 \@minus .5\dimen2 + \or % 3 -5% + \spaceskip=.95\dimen2 \@plus .05\dimen2 \@minus .5\dimen2 + \else % >= 4 -10% + \spaceskip=.9\dimen2 \@plus .1\dimen2 \@minus .5\dimen2 + \fi + \ignorespaces} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Microtype Front\capitalhyphen End} +% +% \subsubsection*{Tracking} +% +% \begin{environment}{setfonttracking} +% +% To archieve the control we want, +% we must tinker with \packagename{microtype's} internals. +% Doh! +% +% \begin{macrocode} +\NewDocumentEnvironment{setfonttracking}{m} + {\edef\MT@letterspace@{#1}% + \lsstyle + \ignorespaces} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% +% \subsubsection*{Font Expansion} +% +% \begin{macro}{\typog@setup@font@expansion} +% Note that we cannot factor the encodings into a macro; +% a single encoding would qualify, though. +% We need to support multiple encodings and thus go with the literal solution. +% +% \begin{macrocode} +\newcommand*{\typog@setup@font@expansion} + {\SetExpansion + [context = typog@shrink1, + shrink = \typog@shrink@i, + stretch = 0]% + {encoding = {*}}% + {} + \SetExpansion + [context = typog@shrink2, + shrink = \typog@shrink@ii, + stretch = 0]% + {encoding = {*}}% + {} + \SetExpansion + [context = typog@shrink3, + shrink = \typog@shrink@iii, + stretch = 0]% + {encoding = {*}}% + {} + + \SetExpansion + [context = typog@stretch1, + shrink = 0, + stretch = \typog@stretch@i]% + {encoding = {*}}% + {} + \SetExpansion + [context = typog@stretch2, + shrink = 0, + stretch = \typog@stretch@ii]% + {encoding = {*}}% + {} + \SetExpansion + [context = typog@stretch3, + shrink = 0, + stretch = \typog@stretch@iii]% + {encoding = {*}}% + {} + + \SetExpansion + [context = typog@expand1, + shrink = \typog@shrink@i, + stretch = \typog@stretch@i]% + {encoding = {*}}% + {} + \SetExpansion + [context = typog@expand2, + shrink = \typog@shrink@ii, + stretch = \typog@stretch@ii]% + {encoding = {*}}% + {} + \SetExpansion + [context = typog@expand3, + shrink = \typog@shrink@iii, + stretch = \typog@stretch@iii]% + {encoding = {*}}% + {}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@test@microtype@expansion@feature} +% We cannot even parse the \cs{iftypog@microtype@preloaded}~part further down +% unless the \cs{ifMT@expansion}~conditional exists. +% So we hoist this test in a macro of its own. +% It only gets called if package~\packagename{microtype} already has been sourced. +% +% \begin{macrocode} +\newcommand*{\typog@test@microtype@expansion@feature} + {\ifMT@expansion + \typog@typeout{microtype preloaded -- font expansion features available}% + \def\typog@require@microtype@expansion{\relax} + \typog@setup@font@expansion + \else + \PackageWarning{typog}{microtype preloaded,\space + but font expansion is disabled}% + \def\typog@require@microtype@expansion + {\PackageError{typog} + {microtype font expansion disabled} + {pass option `expansion' to package microtype}} + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@require@microtype@expansion} +% We are all set for the initialization of the font expansion, +% however, we must be careful in which (load-)state +% package~\packagename{microtype} is in. +% Compare the code for \cs{typog@require@microtype} +% and~\cs{typog@require@preloaded@microtype}. +% +% Initialize our own flag and setup meaningful messages for later feature checks. +% +% \begin{macrocode} +\iftypog@microtype@preloaded + \typog@test@microtype@expansion@feature +\else + \def\typog@require@microtype@expansion + {\PackageError{typog}% + {package microtype not (pre-)loaded, % + which is required for typog's font expansion}% + {require package microtype before package typog}} +\fi + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{setfontshrink} +% \begin{macrocode} +\NewDocumentEnvironment{setfontshrink}{O{1}} + {\typog@require@microtype@expansion + \ifcase#1% 0 + \relax + \or % 1 + \microtypecontext{expansion=typog@shrink1}% + \or % 2 + \microtypecontext{expansion=typog@shrink2}% + \else % >= 3 + \microtypecontext{expansion=typog@shrink3}% + \fi + \ignorespaces} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{setfontstretch} +% \begin{macrocode} +\NewDocumentEnvironment{setfontstretch}{O{1}} + {\typog@require@microtype@expansion + \ifcase#1% 0 + \relax + \or % 1 + \microtypecontext{expansion=typog@stretch1}% + \or % 2 + \microtypecontext{expansion=typog@stretch2}% + \else % >= 3 + \microtypecontext{expansion=typog@stretch3}% + \fi + \ignorespaces} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{setfontexpand} +% \begin{macrocode} +\NewDocumentEnvironment{setfontexpand}{O{1}} + {\typog@require@microtype@expansion + \ifcase#1% 0 + \relax + \or % 1 + \microtypecontext{expansion=typog@expand1}% + \or % 2 + \microtypecontext{expansion=typog@expand2}% + \else % >= 3 + \microtypecontext{expansion=typog@expand3}% + \fi + \ignorespaces} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{nofontexpansion} +% Implementation: We proceed a different approach with respect to requiring package microtype. +% The semantics of the macro is to switch something off. +% If it is not \singlequotes{on} because the necessary package was not loaded, a no-op is ok. +% +% \begin{macrocode} +\NewDocumentEnvironment{nofontexpansion}{} + {\ifdefined\microtypesetup + \microtypesetup{expansion=false}% + \fi + \ignorespaces} + {\ignorespacesafterend} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{nofontexpand} +% Define |nofontexpand| as an alias of |nofontexpansion|. +% +% \begin{macrocode} +\let\nofontexpand=\nofontexpansion +\let\endnofontexpand=\endnofontexpansion + +% \end{macrocode} +% \end{environment} +% +% +% \subsubsection*{Character Protrusion} +% +% \begin{environment}{nocharprotrusion} +% See \singlequotes{Implementation} comment of |nofontexpansion|. +% +% \begin{macrocode} +\NewDocumentEnvironment{nocharprotrusion}{} + {\ifdefined\microtypesetup + \microtypesetup{protrusion=false}% + \fi + \ignorespaces} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Sloppy Paragraphs} +% +% \begin{macro}{\typog@scaled@emergencystretch} +% Compute the correct scale factor for the emergency stretch +% even if we do not have a valid \cs{linewidth}. +% +% \begin{macrocode} +\newcommand*{\typog@scaled@emergencystretch}[1] + {\emergencystretch=\ifdim\linewidth=\z@ + #1% + \else + \dimexpr (#1) * \linewidth / \textwidth + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\slightlysloppy} +% Macro~\cs{slightlysloppy} takes an optional~\meta{sloppiness} index ranging from~0 to~8, +% where~0 means the same as \cs{fussy} and~8 or more works like \cs{sloppy}. +% The default \meta{sloppiness} is~1. +% +% \begin{macrocode} +\NewDocumentCommand{\slightlysloppy}{O{1}} + {\ifcase #1% 0 + % \tolerance=200 + % \emergencystretch=\z@ + % \hfuzz=.1\p@ + % \vfuzz=\hfuzz + \fussy + \or % 1 + \pretolerance=165% + \tolerance=330% + \typog@scaled@emergencystretch{.375em}% + \hfuzz=.15\p@ + \vfuzz=\hfuzz + \or % 2 + \pretolerance=265% + \tolerance=530% + \typog@scaled@emergencystretch{.75em}% + \hfuzz=.15\p@ + \vfuzz=\hfuzz + \or % 3 + \pretolerance=435% + \tolerance=870% + \typog@scaled@emergencystretch{1.125em}% + \hfuzz=.2\p@ + \vfuzz=\hfuzz + \or % 4 + \pretolerance=705% + \tolerance=1410% + \typog@scaled@emergencystretch{1.5em}% + \hfuzz=.3\p@ + \vfuzz=\hfuzz + \or % 5 + \pretolerance=1155% + \tolerance=2310% + \typog@scaled@emergencystretch{1.875em}% + \hfuzz=.35\p@ + \vfuzz=\hfuzz + \or % 6 + \pretolerance=1880% + \tolerance=3760% + \typog@scaled@emergencystretch{2.25em}% + \hfuzz=.4\p@ + \vfuzz=\hfuzz + \or % 7 + \pretolerance=3065% + \tolerance=6130% + \typog@scaled@emergencystretch{2.625em}% + \hfuzz=.45\p@ + \vfuzz=\hfuzz + \else % >= 8 + % \tolerance=9999 + % \emergencystretch=3em + % \hfuzz=.5\p@ + % \vfuzz=\hfuzz + \sloppy + \fi + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{implementationnote} +% \begin{itemize} +% \item The \cs{tolerance}~values are calculated as the geometric mean of the extreme +% values~200 and~9999. This means the factor +% \begin{equation*} +% f = \Big(\frac{9999}{200}\Big)^{1/8} \approx 1.63 +% \end{equation*} +% defines additional tolerances which we generously round values in the actual +% implementation. +% +% \item The \cs{emergencystretch} is scaled linearly with \meta{sloppiness} \emph{and} the +% ratio of the actual \cs{linewidth} to the (maximum) \cs{textwidth}. +% +% \item The \cs{hfuzz}~values are interpolated linearly with \meta{sloppiness} between .1pt +% and~.5pt. +% \end{itemize} +% +% Maxima code to calculate the intermediate values. +% +% \begin{description} +% \item[Initialize.] \code{load("list\_functions")\$} +% \item[\cs{tolerance}:] \code{logspace(log10(200), log10(9999), 9), numer;} +% \item[\cs{emergencystretch}:] \code{linspace(0, 3, 9), numer;} +% \item[\cs{hfuzz}:] \code{linspace(0.1, 0.5, 9);} +% \end{description} +% \end{implementationnote} +% +% \begin{environment}{slightlysloppypar} +% \begin{macrocode} +\NewDocumentEnvironment{slightlysloppypar}{O{1}} + {\par\slightlysloppy[#1]\ignorespaces} + {\par} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection[Vert.~Tie Paragraphs]{Vertically Partially-Tied Paragraphs} +% +% \begin{macro}{\typog@geometric@mean} +% This is just the usual geometric mean of two values~\(x\) and~\(y\): \(\sqrt{x y}\). +% +% \begin{macrocode} +\ExplSyntaxOn +\newcommand*{\typog@geometric@mean}[2] + {\fp_to_int:n {sqrt((#1) * (#2))}} +\ExplSyntaxOff + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{typog@mean@penalty} +% Reserve a private counter for the geometric-mean penalties. +% +% \begin{macrocode} +\newcounter{typog@mean@penalty} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\vtietop} +% \begin{macrocode} +\NewDocumentCommand{\vtietop}{O{3}} + {\setcounter{typog@mean@penalty} + {\typog@geometric@mean{\@M}{\clubpenalty}}% + \typog@typeout{vtietop: penalties \the\@M--\the\value{typog@mean@penalty}--\the\clubpenalty}% + \unless\ifnum\clubpenalty<\@M + \PackageWarning{typog}{vtietop: clubpenalty=\the\clubpenalty\space>= 10000}% + \fi + \ifcase#1% 0 + \relax + \or % 1 + \relax + \or % 2 + \clubpenalties 3 + \@M + \value{typog@mean@penalty} + \clubpenalty + \or % 3 + \clubpenalties 4 + \@M \@M + \value{typog@mean@penalty} + \clubpenalty + \or % 4 + \clubpenalties 5 + \@M \@M \@M + \value{typog@mean@penalty} + \clubpenalty + \or % 5 + \clubpenalties 6 + \@M \@M \@M \@M + \value{typog@mean@penalty} + \clubpenalty + \or % 6 + \clubpenalties 7 + \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \clubpenalty + \or % 7 + \clubpenalties 8 + \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \clubpenalty + \or % 8 + \clubpenalties 9 + \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \clubpenalty + \else % >= 9 + \clubpenalties 10 + \@M \@M \@M \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \clubpenalty + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{vtietoppar} +% \begin{macrocode} +\NewDocumentEnvironment{vtietoppar}{O{3}} + {\vtietop[#1]} + {\par + \ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\splicevtietop} +% \begin{macrocode} +\NewDocumentCommand{\splicevtietop}{O{3}} + {\let\typog@old@item=\@item + \def\@item[##1]{\typog@old@item[##1]\vtietop[#1]}% + \ignorespaces} + +% \end{macrocode} +% +% We define an extra style for the users of \packagename{enumitem}. +% Its only drawback is that it hard-codes the default number of tied lines~(3). +% +% \begin{macrocode} +\ifdefined\SetEnumitemKey + \SetEnumitemKey{vtietop}{first=\splicevtietop} +\fi + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\vtiebot} +% \begin{macrocode} +\NewDocumentCommand{\vtiebot}{O{3}} + {\setcounter{typog@mean@penalty} + {\typog@geometric@mean{\@M}{\widowpenalty}}% + \typog@typeout{vtiebot: penalties \the\@M--\the\value{typog@mean@penalty}--\the\widowpenalty}% + \unless\ifnum\widowpenalty<\@M + \PackageWarning{typog}{vtiebot: widowpenalty=\the\widowpenalty\space>= 10000}% + \fi + \ifcase#1% 0 + \relax + \or % 1 + \relax + \or % 2 + \widowpenalties 3 + \@M + \value{typog@mean@penalty} + \widowpenalty + \or % 3 + \widowpenalties 4 + \@M \@M + \value{typog@mean@penalty} + \widowpenalty + \or % 4 + \widowpenalties 5 + \@M \@M \@M + \value{typog@mean@penalty} + \widowpenalty + \or % 5 + \widowpenalties 6 + \@M \@M \@M \@M + \value{typog@mean@penalty} + \widowpenalty + \or % 6 + \widowpenalties 7 + \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \widowpenalty + \or % 7 + \widowpenalties 8 + \@M \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \widowpenalty + \or % 8 + \widowpenalties 9 + \@M \@M \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \widowpenalty + \else % >= 9 + \widowpenalties 10 + \@M \@M \@M \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \widowpenalty + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{vtiebotpar} +% \begin{macrocode} +\NewDocumentEnvironment{vtiebotpar}{O{3}} + {\vtiebot[#1]} + {\par + \ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\typog@vtiebotdisp} +% \begin{macrocode} +\NewDocumentCommand{\typog@vtiebotdisp}{m} + {\setcounter{typog@mean@penalty} + {\typog@geometric@mean{\@M}{\displaywidowpenalty}}% + \typog@typeout{vtiebotdisp: penalties \the\@M--\the\value{typog@mean@penalty}--\the\displaywidowpenalty}% + \unless\ifnum\displaywidowpenalty<\@M + \PackageWarning{typog}{vtiebotdisp: displaywidowpenalty=\the\displaywidowpenalty\space>= 10000}% + \fi + \ifcase#1% 0 + \relax + \or % 1 + \relax + \or % 2 + \displaywidowpenalties 3 + \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \or % 3 + \displaywidowpenalties 4 + \@M \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \or % 4 + \displaywidowpenalties 5 + \@M \@M \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \or % 5 + \displaywidowpenalties 6 + \@M \@M \@M \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \or % 6 + \displaywidowpenalties 7 + \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \or % 7 + \displaywidowpenalties 8 + \@M \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \or % 8 + \displaywidowpenalties 9 + \@M \@M \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \else % >= 9 + \displaywidowpenalties 10 + \@M \@M \@M \@M \@M \@M \@M \@M + \value{typog@mean@penalty} + \displaywidowpenalty + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{vtiebotdisp} +% \begin{macrocode} +\NewDocumentEnvironment{vtiebotdisp}{O{3}} + {\typog@vtiebotdisp{#1}} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{vtiebotdisptoppar} +% \begin{macrocode} +\NewDocumentEnvironment{vtiebotdisptoppar}{O{3}o} + {\postdisplaypenalty=\@M + \predisplaypenalty=10001% in accordance with package `widows-and-orphans' + \edef\typog@@top@lines{\IfNoValueTF{#2}{#1}{#2}}% + \edef\typog@@after@display@math{\vtietop[\typog@@top@lines]}% + \PushPostHook{display}{\aftergroup\typog@@after@display@math}% + \vtiebotdisp[#1]} + {\par + \PopPostHook{display}% + \ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Breakable Disp.~Eqs.} +% +% \begin{environment}{breakabledisplay} +% We use a different default, 3, than \cs{allowdisplaybreaks} which utilizes~4 as its +% default. +% +% \begin{macrocode} +\newenvironment*{breakabledisplay}[1][3] + {\allowdisplaybreaks[#1]} + {\ignorespacesafterend} + +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Setspace Front-End} +% +% \begin{macro}{\typog@iter@limit} +% The maximum number of iterations we perform before bailing out with an error. Can be +% changed by the user if convergence is slow. +% +% \begin{macrocode} +\newcommand*{\typog@setbaselineskip@iter@limit}{10} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@setbaselineskip@relative@error} +% The maximum relative error of the ratio we tolerate for the final baselineskip over the +% target baselineskip. Can also be changed by the user if necessary. +% +% \begin{macrocode} +\newcommand*{\typog@setbaselineskip@relative@error}{.001} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@setbaselineskip} +% Given the \meta{target-baselineskip} as argument iterate setting \cs{setstretch} until the +% error drops below our threshold. +% +% \begin{macrocode} +\ExplSyntaxOn +\cs_new:Npn \typog@setbaselineskip #1 +{ +% \end{macrocode} +% +% Initialize our ``emergency-stop'' loop counter. +% +% \begin{macrocode} + \int_set:Nn \l_tmpa_int {1} + \int_set:Nn \l_tmpb_int {\typog@setbaselineskip@iter@limit} +% \end{macrocode} +% +% Note that the call to \cs{glueexpr} is required to consume dimensions that carry +% stretchability via |plus| or |minus|. +% +% \begin{macrocode} + \dim_set:Nn \l_tmpa_dim {\glueexpr #1} + + \typog@typeout{\string\setbaselineskip:\space + initial\space baselineskip:\space \the\baselineskip} + \typog@typeout{\string\setbaselineskip:\space + target\space baselineskip:\space \dim_use:N \l_tmpa_dim} + + \dim_compare:nNnTF {\baselineskip} > {\c_zero_dim} + {} + { + \PackageError{typog} + {\string\setbaselineskip:\space + baselineskip\space not\space positive} + {} + } + + \dim_compare:nNnTF {\l_tmpa_dim} > {\c_zero_dim} + {} + { + \PackageError{typog} + {\string\setbaselineskip:\space target\space + baselineskip\space must\space be\space + positive} + {} + } + + \skip_if_eq:nnTF {\l_tmpa_dim} {\glueexpr #1} + {} + { + \PackageWarning{typog} + {\string\setbaselineskip:\space argument\space + is\space a\space skip;\space + will\space ignore\space glue} + {} + } + + \fp_set:Nn \l_tmpa_fp {\l_tmpa_dim / \baselineskip} + \fp_until_do:nNnn {abs(\l_tmpa_dim / \baselineskip - 1)} < + {\typog@setbaselineskip@relative@error} + { + \setstretch{\fp_use:N \l_tmpa_fp} + \fp_set:Nn \l_tmpa_fp + {\l_tmpa_fp * \l_tmpa_dim / \baselineskip} + + \int_incr:N \l_tmpa_int + \int_compare:nNnTF {\l_tmpa_int} > {\l_tmpb_int} + { + \PackageError{typog} + {\string\setbaselineskip:\space excessive\space + number\space of\space iterations:\space + \int_use:N \l_tmpa_int\space >\space + \int_use:N \l_tmpb_int} + {} + } + {} + } + + \typog@typeout{\string\setbaselineskip:\space + final\space \string\setstretch\space argument:\space + \fp_use:N \l_tmpa_fp} + \typog@typeout{\string\setbaselineskip:\space + final\space baselineskip:\space \the\baselineskip} +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setbaselineskip} +% \changes{v0.3}{2024-04-04}{New macro.} +% +% Set the \cs{baselineskip} to an absolute length. +% +% \begin{implementationnote} +% Viewed as a standalone macro \cs{setbaselineskip} does not need the decoration +% \cs{AfterPreamble}. However, all of its siblings, \cs{setbaselineskippercentage}, +% \cs{setleading}, and \cs{setleadingpercentage} then would behave differently as they are +% delayed to the end of the preamble, but \cs{setbaselineskip} immediately becomes +% effective. For example, the successive calls +% +% \begin{codeexample} +% \cs{setbaselineskippercentage}\{140\} \\ +% \cs{setbaselineskip}\{12.5pt\} +% \end{codeexample} +% +% \noindent +% in the preamble would set the baselineskip to 140\% in the document. Therefore, +% \cs{setbaselineskip} is delayed too and the order of the calls thus preserved. +% \end{implementationnote} +% +% \begin{macrocode} +\cs_new:Npn \setbaselineskip #1 +{ + \AfterPreamble{\typog@setbaselineskip{#1}} + \ignorespaces +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\resetbaselineskip} +% \changes{v0.3}{2024-04-04}{New macro.} +% +% Set the \cs{baselineskip} to \singlequotes{neutral}. +% +% \begin{macrocode} +\cs_new:Npn \resetbaselineskip +{ + \AfterPreamble{\setstretch{1}} +} + +% \end{macrocode} +% \end{macro} +% +% \begin{ldimen}{\typogfontsize} +% \changes{v0.3}{2024-04-04}{New dimen.} +% Define the default font-size/quad size. +% +% \begin{macrocode} +\dim_new:N \typogfontsize +% \end{macrocode} +% +% Initialize \cs{typogfontsize} at the end of the preamble, which is after all fonts have +% been setup. +% +% \begin{macrocode} +\AfterEndPreamble{ + \dim_set:Nn \typogfontsize {\fontdimen6\font} + \typog@typeout{\string\typogfontsize = + \dim_use:N \typogfontsize\space + (at\space begin\space of\space document)} +} + +% \end{macrocode} +% \end{ldimen} +% +% \begin{macro}{\setbaselineskippercentage} +% \changes{v0.3}{2024-04-04}{New macro.} +% \begin{macrocode} +\cs_new:Npn \setbaselineskippercentage #1 +{ + \AfterPreamble{ + \dim_compare:nNnTF {\typogfontsize} > {\c_zero_dim} + { + \typog@setbaselineskip{ + \fp_eval:n {(#1) / 100} \typogfontsize} + } + { + \PackageError{typog} + {\string\setbaselineskippercentage:\space + \string\typogfontsize <= 0} + {Maybe\space \string\typogfontsize\space + is\space uninitialized?} + } + } + \ignorespaces +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setleading} +% \changes{v0.3}{2024-04-04}{New macro.} +% \begin{macrocode} +\cs_new:Npn \setleading #1 +{ + \AfterPreamble{ + \dim_compare:nNnTF {\typogfontsize} > {\c_zero_dim} + { + \typog@setbaselineskip{\typogfontsize + \dimexpr #1} + } + { + \PackageError{typog} + {\string\setleading:\space + \string\typogfontsize <= 0} + {Maybe\space \string\typogfontsize\space + is\space uninitialized?} + } + } + \ignorespaces +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setleadingpercentage} +% \changes{v0.3}{2024-04-04}{New macro.} +% \begin{macrocode} +\cs_new:Npn \setleadingpercentage #1 +{ + \AfterPreamble{ + \dim_compare:nNnTF {\typogfontsize} > {\c_zero_dim} + { + \typog@setbaselineskip{ + \fp_eval:n {1 + (#1) / 100} \typogfontsize} + } + { + \PackageError{typog} + {\string\setleadingpercentage:\space + \string\typogfontsize <= 0} + {Maybe\space \string\typogfontsize\space + is\space uninitialized?} + } + } + \ignorespaces +} +\ExplSyntaxOff + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Smooth Ragged} +% +% \begin{macro}{\typog@repeat} +% As we shall have to repeat the line specifications for our paragraphs so often we introduce +% the two argument macro~\cs{typog@repeat} that takes a \meta{repeat-count} and a \meta{body} +% that is repeated. +% +% \begin{macrocode} +\ExplSyntaxOn +\cs_new_eq:NN \typog@repeat \prg_replicate:nn + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\typog@mod} +% For error checking we shall need the modulo operation on integers, i.\,e., the remainder of +% an integral division. +% +% \begin{macrocode} +\newcommand*{\typog@mod}[2]{\int_mod:nn{#1}{#2}} +\ExplSyntaxOff + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\typog@triplet@max@lines} +% Maximum number of lines a smoothraggedright paragraph can have with the triplet generator. +% The number must be divisible by~3. +% +% \begin{macrocode} +\newcommand*{\typog@triplet@max@lines}{99} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{smoothraggedrightshapetriplet} +% Engine for 3-line repetitions. +% +% \begin{macrocode} +\define@key[typog]{smoothraggedrightshapetriplet}{leftskip}% + {\def\typog@@triplet@leftskip{#1}} +\define@key[typog]{smoothraggedrightshapetriplet}{parindent}% + {\def\typog@@triplet@parindent{#1}} +\NewDocumentEnvironment{smoothraggedrightshapetriplet}{O{} m m m} + {\def\typog@@triplet@leftskip{\z@}% + \def\typog@@triplet@parindent{\z@}% + \setkeys*[typog]{smoothraggedrightshapetriplet}{#1}% + \skip0=\typog@@triplet@leftskip\relax + \skip1=#2\relax + \skip2=#3\relax + \skip3=#4\relax + \typog@typeout{smoothraggedrightshapetriplet: skip0=\the\skip0}% + \typog@typeout{smoothraggedrightshapetriplet: skip1=\the\skip1}% + \typog@typeout{smoothraggedrightshapetriplet: skip2=\the\skip2}% + \typog@typeout{smoothraggedrightshapetriplet: skip3=\the\skip3}% + \unless\ifnum\typog@mod{\typog@triplet@max@lines}{3}=0 + \PackageError{typog} + {Line number of triplet generator % + (\typog@triplet@max@lines) not divisible by 3} + {} + \fi + \edef\typog@@triplet@linespecs{% + \glueexpr \skip0 + \typog@@triplet@parindent\relax + \glueexpr \skip1 - \typog@@triplet@parindent\relax + \skip0 \skip2 \skip0 \skip3 + \typog@repeat{\numexpr\typog@triplet@max@lines / 3 - 1} + {\skip0 \skip1 \skip0 \skip2 \skip0 \skip3}} + \parshape=\typog@triplet@max@lines\typog@@triplet@linespecs\relax} + {\par} + +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\typog@quintuplet@max@lines} +% Maximum number of lines a smoothraggedright paragraph can have with the quintuplet +% generator. The number must be divisible by~5. +% +% \begin{macrocode} +\newcommand*{\typog@quintuplet@max@lines}{95} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{smoothraggedrightshapequintuplet} +% Engine for 5-line repetitions. +% +% \begin{macrocode} +\define@key[typog]{smoothraggedrightshapequintuplet}{leftskip} + {\def\typog@@quintuplet@leftskip{#1}} +\define@key[typog]{smoothraggedrightshapequintuplet}{parindent} + {\def\typog@@quintuplet@parindent{#1}} +\NewDocumentEnvironment{smoothraggedrightshapequintuplet}{O{} m m m m m} + {\def\typog@@quintuplet@leftskip{\z@}% + \def\typog@@quintuplet@parindent{\z@}% + \setkeys*[typog]{smoothraggedrightshapequintuplet}{#1}% + \skip0=\typog@@quintuplet@leftskip + \skip1=#2\relax + \skip2=#3\relax + \skip3=#4\relax + \skip4=#5\relax + \skip5=#6\relax + \typog@typeout{smoothraggedrightshapequintuplet: skip0=\the\skip0}% + \typog@typeout{smoothraggedrightshapequintuplet: skip1=\the\skip1}% + \typog@typeout{smoothraggedrightshapequintuplet: skip2=\the\skip2}% + \typog@typeout{smoothraggedrightshapequintuplet: skip3=\the\skip3}% + \typog@typeout{smoothraggedrightshapequintuplet: skip4=\the\skip4}% + \typog@typeout{smoothraggedrightshapequintuplet: skip5=\the\skip5}% + \unless\ifnum\typog@mod{\typog@quintuplet@max@lines}{5}=0 + \PackageError{typog} + {Line number of quintuplet generator % + (\typog@quintuplet@max@lines) not divisible by 5} + {} + \fi + \edef\typog@@quintuplet@linespecs{% + \glueexpr \skip0 + \typog@@quintuplet@parindent\relax + \glueexpr \skip1 - \typog@@quintuplet@parindent\relax + \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5 + \typog@repeat{\numexpr\typog@quintuplet@max@lines / 5 - 1} + {\skip0 \skip1 \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5}} + \parshape=\typog@quintuplet@max@lines\typog@@quintuplet@linespecs\relax} + {\par} +% \end{macrocode} + +% \end{environment} +% +% +% \begin{macro}{\typog@septuplet@max@lines} +% Maximum number of lines a smoothraggedright paragraph can have with the septuplet +% generator. The number must be divisible by~7. +% +% \begin{macrocode} +\newcommand*{\typog@septuplet@max@lines}{98} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{smoothraggedrightshapeseptuplet} +% Engine for 7-line repetitions. +% +% \begin{macrocode} +\define@key[typog]{smoothraggedrightshapeseptuplet}{leftskip}% + {\def\typog@@septuplet@leftskip{#1}} +\define@key[typog]{smoothraggedrightshapeseptuplet}{parindent}% + {\def\typog@@septuplet@parindent{#1}} +\NewDocumentEnvironment{smoothraggedrightshapeseptuplet}{O{} m m m m m m m} + {\def\typog@@septuplet@leftskip{\z@}% + \def\typog@@septuplet@parindent{\z@}% + \setkeys*[typog]{smoothraggedrightshapeseptuplet}{#1}% + \skip0=\typog@@septuplet@leftskip + \skip1=#2\relax + \skip2=#3\relax + \skip3=#4\relax + \skip4=#5\relax + \skip5=#6\relax + \skip6=#7\relax + \skip7=#8\relax + \typog@typeout{smoothraggedrightshapeseptuplet: skip0=\the\skip0}% + \typog@typeout{smoothraggedrightshapeseptuplet: skip1=\the\skip1}% + \typog@typeout{smoothraggedrightshapeseptuplet: skip2=\the\skip2}% + \typog@typeout{smoothraggedrightshapeseptuplet: skip3=\the\skip3}% + \typog@typeout{smoothraggedrightshapeseptuplet: skip4=\the\skip4}% + \typog@typeout{smoothraggedrightshapeseptuplet: skip5=\the\skip5}% + \typog@typeout{smoothraggedrightshapeseptuplet: skip6=\the\skip6}% + \typog@typeout{smoothraggedrightshapeseptuplet: skip7=\the\skip7}% + \unless\ifnum\typog@mod{\typog@septuplet@max@lines}{7}=0 + \PackageError{typog} + {Line number of septuplet generator % + (\typog@septuplet@max@lines) not divisible by 7} + {} + \fi + \edef\typog@@septuplet@linespecs{% + \glueexpr \skip0 + \typog@@septuplet@parindent\relax + \glueexpr \skip1 - typog@@septuplet@parindent\relax + \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5 \skip0 \skip6 \skip0 \skip7 + \typog@repeat{\numexpr\typog@septuplet@max@lines / 7 - 1} + {\skip0 \skip1 \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5 \skip0 \skip6 \skip0 \skip7}} + \parshape=\typog@septuplet@max@lines\typog@@septuplet@linespecs\relax} + {\par} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\smoothraggedrightfuzzfactor} +% \begin{macrocode} +\newcommand*{\smoothraggedrightfuzzfactor}{1.0} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\smoothraggedrightgenerator} +% \begin{macrocode} +\newcommand*{\smoothraggedrightgenerator}{triplet} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\smoothraggedrightleftskip} +% \begin{macrocode} +\newlength{\smoothraggedrightleftskip} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\smoothraggedrightparindent} +% \begin{macrocode} +\newlength{\smoothraggedrightparindent} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\smoothraggedrightragwidth} +% \begin{macrocode} +\newlength{\smoothraggedrightragwidth} +\setlength{\smoothraggedrightragwidth}{2em} + +% \end{macrocode} +% \end{macro} +% +% \begin{ldimen}{\typog@fuzzwidth} +% \begin{macrocode} +\newdimen{\typog@fuzzwidth} + +% \end{macrocode} +% \end{ldimen} +% +% \begin{environment}{smoothraggedrightpar} +% The longest line will be \cs{linewidth} wide +% unless overridden by optional argument~|linewidth|. +% +% \begin{macrocode} +\define@key[typog]{smoothraggedrightpar}{linewidth}% + {\def\typog@@linewidth{#1}} + +\NewDocumentEnvironment{smoothraggedrightpar}{O{}} + {\edef\typog@@linewidth{\linewidth}% + \setkeys[typog]{smoothraggedrightpar}{#1}% +% \end{macrocode} +% Convert generator name to an integer suitable for \cs{ifcase}. +% \begin{macrocode} + \edef\typog@@generatorchoice{% + \ifnum\pdf@strcmp{\smoothraggedrightgenerator}{triplet}=\z@ + 0% + \else + \ifnum\pdf@strcmp{\smoothraggedrightgenerator}{quintuplet}=\z@ + 1% + \else + \ifnum\pdf@strcmp{\smoothraggedrightgenerator}{septuplet}=\z@ + 2% + \else + \PackageError{typog} + {smoothraggedright: unknown generator name} + {valid generator names are triplet, quintuplet, and septuplet}% + \fi + \fi + \fi}% +% \end{macrocode} +% Obey to the indentation prescribed by any list environment. +% \begin{macrocode} + \let\typog@@smoothraggedrightleftskip=\smoothraggedrightleftskip + \ifnum\@listdepth>0 + \addtolength{\typog@@smoothraggedrightleftskip}{\leftmargin}% + \fi +% \end{macrocode} +% Scale the fuzz-width by the user's factor. +% Later we shall rescale again specifically for each generator. +% \begin{macrocode} + \typog@fuzzwidth=\smoothraggedrightfuzzfactor\smoothraggedrightragwidth +% \end{macrocode} +% +% Now for the generator-specific code\dots +% \begin{macrocode} + \ifcase\typog@@generatorchoice +% \end{macrocode} +% +% |generator=triplet| produces a \doublequotes{short line -- long line -- middle length line}~sequence. +% \begin{macrocode} + \typog@fuzzwidth=.25\smoothraggedrightragwidth + \typog@typeout{smoothraggedright: generator=triplet, typog@fuzzwidth=\the\typog@fuzzwidth}% + \smoothraggedrightshapetriplet[leftskip=\typog@@smoothraggedrightleftskip, + parindent=\glueexpr\smoothraggedrightparindent + \parindent, + #1]% + {\glueexpr \typog@@linewidth - \smoothraggedrightragwidth + + \glueexpr \z@ \@plus \typog@fuzzwidth\relax}% (1) + {\glueexpr \typog@@linewidth \@minus \typog@fuzzwidth}% (3) + {\glueexpr (\typog@@linewidth * 2 - \smoothraggedrightragwidth) / 2 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (2) + \or +% \end{macrocode} +% +% |generator=quintuplet|. +% \begin{macrocode} + \typog@fuzzwidth=.125\smoothraggedrightragwidth + \typog@typeout{smoothraggedright: generator=quintuplet, typog@fuzzwidth=\the\typog@fuzzwidth}% + \smoothraggedrightshapequintuplet[leftskip=\typog@@smoothraggedrightleftskip, + parindent=\glueexpr\smoothraggedrightparindent + \parindent, + #1]% + {\glueexpr (\typog@@linewidth * 4 - \smoothraggedrightragwidth * 3) / 4 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (2) + {\glueexpr \typog@@linewidth \@minus \typog@fuzzwidth\relax}% (5) + {\glueexpr (\typog@@linewidth * 2 - \smoothraggedrightragwidth) / 2 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (3) + {\glueexpr (\typog@@linewidth * 4 - \smoothraggedrightragwidth) / 4 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (4) + {\glueexpr \typog@@linewidth - \smoothraggedrightragwidth + + \glueexpr \z@ \@plus \typog@fuzzwidth\relax}% (1) + \or +% \end{macrocode} +% +% |generator=septuplet|. +% +% Permutation \mbox{3 -- 6 -- 1 -- 5 -- 2 -- 7 -- 4} +% looks \singlequotes{random} enough for our purposes. +% +% \begin{macrocode} + \typog@fuzzwidth=.08333\smoothraggedrightragwidth + \typog@typeout{smoothraggedright: generator=septuplet, typog@fuzzwidth=\the\typog@fuzzwidth}% + \smoothraggedrightshapeseptuplet[leftskip=\typog@@smoothraggedrightleftskip, + parindent=\glueexpr\smoothraggedrightparindent + \parindent, + #1]% + {\glueexpr (\typog@@linewidth * 3 - \smoothraggedrightragwidth * 2) / 3 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (3) + {\glueexpr (\typog@@linewidth * 6 - \smoothraggedrightragwidth) / 6 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (6) + {\glueexpr \typog@@linewidth - \smoothraggedrightragwidth + + + \glueexpr \z@ \@plus \typog@fuzzwidth\relax}% (1) + {\glueexpr (\typog@@linewidth * 3 - \smoothraggedrightragwidth) / 3 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (5) + {\glueexpr (\typog@@linewidth * 6 - \smoothraggedrightragwidth * 5) / 6 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (2) + {\glueexpr \typog@@linewidth \@minus \typog@fuzzwidth\relax}% (7) + {\glueexpr (\typog@@linewidth * 2 - \smoothraggedrightragwidth) / 2 + + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (4) + \fi} + {\ifcase\typog@@generatorchoice + \endsmoothraggedrightshapetriplet + \or + \endsmoothraggedrightshapequintuplet + \or + \endsmoothraggedrightshapeseptuplet + \fi} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{smoothraggedright} +% \begin{macrocode} +\NewDocumentEnvironment{smoothraggedright}{O{}} + {\PushPostHook{par}{\hskip-\parindent\smoothraggedrightpar[#1]\relax}} + {\par\PopPostHook{par}} + +% \end{macrocode} +% \end{environment} +% +% +% \iffalse +%</package> +% \fi +% +% +% \addtocontents{toc}{\protect\end{multicols}} +% \addtocontents{toc}{\endgroup} +% +% +% \Finale +% +% +% +% \iffalse +%<*example> +\documentclass[a4paper]{article} + +\tracingonline=0 + +\PassOptionsToPackage{dvipsnames}{xcolor} + +\usepackage{amsmath} +\usepackage[main=USenglish, german]{babel} +\usepackage{float} +\usepackage[T1]{fontenc} +\usepackage{fullwidth} +\usepackage{hyphenat} +\usepackage{mathtools} +\usepackage[activate=true, verbose=true]{microtype} +\usepackage{ragged2e} +\usepackage[nobottomtitles*]{titlesec}\renewcommand*{\bottomtitlespace}{.2\textheight} +\usepackage[debug, trackingttspacing]{typog} +\usepackage{xcolor} + +\usepackage[loosest, proportional, scaled=1.064]{erewhon} +\usepackage[erewhon]{newtxmath} +\usepackage[scaled=.95]{cabin} +\usepackage{inconsolata} +\usepackage{setspace}\setstretch{1.08333} + + +\def\xsfdefault{\relax} +{ + \def\examplefont{6} + + \ifcase\examplefont % 0 -- document's default sans-serif font (e.g., ecrm1000) + \gdef\examplefontname{default} + \global\let\xsf=\sf + \global\let\xsfdefault=\sfdefault + \or % 1 -- Nunito + \gdef\examplefontname{Nunito} + \usepackage{nunito} + \xdef\xsfdefault{\rmdefault} + \gdef\xsf{\let\sfdefault=\xsfdefault\sf} + \or % 2 -- OpenSans + \gdef\examplefontname{OpenSans} + \usepackage[defaultsans]{opensans} + \xdef\xsfdefault{\sfdefault} + \gdef\xsf{\let\sfdefault=\xsfdefault\sf} + \or % 3 -- Noto Sans + \gdef\examplefontname{OpenSans} + \usepackage[sfdefault]{noto} + \xdef\xsfdefault{\sfdefault} + \gdef\xsf{\let\sfdefault=\xsfdefault\sf} + \or % 4 -- Roboto + \gdef\examplefontname{Roboto} + \usepackage[sfdefault]{roboto} + \xdef\xsfdefault{\sfdefault} + \gdef\xsf{\let\sfdefault=\xsfdefault\sf} + \or % 5 -- Montserrat + \gdef\examplefontname{Montserrat Alternate} + \usepackage[alternates]{montserrat} + \xdef\xsfdefault{\sfdefault} + \gdef\xsf{\let\sfdefault=\xsfdefault\sf} + \or % 6 -- Inter + \gdef\examplefontname{Inter} + \usepackage[sfdefault]{inter} + \xdef\xsfdefault{\sfdefault} + \gdef\xsf{\let\sfdefault=\xsfdefault\sf} + \else + \SelectedUnknownExampleFont + \fi + + \typeout{typog-example: font for examples: `\xsfdefault'}% +} + + +\usepackage{hyperref} +\usepackage{cleveref} + + +\hypersetup{ + citecolor = CadetBlue, + colorlinks = true, + linkcolor = Blue, + linktocpage = true, + pdfauthor={Dr. Christoph L. Spiel}, + pdfkeywords={Examples, + LaTeX, typography, ligature, italic-correction, paragraph justification, sloppy, ragged}, + pdfsubject={Examples for typographic fine-tuning of LaTeX}, + pdftitle={Examples for LaTeX package typog}, + raiselinks = false, + urlcolor = Mulberry +} + + +\makeatletter +\newcommand{\fs@myruled}{% + \fs@ruled + \def\@fs@capt##1##2{\floatc@ruled{##1\space\capitaldash*\space}{\fussy ##2}}% + \def\@fs@pre{\hrule height.8pt depth0pt \kern4pt}% + \def\@fs@mid{\kern3pt\hrule\kern3pt}% + \def\@fs@post{\kern4pt\hrule\relax}% +} +\makeatother + +\floatstyle{myruled} +\newfloat{exemplary}{htbp}{loe}[section] +\floatname{exemplary}{Example} +\Crefname{exemplary}{Example}{Examples} +\crefname{exemplary}{Ex.}{Ex.} + + +\newcommand*{\acronym}[1]{\mbox{\letterspacecapitals{\MakeUppercase{#1}}}} +\newcommand*{\bibauthor}[1]{\textsc{#1}} +\newcommand*{\bibtitle}[1]{\textit{#1}} +\newcommand*{\bottomstrut}{\rule[-.5em]{0pt}{0pt}} +\newcommand*{\code}[1]{{\ttfamily\hyphenchar\font=`\-\relax #1}} +\newcommand*{\doublequotes}[1]{\doubleguillemetright#1\doubleguillemetleft} +\newcommand*{\eTeX}{\mbox{\(\epsilon\)-\TeX}} +\newcommand*{\letterspacecapitals}[1]{\textls[30]{#1}} +\newcommand*{\metavar}[1]{\textit{#1}} +\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}} +\newcommand*{\propername}[1]{\mbox{\textsc{\textls[25]{#1}}}} +\newcommand*{\sample}[1]{\mbox{`\texttt{#1}'}} +\newcommand*{\singlequotes}[1]{\singleguillemetright#1\singleguillemetleft} +\newcommand*{\topstrut}{\rule{0pt}{1.25em}} +\newcommand*{\visualpar}{\,\P\quad} + +\newlength{\emreference} +\AtBeginDocument{\setlength{\emreference}{\fontdimen6\font}} +\newrobustcmd*{\milliem}[1] + {\ifdim #1=0pt + #1% + \else + \generictextfraction{\the\numexpr\dimexpr (#1) * 1000 / \emreference}{1000}\:em% + \fi} + +\newcommand*{\generictextfraction}[2] + {\raisebox{.4em}[0pt]{\scriptsize #1}% + \kern-.05em\textfractionsolidus\kern-.05em + \raisebox{-.15em}[0pt][0pt]{\scriptsize #2}} + +\newcommand*{\leftmarker}{\rule{.2em}{.1pt}\rule{.1pt}{.667em}} +\newcommand*{\rightmarker}{\rule{.1pt}{.667em}\rule{.2em}{.1pt}} +\newcommand*{\indicatewidth}[1]{\mbox{\leftmarker #1\rightmarker}} + +\newcommand*{\maxipagerule}{\medskip\hrule\medskip} +\newenvironment*{maxipage*} + {\par + \noindent + \fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth, + width=\textwidth + 2\marginparsep + 2\marginparwidth} + \begin{fullwidth}% + \vspace*{1pt}% Why is some vspace necessary? + \parskip=.5\baselineskip} + {\par + \end{fullwidth}% + \par} +\newenvironment*{maxipage} + {\par + \noindent + \fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth, + width=\textwidth + 2\marginparsep + 2\marginparwidth} + \begin{fullwidth}% + \maxipagerule + \parskip=.5\baselineskip} + {\par + \vskip\parskip + \maxipagerule + \end{fullwidth}% + \par} + + +\newlength{\examplewidth} +\setlength{\examplewidth}{160pt} + +\newcommand*{\texbooktolerancesample} + {If you want to avoid overfull boxes at all costs without trying to fix them manually, + you might be tempt\-ed to set \texttt{tol\-er\-ance=\allowbreak10000}; this allows + arbitrarily bad lines to be acceptable in tough situations. But infinite tolerance + is a bad idea, because \TeX{} doesn't distinguish between terribly bad and + preposterously horrible lines. Indeed, a tolerance of 10000 encourages \TeX{} to + concentrate all the badness in one place, making one truly unsightly line instead of + two moderately bad ones, because a single ``write-off'' produces fewest total + demerits according to the rules.} + %There is a much better way to get the desired effect:~[\dots] +\newcommand*{\texbooktolerancesamplecredits} + {\medskip\noindent + \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~107]{knuth:1986}.}} + +\newcommand*{\texbookparfillskipsample} + {We still haven't discussed the special trick that allows the final line of a paragraph + to be shorter than the others. Just before \TeX{} begins to choose breakpoints, + it does two important things: [\dots]} +\newcommand*{\texbooklongparfillskipsample} + {We still haven't discussed the special trick that allows the final line of a paragraph + to be shorter than the others. Just before \TeX{} begins to choose breakpoints, + it does two important things: (1)~If the final item of the current horizontal list is glue, + that glue is discarded. (The reason is that a blank space often gets into a token list just + before \code{\char92par} or just before \code{\char36\char36}, and this blank space should not be + part of the paragraph.) (2)~Three or more items are put at the end of the + current horizontal list~[\dots]} +\newcommand*{\texbookparfillskipsamplecredits} + {\medskip\noindent + \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~99n]{knuth:1986}.}} + +\newcommand*{\texbookparshapeskipsample} + {It's possible to control the length of lines in a much more general way, if simple + changes to \code{\string\leftskip} and \code{\string\rightskip} aren't flexible enough for your + purposes. For example, a semicircular hole has been cut out of the present paragraph, + in order to make room for a circular illustration that contains some of + Galileo's immortal words about circles; all of the line breaks in this + paragraph and in the circular quotation were found by \TeX's line-breaking algorithm. + You can specify a essentially arbitrary paragraph shape, by saying + \code{parshape}=\metavar{number}, where the \metavar{number} is a positive integer~\(n\), + followed by \(2n\)~\metavar{dimen} specifications.} +\newcommand*{\texbookparshapeskipsamplecredits} + {\medskip\noindent + \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~101]{knuth:1986}.}} + +\newcommand*{\texbookbaselineskipsample} + {When you are typsetting a document that spans several pages, it's generally best to + define \code{\string\baselineskip} so that it cannot stretch or shrink, because + this will give more uniformity to the pages. A small variation in the distance + between the baselines---say only half a point---can make a substantial difference + in the appearance of the type, since it significantly affects the proportion of + white to black. On the other hand, if you are preparing a one-page document, you + might want to give the baselineskip some stretchability, so that \TeX{} will help + you fit the copy on the page.} +\newcommand*{\texbookbaselineskipsamplecredits} + {\medskip\noindent + \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~78]{knuth:1986}.}} + + + +\newcommand*{\examplepreset}{\microtypesetup{activate=false}} +\newcommand*{\examplesetup}{\frenchspacing\xsf\small\fussy} +\newcommand*{\exampleparbox}[2][n/a] + {\begin{typoginspect}{#1} + \examplepreset + \parbox[t]{\examplewidth}{\examplesetup #2}% + \end{typoginspect}} +\newcommand*{\examplesep}{\hspace*{20pt}} +\def\fontnameandweightinfo#1{% + {\def\projectoutfontname##1-##2-##3\relax{##1~\lowercase{##2}}% + \global\expandafter\edef\csname#1\endcsname{\expandafter\projectoutfontname\fontname\font\relax}}} +\newcommand*{\examplefontinformation} + {\smallskip + \examplesetup + \fontnameandweightinfo{exfontnameinfo}% + \fontsizeinfo{exfontsizeinfo}% + The font used in this example is \exfontnameinfo, \exfontsizeinfo*.} + + +\setcounter{tocdepth}{1} +\setlength{\overfullrule}{3pt} +\hbadness=-1 + + +\input{ushyphex} + +\hyphenation{ + Double-guillemet-left + Double-guillemet-right + Double-quotes + Single-guillemet-left + Single-guillemet-right + Single-quotes + adj-demerits + allow-display-breaks + babel-hyphenation + base-line-skip + break-penalty + breakable-display + capital-hyphen + capital-times + cite-dash + club-penalties + cref-range-conjunction + display-break + display-widow-penalties + double-guillemet-right + double-hyphen-demerits + double-quotes + final-hyphen-demerits + inter-display-line-penalty + inter-text + kerned-hyphen + last-line-ragged-left + last-line-ragged-left-par + line-width + loose-ness + loose-spacing + make-at-letter + make-at-other + mar-gin-al + math-italics-correction + micro-type + number-dash + par-box + par-indent + parfillskip + pdf-string-def-Disable-Commands + post-display-penalty + pre-display-penalty + raise-capital-guillemets + raise-capital-times + raise-number-dash + set-font-expand + set-font-shrink + set-font-stretch + short-inter-text + single-guillemet-left + single-guillemet-right + single-quotes + slash-kern + slightly-sloppy-par + sloppy-par + smooth-ragged-right-fuzz-factor + smooth-ragged-right-par + smooth-ragged-right-shape-quintuplet + smooth-ragged-right-shape-septuplet + smooth-ragged-right-shape-triplet + space-skip + text-italics-correction + tight-spacing + tracing-boxes + tracing-para-graphs + vtie-bot + vtie-bot-disp + vtie-bot-disp-par + vtie-bot-disp-top-par + vtie-bot-par + vtie-top + vtie-top-par + widow-penalties +} + + +\SetExpansion[context=sloppy, stretch=30, shrink=60, step=5]{encoding={OT1, T1, TS1}}{}% p15 +\SetTracking{encoding=*, shape=sc}{20} + + +\begin{document} +\fussy +\lastlinefit=1000 +\nonfrenchspacing + +\begin{center} + \Huge\bf\sf + TypoG Examples +\end{center} + +\bigskip + +\noindent +The section numbers correspond to the subsections of section~3 +in the official documentation of package~\packagename{typog}. + +\bigskip + +\tableofcontents + + +\clearpage +\listof{exemplary}{Examples} + + +\clearpage +\noindent +Unless otherwise noted the font used in the examples is \singlequotes{\examplefontname}. + +\bigskip + +\section{Information} + +\code{\string\fontsizeinfo} --\fontsizeinfo{docsizeinfo} +At this point of the document, the font~size +and the line~spacing are \docsizeinfo*~(w/o~units). +For footnotes however, the current sizes are% +\footnote{This is the footnote where we get the sizes from.\fontsizeinfo{footsizeinfo}} +\footsizeinfo. + +Next we show a comparison of different font sizes and line spacings +decorated with the results of \code{\string\fontsizeinfo}. + +\medskip + +\begin{maxipage} + \setstretch{1} + \newcommand*{\baselineskipdoc}% + {Macro \code{\string\baselineskip} is a length command which + specifies the minimum space between the bottom of two + successive lines in a paragraph. Its value may be + automatically reset by \LaTeX, for example, by font + changes in the text.} + \renewcommand*{\examplefontname}{Merriweather} + Different font sizes and line spacings exemplified with the \examplefontname~font. + + \smallskip + + \begingroup + \fontfamily{Merriwthr-TLF}\selectfont + \noindent + \parbox[t]{.31\linewidth}% + {\fontsize{8.5}{12}\selectfont + \baselineskipdoc + \fontsizeinfo{examplesizeinfotight}} + \hfill + \parbox[t]{.31\linewidth}% + {\fontsize{10}{12}\selectfont + \baselineskipdoc + \fontsizeinfo{examplesizeinfo}} + \hfill + \parbox[t]{.31\linewidth}% + {\fontsize{10}{13.5}\selectfont + \baselineskipdoc + \fontsizeinfo{examplesizeinfoloose}} + \endgroup + + \medskip + + \noindent + \parbox[t]{.31\linewidth}{\examplefontname~\examplesizeinfotight*} + \hfill + \parbox[t]{.31\linewidth}{\examplefontname~\examplesizeinfo*} + \hfill + \parbox[t]{.31\linewidth}{\examplefontname~\examplesizeinfoloose*} +\end{maxipage} + +\noindent Starred form eats spaces? \examplesizeinfo* . + + +\section{Hyphenation} + +\noindent Line-break behavior + +\begin{quote} + \setlength{\overfullrule}{0pt} + \parbox[t]{0pt}{% + \code{\string\mbox+\string\breakpoint*} \\ + \mbox{(pre-)}\breakpoint*Hilbert space} + \hspace{100pt} + \parbox[t]{0pt}{% + \code{\string\breakpoint*} \\ + (pre-)\breakpoint*Hilbert space} + \hspace{100pt} + \parbox[t]{0pt}{% + \code{\string\breakpoint} \\ + (pre-)\breakpoint Hilbert space} +\end{quote} + +\noindent Starred form eats spaces? a\breakpoint* b. Unstarred: a\breakpoint b. + +\medskip + +\begin{quote} + \setlength{\overfullrule}{0pt} + \parbox[t]{0pt}{% + \begin{hyphenmin}{6} + Set minimum hyphenation values for both \code{\string\lefthyphenmin} and + \code{\string\righthyphenmin}: \the\lefthyphenmin{} and \the\righthyphenmin. + \end{hyphenmin}} + \hspace{100pt} + \parbox[t]{0pt}{% + \begin{hyphenmin}[4]{5} + Set minimum hyphenation values for \code{\string\lefthyphenmin} and + \code{\string\righthyphenmin} separately: \the\lefthyphenmin{} and \the\righthyphenmin. + \end{hyphenmin}} + \hspace{100pt} + \parbox[t]{0pt}{% + Returned to the default values for \code{\string\lefthyphenmin} and + \code{\string\righthyphenmin}: \the\lefthyphenmin{} and \the\righthyphenmin.} +\end{quote} + + +\section{Disable\kernedslash*Break Ligatures} + +\begin{center} + \begin{tabular}{@{}ll@{}} + \hline + \multicolumn{1}{@{}l|}{Macro} & Result \\ + \hline + n/a & + fine affirmation of baffling flavors \\ + \code{\string\nolig*} & + f\nolig*ine af\nolig*f\nolig*irmation of baf\nolig*f\nolig*ling f\nolig*lavors \\ + \code{\string\nolig} & + f\nolig{}ine af\nolig{}f\nolig{}irmation of baf\nolig{}f\nolig{}ling f\nolig{}lavors \\ + \code{\string\nolig*[75]} & of\nolig*[75]f\nolig*[75]ice + \end{tabular} +\end{center} + +\noindent Line-break behavior + +\begin{quote} + \setlength{\overfullrule}{0pt} + \parbox[t]{0pt}{% + \code{\string\nolig*} \\ + bi\nolig*{}jection} + \hspace{60pt} + \parbox[t]{0pt}{% + \code{\string\nolig} \\ + bi\nolig{}jection} +\end{quote} + +\noindent Starred form eats spaces? f\nolig* i, f\nolig*[0] i. + + +\section{Manual Italic Correction} + +\paragraph{Text Mode.} + +The italic correction of the current font is \the\fontdimen1\font/pt. + +We demonstrate the effect of \code{\string\itcorr} with a pair of bookends: +uncorrected italics: \indicatewidth{\it X}, +\TeX-corrected (\code{\string\/}): \indicatewidth{\it X\/}, +and \code{\string\itcorr\{7\}}: \indicatewidth{\it X\itcorr{7}}. + +Correction~0: \indicatewidth{\itcorr*{0}}; +corr.~3: \indicatewidth{\itcorr{3}}, \indicatewidth{\itcorr*{3}} (starred); +corr.~\textminus6: \indicatewidth{\itcorr{-6}}. + +\paragraph{Mathematical Mode.} + +Uncorrected: \([f]\), +corrected: \([\itcorr{1} f\itcorr{1}]\) + +Correction~0: \indicatewidth{\(\itcorr{0}\)}; +corr.~3: \indicatewidth{\(\itcorr{3}\)}; +corr.~\textminus6: \indicatewidth{\(\itcorr{-6}\)}. + + +\section{Apply Extra Kerning} + + +\subsection{Slash} + +The slash with some extra space around it can be helpful for certain pairs, +as for example years or names. + +\begin{center} + \begin{tabular}{@{}ll@{}} + \hline + \multicolumn{1}{@{}l|}{Macro} & Result \\ + \hline + n/a & 1991/1992, + New~York/NY, Korringa/Kohn/Rostoker \\ + \code{\string\kernedslash} & + 1991\kernedslash1992, New~York\kernedslash{}NY, Korringa\kernedslash{}Kohn\kernedslash{}Rostoker \\ + \end{tabular} +\end{center} + +\noindent Line-break behavior + +\begin{quote} + \setlength{\overfullrule}{0pt} + \parbox[t]{0pt}{% + \code{\string\kernedslash*} \\ + 1991\kernedslash*1992, + New~York\kernedslash*NY, + Korringa\kernedslash*Kohn\kernedslash*Rostoker} + \hspace{120pt} + \parbox[t]{0pt}{% + \code{\string\kernedslash} \\ + 1991\kernedslash{}1992, + New~York\kernedslash{}NY, + Korringa\kernedslash{}Kohn\kernedslash{}Rostoker} +\end{quote} + +\begin{quote} + \setlength{\overfullrule}{0pt} + \parbox[t]{0pt}{% + \code{\string\kernedslash*}\code{\string\nobreak} \\ + 1991\kernedslash*\nobreak{}1992, + New~York\kernedslash*\nobreak{}NY, + Korringa\kernedslash*Kohn\kernedslash*\nobreak{}Rostoker} + \hspace{140pt} + \parbox[t]{0pt}{% + \code{\string\allowhyphenation\string\kernedslash} \\ + 1991\kernedslash{}1992, + New~York\kernedslash{}NY, + Korringa\allowhyphenation\kernedslash{}Kohn\kernedslash{}Rostoker} +\end{quote} + +\noindent Starred form eats spaces? p\kernedslash* q. + + +\subsection{Hyphen} + +Uncorrected + +\begin{quote} + \(K\)-vector space, \(g\)-factor, \(f\)-function +\end{quote} + +\noindent Corrected + +\begin{quote} + \typogsetup{raisecapitalhyphen=.075em, raiseguillemets=.05em} + \(K\)\leftkernedhyphen{-75}vector space, + \(g\)\leftkernedhyphen{-25}factor, + \(f\)\leftkernedhyphen{-100}function + %% \(G\)\kernedhyphen[*]{50}{-50}Wirkung, + %% \(G\)\leftkernedhyphen{50}äquivalent, + %% \(K\)\kernedhyphen[*]{-50}{-50}Vektorraum, + %% \(K\)\kernedhyphen{-50}{-25}bilinear, + %% \propername{Young}\rightkernedhyphen{-50}Tableaux, + %% \singlequotes{Bra}\kernedhyphen[50]{50}{-50}Vektor, + %% \singlequotes{Ket}\kernedhyphen[50]{50}{-50}Vektor, + %% halbzahlige~\(l\)\kernedhyphen{50}{-50}Werte. +\end{quote} + +\noindent Line-break behavior + +\begin{quote} + \setlength{\overfullrule}{0pt} + + \parbox[t]{0pt}{hyphen~\mbox{`\code{-}'} \\ self-energy} + \hspace{80pt} + \parbox[t]{0pt}{\code{\string\hyp} \\ self\hyp{}energy} + \hspace{60pt} + \parbox[t]{0pt}{\code{\string\kernedhyphen*} \\ self\kernedhyphen*{5}{-5}energy} + \hspace{80pt} + \parbox[t]{0pt}{\code{\string\kernedhyphen} \\ self\kernedhyphen{5}{-5}energy} +\end{quote} + +\noindent If a \code{\string\kernedhyphen} goes astray in a math environment, +it decays to an ordinary minus with appropriate kerning: +\(G \kernedhyphen{-30}{-50} V\)\!. + + +\section{Raise Selected Characters} + +\subsection{Capital Hyphen} + +\newlength{\exemplaryraisecapitalhyphen} +\setlength{\exemplaryraisecapitalhyphen}{.6667pt} +With the standard hyphen we get + +\begin{quote} + \begin{otherlanguage}{german} + \acronym{NMR}-Spektroskopie, + \acronym{SI}-Einheit, + \(G\)-Modul, and + \(K\)-Vektorraum, + \end{otherlanguage} +\end{quote} + +\noindent whereas with raising the hyphen by \the\exemplaryraisecapitalhyphen{} +when calling \code{\string\capitalhyphen}, we arrive at + +\begin{quote} + \begin{otherlanguage}{german} + \typogsetup{raisecapitalhyphen=.075em} + + \acronym{NMR}\capitalhyphen{}Spektroskopie, + \acronym{SI}\capitalhyphen{}Einheit, + \(G\)\capitalhyphen{}Modul, and + \(K\)\capitalhyphen{}Vektorraum + (even better with \code{\string\kernedhyphen} + and the star-option for the correct raise-amount: + \(K\)\leftkernedhyphen[*]{-100}Vektorraum). + \end{otherlanguage} +\end{quote} + +\noindent Line-break behavior + +\begin{quote} + \setlength{\overfullrule}{0pt} + \begin{otherlanguage}{german} + \parbox[t]{0pt}{% + \code{\string\capitalhyphen*} \\ + \acronym{NMR}\capitalhyphen*{}Spektroskopie + } + \hspace{120pt} + \parbox[t]{0pt}{% + \code{\string\capitalhyphen} \\ + \acronym{NMR}\capitalhyphen{}Spektroskopie + } + \end{otherlanguage} +\end{quote} + +\noindent Starred form eats spaces? +{\typogsetup{raisecapitalhyphen=.075em} + V\capitalhyphen* W.} + + +\subsection{Capital Dash} + +\newlength{\exemplaryraisecapitaldash} +\setlength{\exemplaryraisecapitaldash}{.075em} + +Compare the result of plain~\code{\string\textendash} + +\begin{quote} + A\textendash M, N\textendash Z, C1\,\textendash\,C4, LEED\:\textendash\:STM +\end{quote} + +\noindent with \code{\string\capitaldash}: + +\begin{quote} + \typogsetup{raisecapitaldash=\exemplaryraisecapitaldash} + + A\capitaldash{}M, N\capitaldash{}Z, C1\,\capitaldash\,C4, LEED\:\capitaldash\:STM +\end{quote} + +\noindent where the en-dash has been raised by \milliem{\exemplaryraisecapitaldash}. + +Starred form eats spaces? V\capitaldash* W. + + +\subsection{Number Dash} + +\newlength{\exemplaryraisefiguredash} +\setlength{\exemplaryraisefiguredash}{.6667pt} +Compare the result of plain~\code{\string\textendash} + +\begin{quote} + 3--5, 81--82, 485--491 +\end{quote} + +\noindent with \code{\string\figuredash}: + +\begin{quote} + \typogsetup{raisefiguredash=\exemplaryraisefiguredash} + 3\figuredash 5, 81\figuredash 82, 485\figuredash 491 +\end{quote} + +\noindent where the en-dash has been raised by \the\exemplaryraisefiguredash. + +\noindent Line-break behavior + +\begin{quote} + \setlength{\overfullrule}{0pt} + \typogsetup{raisefiguredash=\exemplaryraisefiguredash} + \parbox[t]{0pt}{% + \code{\string\figuredash*} \\ + 3\figuredash*5, 81\figuredash*82, 485\figuredash*491 + } + \hspace{80pt} + \parbox[t]{0pt}{% + \code{\string\figuredash} \\ + 3\figuredash 5, 81\figuredash 82, 485\figuredash 491 + } +\end{quote} + +\noindent Starred form eats spaces? 44\figuredash* 55. + + +\subsection{Multiplication Sign \capitaldash{} Times~``\texttimes''} + +\newlength{\exemplaryraisetimes} +\setlength{\exemplaryraisetimes}{.6667pt} +The problem with a too-low multiplication sign arises +for example with matrices of a given, specific size. + +\noindent Uncorrected + +\begin{quote} + \acronym{LR}-mode: 2\texttimes2-matrix, \(N\)\texttimes\(M\)-matrix \\ + Math-mode: \(2\times2\)-matrix, \(N\times M\)-matrix +\end{quote} + +\noindent and corrected + +\begin{quote} + \typogsetup{raisecapitalhyphen=\exemplaryraisecapitalhyphen, + raisecapitaltimes=\exemplaryraisetimes} + \acronym{LR}-mode: 2\capitaltimes2-matrix, \(N\)\capitaltimes\(M\)-matrix \\ + Math-mode: \(2\capitaltimes2\)-matrix, \(N\capitaltimes M\)-matrix. +\end{quote} + + +\subsection{Guillemets} + +\newcommand*{\tschicholdi} + {Use single quotes for a first quotation.} +\newcommand*{\tschicholdii} + {Use double quotes for quotations within quotations.} + +\newcommand*{\frenchsinglequotes}[1]{\singleguillemetright #1\singleguillemetleft} +\newcommand*{\Frenchsinglequotes}[1]{\Singleguillemetright #1\Singleguillemetleft} +\newcommand*{\frenchdoublequotes}[1]{\doubleguillemetright #1\doubleguillemetleft} +\newcommand*{\Frenchdoublequotes}[1]{\Doubleguillemetright #1\Doubleguillemetleft} + +\newcommand*{\frenchsinglequotesFR}[1]{\singleguillemetleft\,\allowhyphenation#1\,\singleguillemetright} +\newcommand*{\FrenchsinglequotesFR}[1]{\Singleguillemetleft\,\allowhyphenation#1\,\Singleguillemetright} +\newcommand*{\frenchdoublequotesFR}[1]{\doubleguillemetleft\,\allowhyphenation#1\,\doubleguillemetright} +\newcommand*{\FrenchdoublequotesFR}[1]{\Doubleguillemetleft\,\allowhyphenation#1\,\Doubleguillemetright} + +\newlength{\exemplaryraiseguillemets} +\setlength{\exemplaryraiseguillemets}{.05em} +\newlength{\exemplaryraisecapitalguillemets} +\setlength{\exemplaryraisecapitalguillemets}{.1em} + +We again compare the default implementation with the adjusted one. + +\begin{quote} + \frenchsinglequotes{\tschicholdi} \\ + \frenchdoublequotes{\tschicholdii} \\ + \Frenchsinglequotes{1}, \Frenchsinglequotes{2}, \Frenchsinglequotes{3}. \\ + \Frenchdoublequotes{\letterspacecapitals{ABC}}, + \Frenchdoublequotes{\letterspacecapitals{MN}}, + \Frenchdoublequotes{\letterspacecapitals{XYZ}}. +\end{quote} + +\noindent Corrected by raising the glyphs by +\milliem{\exemplaryraiseguillemets} and +\milliem{\exemplaryraisecapitalguillemets}, respectively: + +\begin{quote} + \typogsetup{raiseguillemets=\exemplaryraiseguillemets, + raisecapitalguillemets=\exemplaryraisecapitalguillemets} + \frenchsinglequotes{\tschicholdi} \\ + \frenchdoublequotes{\tschicholdii} \\ + \Frenchsinglequotes{1}, \Frenchsinglequotes{2}, \Frenchsinglequotes{3}. \\ + \Frenchdoublequotes{\letterspacecapitals{ABC}}, + \Frenchdoublequotes{\letterspacecapitals{MN}}, + \Frenchdoublequotes{\letterspacecapitals{XYZ}}. +\end{quote} + +\noindent And the same using French typographic conventions: + +\begin{quote} + \typogsetup{raiseguillemets=\exemplaryraiseguillemets, + raisecapitalguillemets=\exemplaryraisecapitalguillemets} + \frenchsinglequotesFR{\tschicholdi} \\ + \frenchdoublequotesFR{\tschicholdii} \\ + \FrenchsinglequotesFR{1}, \FrenchsinglequotesFR{2}, \FrenchsinglequotesFR{3}. \\ + \FrenchdoublequotesFR{\letterspacecapitals{ABC}}, + \FrenchdoublequotesFR{\letterspacecapitals{MN}}, + \FrenchdoublequotesFR{\letterspacecapitals{XYZ}}. +\end{quote} + +\noindent Line-break behavior + +\begin{quote} + \setlength{\overfullrule}{0pt} + \typogsetup{raiseguillemets=\exemplaryraiseguillemets, + raisecapitalguillemets=\exemplaryraisecapitalguillemets} + + \newcommand*{\samplestring}{relation} + + \parbox[t]{0pt}{\frenchsinglequotes{\samplestring}} + \hspace{30pt} + \parbox[t]{0pt}{\Frenchsinglequotes{\samplestring}} + \hspace{30pt} + \parbox[t]{0pt}{\frenchdoublequotes{\samplestring}} + \hspace{30pt} + \parbox[t]{0pt}{\Frenchdoublequotes{\samplestring}} + + \smallskip + + \parbox[t]{0pt}{\frenchsinglequotesFR{\samplestring}} + \hspace{30pt} + \parbox[t]{0pt}{\FrenchsinglequotesFR{\samplestring}} + \hspace{30pt} + \parbox[t]{0pt}{\frenchdoublequotesFR{\samplestring}} + \hspace{30pt} + \parbox[t]{0pt}{\FrenchdoublequotesFR{\samplestring}} +\end{quote} + + +\clearpage +\section{Align Last Line} + +\subsection{Last Line Ragged Left/Flush Right} + +\Cref{ex:lastlineraggedleftpar} is a typical use of environment~\code{lastlineraggedleftpar}: +A narrow paragraph gets typeset with full justification +and put \code{\string\flushright} against the right margin as a whole. + +The layout may look more coherent if the last lines is moved to the right margin, too. + +\begin{exemplary} + \flushright + \caption[Justified -- flushright] + {\begin{typoginspectpar}{justified-flushright}Typeset a justified paragraph flushright and let + macro~\code{\string\lastlineraggedleft} shift the last line + over to the right-hand side.\label{ex:lastlineraggedleftpar}\end{typoginspectpar}} + + \setlength{\examplewidth}{220pt} + \exampleparbox[lastlineraggedleftpar]{\lastlineraggedleftpar\texbookparfillskipsample} + + \centering + \texbookparfillskipsamplecredits + + \examplefontinformation +\end{exemplary} + + +\subsection{Last Line Centered} + +The situation shown in \cref{ex:lastlinecenteredpar} is +more widespread than \cref{ex:lastlineraggedleftpar} +because centered tables and figures are quite common. +Their caption parboxes are centered too, +which is where a centered last line might fortify the layout. + +Another possible use of environment~\code{lastlinecenteredpar} are the final lines of chapters~-- +in particular if the chapters' ends are marked with centered dingbats. + +\begin{exemplary} + \centering + \caption[Typeset a justified paragraph that is centered.] + {\lastlinecenteredpar + Typeset a justified paragraph that is centered. + This very caption uses \code{lastlinecenteredpar} + to have its last line centered as well. + Moreover, we put a nifty asterisk centered at the bottom of the sample text. + \label{ex:lastlinecenteredpar}} + + \setlength{\examplewidth}{220pt} + \exampleparbox[lastlinecenteredpar]{\lastlinecenteredpar\texbookparfillskipsample} + + \medskip\(\ast\) + + \texbookparfillskipsamplecredits + + \examplefontinformation +\end{exemplary} + + +\clearpage +\section{Fill Last Line} + +\newcommand*{\abcsample}{abcd efgh ijkl mnop qrst uvwx yz12 3456} + +\begin{exemplary} + \def\sness{2} + \def\exparindent{25pt} + \setlength{\examplewidth}{235pt} + + \centering + \caption[Plain paragraph vs.~\code{covernextindentpar}] + {Top example: Typeset a paragraph without correction of the last line. + Middle example: Paragraph corrected with \code{covernextindentpar}. + We set a \code{\string\parindent} of~\exparindent{} in both parboxes + and we \emph{must} increase the amount of glue in the paragraph + to reduce the penalty of stretching the last line under a \code{\string\fussy}~setting. + For the samples below, we have chosen \code{\string\slightlysloppy[\sness]}. + The \singlequotes{Alternative}, the bottom example, + shows the effect of \code{tightspacing}; + no extra sloppyness is required there.} + + \exampleparbox[covernextindentpar-reference]{% + \setlength{\parindent}{\exparindent}% + \slightlysloppy[\sness] + \texbookparfillskipsample{} \abcsample} + + \medskip + + \exampleparbox[covernextindentpar]{% + \setlength{\parindent}{\exparindent}% + \slightlysloppy[\sness] + \covernextindentpar + \texbookparfillskipsample{} \abcsample} + + \medskip + + Alternative\dots\hfill\smallskip + + \exampleparbox[covernextindentpar-tightspacing]{% + \setlength{\parindent}{\exparindent}% + \begin{tightspacing} + \texbookparfillskipsample{} \abcsample + \end{tightspacing}} + + \texbookparfillskipsamplecredits + + \examplefontinformation +\end{exemplary} + +\begin{exemplary} + \def\sness{2} + \def\exparindent{0pt} + \setlength{\examplewidth}{155pt} + + \centering + \caption[Plain paragraph vs.~\code{covernextindentpar} (narrow)] + {Same comparison as the previous example, + but for a small linewidth and zippo~\code{\string\parindent}. + The left-hand side sample is uncorrected, + the right-hand side features \code{\string\covernextindentpar}. + The sloppyness level is~\sness{} for both samples.} + + \exampleparbox[narrow-covernextindentpar-reference]{% + \setlength{\parindent}{\exparindent}% + \slightlysloppy[\sness] + \texbookparfillskipsample{} \abcsample} + \qquad + \exampleparbox[narrow-covernextindentpar]{% + \setlength{\parindent}{\exparindent}% + \slightlysloppy[\sness] + \covernextindentpar[30pt] + \texbookparfillskipsample{} \abcsample} + + \texbookparfillskipsamplecredits + + \examplefontinformation +\end{exemplary} + +\begin{exemplary} + \def\exparindent{10pt} + \setlength{\examplewidth}{233pt} + + \centering + \caption[Prevent full last line] + {Sample~1: Typeset a paragraph without correction of the last line. + Sample~2: Paragraph corrected with \code{\string\openlastlinepar}.~-- Disappointing! + Sample~3: Same using macro~\code{\string\prolongpar}. + Sample~4: Alternative solution that simply increases the tracking by + \generictextfraction{2}{1000}\,em with~\code{setfonttracking}. + Sample~5: Alternative solution that increases the spacing with + \code{loosespacing}.} + + \exampleparbox[openline-reference]{% + \setlength{\parindent}{\exparindent} + \texbookparfillskipsample{} \abcsample} + + \medskip + + \exampleparbox[openlastlinepar]{% + \setlength{\parindent}{\exparindent} + \openlastlinepar + \texbookparfillskipsample{} \abcsample} + + \medskip + + \exampleparbox[prolongpar]{% + \setlength{\parindent}{\exparindent} + \prolongpar + \texbookparfillskipsample{} \abcsample} + + \medskip + + Alternatives\dots\hfill\smallskip + + \exampleparbox[openline-tracking]{% + \setlength{\parindent}{\exparindent}% + \setfonttracking{2} + \texbookparfillskipsample{} \abcsample} + + \medskip + + \exampleparbox[openline-spacing]{% + \setlength{\parindent}{\exparindent}% + \begin{loosespacing} + \texbookparfillskipsample{} \abcsample + \end{loosespacing}} + + \texbookparfillskipsamplecredits + + \examplefontinformation +\end{exemplary} + + +\clearpage +\section{Spacing} + +\subsection{Narrow\kernedslash Wide Space} + +The current font's parameters are shown in \cref{tab:fontdim}.\footnote{For a concise and +understandable explanation of the plethora of font parameters +consult \propername{David Carlisle's} excellent post on \propername{StackExchange}: +\href{https://tex.stackexchange.com/questions/88991/what-do-different-fontdimennum-mean}% + {What Do Different Fontdimennum Mean}.} + +\begin{table}[htp] + \centering + \caption{Important \code{\string\fontdimen} values of the current text font. + The middle column~(\#) states the number of the fontdimen.\bottomstrut} + \label{tab:fontdim} + + \begin{tabular}{@{}lll@{}} + \hline + \multicolumn{1}{@{}l|}{Name} & \multicolumn{1}{l|}{\#} & Value \\ + \hline + Interword space & 2 & \the\fontdimen2\font\topstrut \\ + Interword stretch & 3 & \the\fontdimen3\font \\ + Interword shrink & 4 & \the\fontdimen4\font \\ + Extra space & 7 & \the\fontdimen7\font + \end{tabular} +\end{table} + +\begin{center} + \setlength{\overfullrule}{0pt} + \newcommand*{\spacesampletext}[1]{some#1text#1with#1spaces\rule{0.1pt}{1em}} + \newsavebox{\narrowspacesample} + \sbox{\narrowspacesample}{\spacesampletext{\narrowspace}} + \newsavebox{\widespacesample} + \sbox{\widespacesample}{\spacesampletext{\widespace}} + + \begin{tabular}{@{}ll@{\qquad}l@{}} + Compare & \spacesampletext{\space} & default space, natural glue \\ + with & \usebox{\narrowspacesample} & \code{\string\narrowspace}, natural glue \\ + {} & \makebox[\wd\narrowspacesample][l]{\hbox to 0pt{\spacesampletext{\narrowspace}}} & + \code{\string\narrowspace}, tight box \\ + {} & \makebox[\wd\narrowspacesample][l]{\hbox spread 5pt{\spacesampletext{\narrowspace}}} & + \code{\string\narrowspace}, spread 5pt \\ + and again & \spacesampletext{\space} & default space, natural glue \\ + with & \usebox{\widespacesample} & \code{\string\widespace}, natural glue \\ + {} & \makebox[\wd\widespacesample][l]{\hbox to 0pt{\spacesampletext{\widespace}}} & + \code{\string\widespace}, tight box \\ + {} & \makebox[\wd\widespacesample][l]{\hbox spread 5pt{\spacesampletext{\widespace}}} & + \code{\string\widespace}, spread 5pt + \end{tabular} +\end{center} + +\noindent Starred form eats spaces? Narrow\narrowspace* Space. Wide\widespace* Space. + + +\subsection{Looser\kernedslash*Tighter} + +\Cref{ex:spacing-i,ex:spacing-ii} show \code{tightspacing} and \code{loosespacing} at work. + +\begin{exemplary} + \newcommand*{\sness}{3} + \newcommand*{\tlevel}{1} + \centering + + \caption[Looser or tighter spacing -- sloppy] + {Both parboxes are typeset with \code{\string\slightlysloppy[\sness]}, + the left one with default spacing, + the right one with \code{tightspacing[\tlevel]}.\label{ex:spacing-i}} + + \exampleparbox[tightspacing-reference]{\slightlysloppy[\sness]\texbooktolerancesample} + \qquad + \exampleparbox[tightspacing]{\slightlysloppy[\sness]\tightspacing[\tlevel]\texbooktolerancesample} + + \texbooktolerancesamplecredits + + \examplefontinformation +\end{exemplary} + +\begin{exemplary} + \newcommand*{\sness}{3} + \newcommand*{\llevel}{2} + \centering + + \caption[Looser or tighter spacing -- sloppy] + {Both parboxes are typeset with \code{\string\slightlysloppy[\sness]}, + the left one with default spacing, + the right one with \code{loosespacing[\llevel]}.\label{ex:spacing-ii}} + + \exampleparbox[loosespacing-reference]{\slightlysloppy[\sness]\texbooktolerancesample} + \qquad + \exampleparbox[loosespacing]{\slightlysloppy[\sness]\loosespacing[\llevel]\texbooktolerancesample} + + \texbooktolerancesamplecredits + + \examplefontinformation +\end{exemplary} + + +\clearpage +\section{Microtype Front\capitalhyphen End} + +\subsection{Tracking} + +\newcommand*{\trackingsampletext}{% + This sentence contains an explicit call to \code{\string\textls} + with an optional argument of \((+200)\) to \textls[200]{DEMONSTRATE} + that this macro still works inside of \code{setfonttracking}. + Apart from that it is just some more text to exercise the macro. + Well, the explicit letterspacing example is particularly ugly.} + +\begin{exemplary} + \renewcommand*{\examplepreset}{\microtypesetup{activate=true}} + \def\extratracking{7} + \centering + + \caption[Microtype: tracking] + {Use \packagename{microtype} to change the font tracking. + The sample on the left-hand side shows neutral tracking. + The one on the right-hand side received an extra tracking of + \generictextfraction{\extratracking}{1000}\,em.} + + \exampleparbox[microtype-tracking-reference]{% + \fussy + \noindent + \trackingsampletext} + \qquad + \exampleparbox[microtype-tracking-stretch]{% + \begin{setfonttracking}{\extratracking} + \fussy + \noindent + \trackingsampletext + \end{setfonttracking}} + + \examplefontinformation +\end{exemplary} + +\newcommand*{\trackingsamplefontchangetext}{% + {\rm RM} {\sf SF} {\rm RM} {\tt TT} {\rm RM}; + {\rm RM} {\it IT\/} {\rm RM}; + {\rm RM} {\sc SC} {\rm RM}. + {\rm Rm} {\sf Sf} {\rm Rm} {\tt Tt} {\rm Rm}; + {\rm Rm} {\it It\/} {\rm Rm}; + {\rm Rm} {\sc Sc} {\rm Rm}. + {\rm rm} {\sf sf} {\rm rm} {\tt tt} {\rm rm}; + {\rm rm} {\it it\/} {\rm rm}; + {\rm rm} {\sc sc} {\rm rm}.} + +\begin{exemplary} + \renewcommand*{\examplepreset}{\microtypesetup{activate=true}} + \def\extratracking{1} + \centering + + \caption[Microtype: tracking -- font changes] + {Check how font changes (serif, serif~italics, small-caps, sans~serif, typewriter) + interfere with the interword spacing. + The left sample has no tracking changes applied and serves as a reference, + whereas the right sample got an extra tracking of + \generictextfraction{\extratracking}{1000}\,em.\visualpar + The switch from and to typewriter, i.\,e., constant-width fonts + commonly is a source of spacing problems.} + + \exampleparbox[microtype-tracking-font-changes-reference]{\trackingsamplefontchangetext} + \qquad + \exampleparbox[microtype-tracking-font-changes-stretch]{% + \begin{setfonttracking}{\extratracking} + \trackingsamplefontchangetext + \end{setfonttracking}} +\end{exemplary} + +\noindent +No contents: \leftmarker +\begin{setfonttracking}{0} +\end{setfonttracking}\rightmarker. + + +\subsection{Font Expansion} + +\newcommand*{\expansionsample} + {By default, all characters of a font are allowed to be stretched or + shrunk by the same amount. However, it is also possible to limit + the expansion of certain characters if they are more sensitive to + deformation. + This is the purpose of the \code{\string\SetExpansion}~command.} + +\begin{exemplary} + \setlength{\examplewidth}{250pt} + \renewcommand*{\examplepreset}{\microtypesetup{activate=true}} + \renewcommand*{\examplesetup}{\frenchspacing\small\fussy} + + \centering + + \caption[Microtype: font expansion] + {Use \packagename{microtype} to stretch or shrink a font. + The top sample uses \code{\string\setfontshrink} at level~3, + the middle sample is the unchanged reference + (which is allowed to shrink and expand), + and the bottom sample utilizes \code{\string\setfontstretch} at level~2.} + + \exampleparbox[microtype-expansion-shrink]{% + \begin{setfontshrink}[3] + \noindent\expansionsample + \end{setfontshrink}} + + \medskip + + \exampleparbox[microtype-expansion-neutral]{% + \begin{setfontexpand}[0] + \noindent\expansionsample + \end{setfontexpand}} + + \medskip + + \exampleparbox[microtype-expansion-stretch]{% + \begin{setfontstretch}[2] + \noindent\expansionsample + \end{setfontstretch}} + + \examplefontinformation +\end{exemplary} + +\noindent +No contents -- \code{setfontshrink}: \leftmarker +\begin{setfontshrink} +\end{setfontshrink}\rightmarker. + +\noindent +No contents -- \code{setfontstretch}: \leftmarker +\begin{setfontstretch} +\end{setfontstretch}\rightmarker. + +\noindent +No contents -- \code{setfontexpand}: \leftmarker +\begin{setfontexpand} +\end{setfontexpand}\rightmarker. + +\noindent +No contents -- \code{nofontexpansion}: \leftmarker +\begin{nofontexpansion} +\end{nofontexpansion}\rightmarker. + + + +\subsection{Character Protrusion} + +\newcommand*{\zerodepthrule} + {\raisebox{0pt}[0pt][0pt]{\rule[-4.5\baselineskip]{.1pt}{4.25\baselineskip}}} + +\newcommand*{\protrusionsampletext}{% + \noindent + \zerodepthrule\hfill\zerodepthrule \\ + 1\hfill 1 \\ + .2\hfill 2. \\ + --3\hfill 3-- \\ + ---4\hfill 4---} + +\begin{exemplary} + \renewcommand*{\examplepreset}{\microtypesetup{activate=true}} + \renewcommand*{\examplesetup}{\frenchspacing\small\fussy} + + \centering + + \caption[Microtype: protrusion] + {Comparison of the \packagename{microtype} feature ``protrusion'' (left-hand side) + and \code{nocharprotrusion} (right-hand side).} + + \exampleparbox[microtype-protrusion-reference]{% + \microtypesetup{protrusion=true} + \protrusionsampletext} + \qquad + \exampleparbox[microtype-protrusion-off]{% + \microtypesetup{protrusion=true} + \nocharprotrusion + \protrusionsampletext} + + \medskip +\end{exemplary} + +\noindent +No contents -- \code{nocharprotrusion}: \leftmarker +\begin{nocharprotrusion} +\end{nocharprotrusion}\rightmarker. + + +\clearpage +\section{Sloppy Paragraphs} + +\Cref{ex:slightlysloppy-1,ex:slightlysloppy-2} put different amounts of ``sloppiness'' face to face. + +\begin{exemplary} + \setlength{\examplewidth}{180pt} + \def\sness{1} + \centering + \caption[Paragraphs typeset slightly sloppy~1] + {Paragraphs typeset slightly sloppy: \code{\string\slightlysloppy} vs.~\code{\string\fussy}. + The left parbox is typeset with \code{\string\slightlysloppy} + and \(\metavar{sloppiness} = \sness\), whereas the right sample + features the well known \code{\string\fussy} setting. + Both parboxes have a width of \the\examplewidth.\label{ex:slightlysloppy-1}} + + \exampleparbox[fussy-vs-slightlysloppy]{\slightlysloppy[\sness]\texbooktolerancesample} + \qquad + \exampleparbox[fussy-vs-slightlysloppy-reference]{\fussy\texbooktolerancesample} + + \texbooktolerancesamplecredits + + \examplefontinformation +\end{exemplary} + +\begin{exemplary} + \setlength{\examplewidth}{150pt} + \def\sness{2} + \centering + \caption[Paragraphs typeset slightly sloppy~2] + {Paragraphs typeset slightly sloppy: \code{\string\slightlysloppy} vs.~\code{\string\sloppy}. + The left sample is features \code{\string\slightlysloppy} with \(\metavar{sloppiness} = \sness\), + the right sample is typeset with \code{\string\sloppy}. + Both parboxes have a width of \the\examplewidth.\label{ex:slightlysloppy-2}} + + \exampleparbox[sloppy-vs-slightlysloppy]{\slightlysloppy[\sness]\texbooktolerancesample} + \qquad + \exampleparbox[sloppy-vs-slightlysloppy-reference]{\sloppy\texbooktolerancesample} + + \texbooktolerancesamplecredits + + \examplefontinformation +\end{exemplary} + +In conclusion all renderings of the text in +\cref{ex:slightlysloppy-1} and \cref{ex:slightlysloppy-2} +have their merits and their own flaws. + + +\clearpage +\section{Vertically Partially-Tied Paragraphs} + +\paragraph{\code{vtietoppar}}\leavevmode\par + +\begin{typoginspect}{vtietoppar} + \clubpenalty=150 + \begin{vtietoppar}[2] + After breaking a paragraph into lines, \TeX{} computes the interline + penalties by adding the values of: \code{\string\clubpenalty} after + the first line of a paragraph.\footnote{Footnote of \code{vtietoppar}.} + \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty + by allowing their replacement by arrays of penalty values. + \end{vtietoppar} +\end{typoginspect} + +\paragraph{\code{vtiebotpar}}\leavevmode\par + +\begin{typoginspect}{vtiebotpar} + \widowpenalty=150 + \begin{vtiebotpar}[2] + After breaking a paragraph into lines, \TeX{} computes the interline + penalties by adding the values of: \code{\string\widowpenalty} + before the last line of the paragraph.\marginpar{A float!} + \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty + by allowing their replacement by arrays of penalty values. + \end{vtiebotpar} +\end{typoginspect} + +\paragraph{\code{vtiebotdisp}}\leavevmode\par + +\begin{typoginspect}[tracingboxes]{vtiebotdisp} + \displaywidowpenalty=150 + \begin{vtiebotdisp}[2] + After breaking a paragraph into lines, \TeX{} computes the interline + penalties by adding the values of: \code{\string\displaywidowpenalty} + before the line immediately preceding a displayed equation. + \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty + by allowing their replacement by arrays of penalty values. + \[g H = H g \quad \text{for all} \enspace g \in G.\] + \end{vtiebotdisp} + + Follow-up paragraph after and outside of the \code{vtiebotdisp}-environment. +\end{typoginspect} + +\paragraph{\code{vtiebotdisptoppar}}\leavevmode\par + +\begin{typoginspect}{vtiebotdisptoppar} + \displaywidowpenalty=150 + \begin{vtiebotdisptoppar}[2] + After breaking a paragraph into lines, \TeX{} computes the interline + penalties by adding the values of: \code{\string\displaywidowpenalty} + before the line immediately preceding a displayed equation. + \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty + by allowing their replacement by arrays of penalty values. + \begin{breakabledisplay} + \begin{displaymath} + g H = H g \quad \text{for all} \enspace g \in G. + \end{displaymath} + \end{breakabledisplay} + + In this example we need a paragraph that follows the displayed math. + So, we have to type some more text here + to be able to demonstrate the action of the environment. + \end{vtiebotdisptoppar} +\end{typoginspect} + + +\clearpage +\section{Breakable Displayed Equations} + +\newcommand*{\binaryminus}{\mathbin{-}} +\newcommand*{\diracadj}[1]{\overline{#1}} +\newcommand*{\unaryminus}{{-}} + +\begin{typoginspect}{breakabledisplay} + \begin{breakabledisplay} + \begin{align*} + \diracadj{\psi}(x) \mathop{\partial_\mu} \psi(x) + \mapsto \diracadj{\psi'}(x) \mathop{\partial_\mu} \psi'(x) + &= e^{i \alpha(x)} \diracadj{\psi}(x) \mathop{\partial_\mu} \bigl( e^{\unaryminus i \alpha(x)} \psi(x) \bigr) \\ + &= \underbrace{\diracadj{\psi}(x) \mathop{\partial_\mu} \psi(x)}_{\text{free particle}} + \mskip\medmuskip \binaryminus \mskip\medmuskip i \, \diracadj{\psi}(x) + \underbrace{\mathop{\partial_\mu} \bigl( \alpha(x) \bigr)}_{\mathclap{\text{vector field}}} \psi(x). + \end{align*} + \end{breakabledisplay} +\end{typoginspect} + + +\clearpage +\section{\packagename{Setspace} Front-End} + +\fontsizeinfo{defaultsize} +Current settings are \defaultsize{} +%--\settoheight{\typogfontsize}{CEMNORSUVWXZ} +and \code{\string\typogfontsize} is \the\typogfontsize. + + +\newcommand*{\absbls}{12pt plus 1pt minus .5pt} +\paragraph{\code{\string\setbaselineskip\{\absbls\}}} +\resetbaselineskip +\setbaselineskip{10pt + 2.75pt}% addition +\setbaselineskip{10.5pt * 100 / 105}% scaling +\setbaselineskip{11.8pt * 85 / 100}% scaling +\setbaselineskip{\absbls} +\fontsizeinfo{baselinesetsize} +New settings: \baselinesetsize. + +\texbookbaselineskipsample + + +\newcommand*{\relbls}{130} +\paragraph{\code{\string\setbaselineskippercentage\{\relbls\}}} +\setbaselineskippercentage{1 + 2 + .3333 * 100 + 100 * 0.6667}% float expression +\setbaselineskippercentage{\relbls} +\fontsizeinfo{baselinesetsize} +New settings: \baselinesetsize. + +\texbookbaselineskipsample + + +\newcommand*{\absled}{1.5pt} +\paragraph{\code{\string\setleading\{\absled\}}} +\setleading{1pt / -2.0}% negative leading +\setleading{\absled} +\fontsizeinfo{baselinesetsize} +New settings: \baselinesetsize. + +\texbookbaselineskipsample + + +\newcommand*{\relled}{30} +\paragraph{\code{\string\setleadingpercentage\{\relled\}}} +\setleadingpercentage{10 - 25 / 2}% negative leading +\setleadingpercentage{\relled} +\fontsizeinfo{baselinesetsize} +New settings: \baselinesetsize. + +\texbookbaselineskipsample + +\medskip + +\setstretch{1} +\texbookbaselineskipsamplecredits + + +\clearpage +\section{Smooth Ragged} + +\begin{exemplary} + \newcommand*{\ragwidth}{10pt} + \centering + \caption[Comparison of ragged right typesetting] + {Comparison of ragged right typesetting. + The first example uses \code{RaggedRight} of \packagename{ragged2e} + the second \code{smoothraggedrightpar} of \packagename{typog}. + Both examples share a \code{\string\fussy}~setting and + a \ragwidth~wide ragged right margin.\label{ex:smoothraggedright}} + + \setlength{\RaggedRightRightskip}{0pt plus \ragwidth} + + %\def\smoothraggedrightgenerator{quintuplet} + %\def\smoothraggedrightgenerator{septuplet} + \setlength{\smoothraggedrightragwidth}{\ragwidth} + %\def\smoothraggedrightfuzzfactor{.667} + + \iffalse + \begin{quote} + \begin{RaggedRight}\examplesetup + \texbookparshapeskipsample + \end{RaggedRight} + \end{quote} + + \begin{quote} + \begin{smoothraggedrightpar}\examplesetup + \texbookparshapeskipsample + \end{smoothraggedrightpar} + \end{quote} + \else + \exampleparbox[RaggedRight-reference]{\RaggedRight\texbooktolerancesample} + \qquad + \exampleparbox[smoothraggedrightpar]{\smoothraggedrightpar\texbooktolerancesample} + \fi + + \texbookparshapeskipsamplecredits + + \examplefontinformation +\end{exemplary} + + + %--\setlength{\smoothraggedrightparindent}{25pt} + %--\setlength{\parindent}{0pt} + +\noindent +\code{\string\parindent}=\the\parindent, +visually: \rule{.1pt}{.8em}\kern\parindent\rule{.1pt}{.8em}; + +\noindent +\code{\string\smoothraggedrightleftskip}=\the\smoothraggedrightleftskip. +\code{\string\smoothraggedrightparindent}=\the\smoothraggedrightparindent. +\smallskip + +{ + %--\setlength{\smoothraggedrightragwidth}{8pt} + \begin{smoothraggedright} + \texbooktolerancesample + + \texbooktolerancesample + \end{smoothraggedright} +} + +\medskip + +{ + \setlength{\smoothraggedrightragwidth}{15pt} + + \newcommand*{\definitionnilpotent}{% + Eine Abbildung oder ein Operator~\(A\) + heißen nilpotent vom Grad~\(k\), falls \(k \in N\) + die kleinste Zahl ist, für die gilt: \(A^k = 0\).} + + \begin{otherlanguage}{german} + \parbox[t]{60pt}{\fussy\RaggedRight\definitionnilpotent} + \hspace{40pt} + \parbox[t]{60pt}{\fussy\smoothraggedright\definitionnilpotent} + \end{otherlanguage} +} + +\clearpage +\begin{RaggedRight} + \begin{thebibliography}{0} + \bibitem{knuth:1986} + \bibauthor{Knuth, D.~E.}, + \bibtitle{The \TeX{}book}, + Vol.~A of Computers\&Typesetting, + Addison Wesley, Reading\kernedslash*MA, + 1986. + \end{thebibliography} +\end{RaggedRight} +\end{document} +%</example> +% \fi +% +% +% +% \iffalse +%<*nomicrotype> +\documentclass[]{article} + + +\usepackage[english]{babel} + +\usepackage{csquotes} +\DeclareQuoteStyle{typog-guillemets} + {\doubleguillemetright} + {\doubleguillemetleft} + {\singleguillemetright} + {\singleguillemetleft} + +\usepackage[]{typog} + + +\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}} + + +\begin{document} +\begin{center} + \Huge\bf\sf + TypoG Examples \\ + without Package~\packagename{microtype} +\end{center} + +\bigskip + +\noindent +This example \LaTeX-document uses package~\packagename{typog} +\emph{without} package~\packagename{microtype}. + +We want \packagename{typog} to be as usable as possible even without +the nice features that \packagename{microtype} offers. +After all \packagename{typog} is just a front-end for it. + +As we are testing a special configuration here anyhow, +we hook up our quotes with package~csquotes +to check whether they interact ok. +{\setquotestyle{typog-guillemets}% + \enquote{This is the outer part of the phrase + which contains the \enquote{inner part}.}} +\end{document} +%</nomicrotype> +% \fi +% +% +% +% \iffalse +%<*teximan2latex> +## Remove all lines we neither need nor want. +/^\\input /d +/^@anchor/d +/^@bye/d +/^@documentencoding/d +/^@node/d +/^@setfilename/d +/^@settitle/d +/^@top/d +/@menu/,/@end menu/d + +## Convert sectioning macros to our own hierarchy. +s/^@chapter \(.*\)$/\\subsection*{\\textls[40]{\1}}/ +s/^@section \(.*\)$/\\subsubsection*{\1}/ + +## Make `@asis' list resemble the Texinfo format. +s/@table @asis/\\begin{list}{}{\\itemindent=-20pt\\leftmargin=20pt}/ +s/@end table/\\end{list}/ + +## Indenting by four spaces generates a `verbatim' environment. +s/@verbatim/\\begin{verbatim}/ +s/@end verbatim/\\end{verbatim}/ + +## We substitute @display for our maxipage environment. +s/@display/\\begin{maxipage}/ +s/@end display/\\end{maxipage}/ + +## The argument format of the URL macro is different. +s/@url{\([^,]*\), \([^}]*\)}/\\href{\1}{\2}/g + +## Use our own markup. +s/\.\.\./\\dots{}/g +s/LaTeX/\\LaTeX{}/g +s/@file/\\textit/g +s/@strong/\\textbf/g +s/[w]{/mbox{/g + +## Quote some special characters. +s/%/\\%/g +s/_/\\_/g + +## Adapt to how a man-page is typeset. +## En-dashes in front of long options really suck! +s/--/-\\nolig*-/g + +## Converting the at-signs to backslashes is a bit tricky. +s/^@item/\\item/ +s/@\([A-Za-z][A-Za-z]*\){/\\\1{/g +s/@@/@/g + +## Convert selected macro names. +s/\\jobname/\\textbackslash jobname/g + +## Make qualified Perl names breakable. +s/::/::\\discretionary{}{}{}/g +%</teximan2latex> +% \fi +% +% +% +% \iffalse +%<*typog-grep> +#! /usr/bin/env perl + + +use autodie qw(:all); +use strict; +use warnings; + +use Data::Dumper (); +use English; +use File::Basename (); +use Getopt::Long; +use IO::File; +use IO::Handle; +use Term::ANSIColor (); + + +use constant COMMAND_NAME => File::Basename::basename($PROGRAM_NAME); + + +my $DEBUG = 0; +my $MATCH_COUNT = 0; +my $OUTPUT_IS_REDIRECTED; + + +sub fail_with_error { + print STDERR join('', COMMAND_NAME, ': ', @_, "\n"); + exit 2; +} + + +sub issue_warning { + print STDERR join('', COMMAND_NAME, ': warning: ', @_, "\n"); +} + + +sub debug_print { + return unless $DEBUG; + print STDERR "+ @_\n"; +} + + +sub quote_filesystem {qq("$_[0]")} +sub quote_literal {qq(`$_[0]')} + + +sub limit_string_length { + my ($a_string, $a_maximum_length) = @_; + + if (length $a_string <= $a_maximum_length) { + $a_string; + } else { + substr($a_string, 0, $a_maximum_length - 3) . '...'; + } +} + + +## We set all colors to `undef' and fill them later with the values +## of the actual configuration. +my $highlight_patterns = { + PARTIAL_LINE => { + FONT_SPEC => [qr# + \\ + (?: OMS | OMX | OT1 | T1 | TS1 | U ) + (?: /[^/]+ ){5} / \S+ \s + (?: \([+-]\d+\) )? + #x, undef], + MATH => [qr# + \$ + \\ + (?: LMS | OML ) + (?: /[^/]+ ){5} / \S+ \s + (?: \([+-]\d+\) )? + .*? + \$ + #x, undef] + }, + WHOLE_LINE => { + FILL_STATE => [qr#^(?:Under|Over)full \\hbox .*$#, undef], + FIRST_VBOX => [qr#^%%#, undef], + HORIZONTAL_BREAKPOINT => [qr#^@@\d+:.*$#, undef], + HORIZONTAL_BREAK_CANDIDATE => [qr#^@[\\ ].*$#, undef], + LINE_BREAK_PASS => [qr#^@[a-z]+?pass#, undef], + TIGHTNESS => [qr#^(?:Loose|Tight) \\hbox .*$#, undef], + VERTICAL_BREAKPOINT => [qr#^% t=\d+.*$#, undef] + } +}; + + +sub colorize_line { + my ($configuration, $line) = @_; + + foreach my $pattern_color_pair (values %{$highlight_patterns->{WHOLE_LINE}}) { + next unless $pattern_color_pair->[1]; + return Term::ANSIColor::colored($line, $pattern_color_pair->[1]) + if $line =~ $pattern_color_pair->[0]; + } + return $line if $line =~ m#^\.#; # we do not paint box contents yet + + $line =~ s#$highlight_patterns->{PARTIAL_LINE}->{MATH}->[0] + #Term::ANSIColor::colored($MATCH, $highlight_patterns->{PARTIAL_LINE}->{MATH}->[1]) + #egx; + + $line =~ s#$highlight_patterns->{PARTIAL_LINE}->{FONT_SPEC}->[0] + #Term::ANSIColor::colored($MATCH, $highlight_patterns->{PARTIAL_LINE}->{FONT_SPEC}->[1]) + #egx; + + return $line; +} + + +my $open_or_close_tag_regexp = qr#^</?typog-inspect[ >]#; # somewhat sloppy definition +my $close_tag_regexp = qr#^</typog-inspect>#; +my $open_tag_regexp = + qr#^ + <typog-inspect \s+ + id="(?<id_match> .*?)" \s+ + job="(?<job_match> .*?)" \s+ + line="(?<line_match> .*?)" \s+ + page="(?<page_match> .*?)" + >#x; + + +sub grep_log_file { + my ($options, $configuration, $file, $filename, $id_regexp) = @_; + + my $job_name; + my $line_number = 0; # line number in the log file we are inspecting, i.e., $filename + my $match_count = 0; + my $source_line_number; # line number in TeX file the log refers to, i.e., "$job_name.tex" + my $page_number; + my $regexp_modifier = $options->{IGNORE_CASE} ? 'i' : ''; + my $id_value; + my @nesting_levels; + + if ($options->{WORD_REGEXP}) { + $id_regexp = "\\b$id_regexp\\b"; + } + + while (my $line = readline $file) { + chomp $line; + $line_number++; + + if ($line =~ $close_tag_regexp) { + fail_with_error("$filename: $line_number: mismatched open/close tags") unless @nesting_levels; + pop @nesting_levels; + } + + if (@nesting_levels and $nesting_levels[-1] and $line !~ $open_or_close_tag_regexp) { + if ($options->{LOG_LINE_NUMBER}) { + my $formatted_log_line_number = + sprintf $configuration->{LOG_LINE_NUMBER_FORMAT}, $line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_log_line_number = + Term::ANSIColor::colored($formatted_log_line_number, + $configuration->{COLORS}->{LOG_LINE_NUMBER}); + } + print $formatted_log_line_number, ' '; + } + + print "$job_name: " if $options->{JOB_NAME}; + + if ($options->{LINE_NUMBER}) { + my $formatted_line_number = sprintf $configuration->{LINE_NUMBER_FORMAT}, $source_line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_line_number = + Term::ANSIColor::colored($formatted_line_number, + $configuration->{COLORS}->{LINE_NUMBER}); + } + print $formatted_line_number, ' '; + } + + if ($options->{PAGE_NUMBER}) { + my $formatted_page_number = sprintf $configuration->{PAGE_NUMBER_FORMAT}, $page_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_page_number = + Term::ANSIColor::colored($formatted_page_number, + $configuration->{COLORS}->{PAGE_NUMBER}); + } + print $formatted_page_number, ' '; + } + + if ($options->{ID} and not $configuration->{PRINT_ID_AS_HEADING}) { + my $formatted_id = sprintf $configuration->{ID_INLINE_FORMAT}, $id_value; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_id = Term::ANSIColor::colored($formatted_id , + $configuration->{COLORS}->{ID_COLOR}); + } + print $formatted_id, ' '; + } + + if ($options->{COLORIZE_OUTPUT}) { + print colorize_line($configuration, $line); + } else { + print $line; + } + print "\n"; + } + + if ($line =~ $open_tag_regexp) { + $id_value = limit_string_length($+{id_match}, $configuration->{ID_MAX_LENGTH}); + $job_name = $+{job_match}; + $source_line_number = $+{line_match}; + $page_number = $+{page_match}; + + my $found_matching_id = ($id_value =~ m/(?$regexp_modifier)$id_regexp/) ? 1 : 0; + push @nesting_levels, $found_matching_id; + if ($found_matching_id) { + ++$MATCH_COUNT; # global count -- needed for return code of program + ++$match_count; # per file count -- needed to be able to separate the hunks + + print "\n" if $match_count >= 2; + if ($options->{ID} and $configuration->{PRINT_ID_AS_HEADING}) { + my $formatted_id = sprintf $configuration->{ID_HEADING_FORMAT}, $id_value; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_id = + Term::ANSIColor::colored($formatted_id, + $configuration->{COLORS}->{ID_HEADING_COLOR}); + } + print $formatted_id, "\n"; + } + } + } + } +} + + +sub show_ids_in_file { + my ($options, $configuration, $file, $filename, $id_regexp) = @_; + + my $line_number = 0; + my @nesting_levels; + + while (my $line = readline $file) { + chomp $line; + $line_number++; + + if ($line =~ $close_tag_regexp) { + fail_with_error("$filename: $line_number: mismatched open/close tags") unless @nesting_levels; + pop @nesting_levels; + } + + if ($line =~ $open_tag_regexp) { + my $id_value = limit_string_length($+{id_match}, $configuration->{ID_MAX_LENGTH}); + my $job_name = $+{job_match}; + my $source_line_number = $+{line_match}; + my $page_number = $+{page_match}; + + ++$MATCH_COUNT; + push @nesting_levels, 1; + + if ($options->{LOG_LINE_NUMBER}) { + my $formatted_log_line_number = + sprintf $configuration->{LOG_LINE_NUMBER_FORMAT}, $line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_log_line_number = + Term::ANSIColor::colored($formatted_log_line_number, + $configuration->{COLORS}->{LOG_LINE_NUMBER}); + } + print $formatted_log_line_number, ' '; + } + + print "$job_name: " if $options->{JOB_NAME}; + + if ($options->{LINE_NUMBER}) { + my $formatted_line_number = sprintf $configuration->{LINE_NUMBER_FORMAT}, $source_line_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_line_number = + Term::ANSIColor::colored($formatted_line_number, + $configuration->{COLORS}->{LINE_NUMBER}); + } + print $formatted_line_number, ' '; + } + + if ($options->{PAGE_NUMBER}) { + my $formatted_page_number = sprintf $configuration->{PAGE_NUMBER_FORMAT}, $page_number; + if ($options->{COLORIZE_OUTPUT}) { + $formatted_page_number = + Term::ANSIColor::colored($formatted_page_number, + $configuration->{COLORS}->{PAGE_NUMBER}); + } + print $formatted_page_number, ' '; + } + + my $indent = $configuration->{ID_INDENT} * (@nesting_levels - 1); + print ' ' x $indent, $id_value, "\n"; + } + } +} + + +sub open_file_for_reading { + my $filename = shift; + + my $file; + + if ($filename eq 'stdin') { + $file = IO::Handle->new(); + $file->fdopen(fileno(STDIN), 'r') or + fail_with_error("cannot open stdin: $OS_ERROR"); + } else { + $file = IO::File->new($filename, 'r') or + fail_with_error("cannot open @{[quote_filesystem($filename)]}: $OS_ERROR"); + } + + $file; +} + + +sub close_file { + my ($file, $filename) = shift; + + $file->close or + issue_warning("problems while closing @{[quote_filesystem($filename)]}: $OS_ERROR"); +} + + +sub grep_or_show { + my ($options, $configuration, $file, $filename, $id_regexp) = @_; + + if ($options->{SHOW_ALL_IDS}) { + show_ids_in_file($options, $configuration, $file, $filename, $id_regexp); + } else { + grep_log_file($options, $configuration, $file, $filename, $id_regexp); + } +} + + +sub scan_files { + my ($options, $configuration, $id_regexp, $log_filenames) = @_; + + if (@$log_filenames) { + foreach my $log_filename (@$log_filenames) { + $log_filename = 'stdin' if $log_filename eq '-'; + if (@$log_filenames >= 2) { + print "\n" unless $log_filename eq $log_filenames->[0]; + my $filename_header = "==> $log_filename <==\n"; + $filename_header = Term::ANSIColor::colored($filename_header, + $configuration->{COLORS}->{FILE_HEADER}) + if $options->{COLORIZE_OUTPUT}; + print $filename_header; + } + my $file = open_file_for_reading($log_filename); + grep_or_show($options, $configuration, $file, $log_filename, $id_regexp); + close_file($file, $log_filename); + } + } else { + my $log_filename = 'stdin'; + my $file = open_file_for_reading($log_filename); + grep_or_show($options, $configuration, $file, $log_filename, $id_regexp); + close_file($file, $log_filename); + } +} + + +sub redirect_and_scan_files { + my ($options, $configuration, $id_regexp, $log_filenames) = @_; + + my $pager; + + my $pid = open($pager, '|-', $configuration->{PAGER}, $configuration->{PAGER_FLAGS}); + fail_with_error('failed to redirect to pager ', quote_literal($configuration->{PAGER}), + ' with flags ', quote_literal($configuration->{PAGER_FLAGS}), + ": $OS_ERROR") + unless defined $pid; + my $stdout = select $pager; + + $pager->autoflush; + scan_files($options, $configuration, $id_regexp, $log_filenames); + + close $pager or issue_warning "error occurred while closing the pager (pid: $pid) pipe: $OS_ERROR"; + select $stdout; +} + + +######################################################################## + + +my $configuration_key_map = { + 'id-format' => 'ID_INLINE_FORMAT', + 'id-indent' => 'ID_INDENT', + 'id-heading' => 'PRINT_ID_AS_HEADING', + 'id-heading-format' => 'ID_HEADING_FORMAT', + 'id-max-length' => 'ID_MAX_LENGTH', + 'line-number-format' => 'LINE_NUMBER_FORMAT', + 'log-line-number-format' => 'LOG_LINE_NUMBER_FORMAT', + 'page-number-format' => 'PAGE_NUMBER_FORMAT', + + 'file-header-color' => 'FILE_HEADER', + 'fill-state-color' => 'FILL_STATE', + 'first-vbox-color' => 'FIRST_VBOX', + 'font-spec-color' => 'FONT_SPEC', + 'horizontal-break-candidate-color' => 'HORIZONTAL_BREAK_CANDIDATE', + 'horizontal-breakpoint-color' => 'HORIZONTAL_BREAKPOINT', + 'id-color' => 'ID_COLOR', + 'id-heading-color' => 'ID_HEADING_COLOR', + 'line-break-pass-color' => 'LINE_BREAK_PASS', + 'line-number-color' => 'LINE_NUMBER', + 'log-line-number-color' => 'LOG_LINE_NUMBER', + 'math-color' => 'MATH', + 'page-number-color' => 'PAGE_NUMBER', + 'pager' => 'PAGER', + 'pager-flags' => 'PAGER_FLAGS', + 'tightness-color' => 'TIGHTNESS', + 'vertical-breakpoint-color' => 'VERTICAL_BREAKPOINT' +}; + + +my $default_configuration = { + COLORS => { + FILE_HEADER => 'bold black', + FILL_STATE => 'bold magenta', + FIRST_VBOX => 'bold red', + FONT_SPEC => 'grey12', + HORIZONTAL_BREAKPOINT => 'bold green', + HORIZONTAL_BREAK_CANDIDATE => 'blue', + ID_COLOR => 'white on_black', + ID_HEADING_COLOR => 'white on_black', + LINE_BREAK_PASS => 'bold green', + LINE_NUMBER => 'bold black', + LOG_LINE_NUMBER => 'italic black', + MATH => 'yellow', + PAGE_NUMBER => 'bold white on_red', + TIGHTNESS => 'bold cyan', + VERTICAL_BREAKPOINT => 'red' + }, + ID_INLINE_FORMAT => '%s:', + ID_HEADING_FORMAT => '--> %s <--', + ID_INDENT => 8, + ID_MAX_LENGTH => 40, + LINE_NUMBER_FORMAT => '%5d', + LOG_LINE_NUMBER_FORMAT => '%6d', + PAGE_NUMBER_FORMAT => '[%3d]', + PAGER => 'less', + PAGER_FLAGS => '--quit-if-one-screen', + PRINT_ID_AS_HEADING => 0 +}; + + +sub initialize_highlighting_from_configuration { + my $configuration = shift; + + while (my (undef, $assoc) = each %$highlight_patterns) { + while (my ($name, $pattern_color_pair) = each %$assoc) { + $pattern_color_pair->[1] = $configuration->{COLORS}->{$name}; + } + } +} + + +sub modify_configuration { + my ($configuration, $key, $value) = @_; + + fail_with_error('malformed KEY=VALUE pair -- missing key') unless $key; + + if (defined $configuration_key_map->{$key}) { + if ($key =~ m/-color$/) { + $configuration->{COLORS}->{$configuration_key_map->{$key}} = $value; + } else { + $configuration->{$configuration_key_map->{$key}} = $value; + } + } else { + fail_with_error("@{[quote_literal($key)]} is not a valid configuration KEY"); + } +} + + +sub setup_configuation { + my ($config_spec, $configuration) = @_; + + foreach my $spec (split ':', $config_spec) { + my ($key, $value) = split '=', $spec; + modify_configuration($configuration, $key, $value); + } +} + + +my $default_options = { + COLORIZE_MODE => 'auto', + DEBUG => 0, + ID => 0, + IGNORE_CASE => 0, + JOB_NAME => 0, + LINE_NUMBER => 0, + LOG_LINE_NUMBER => 0, + PAGE_NUMBER => 0, + REQUEST_PAGER => 1, + WORD_REGEXP => 0 +}; + + +sub show_help { + print <<HELP_TEXT; +Usage: @{[COMMAND_NAME]} [OPTION] ID-REGEXP LOG-FILE... +Structured grep for typog-inspect elements that match ID-REGEXP in LOG-FILE. + +Options + --color [WHEN], + --colour [WHEN] use color to highlight specific log contents + WHEN is 'always', 'never', or 'auto' + -C, --config KEY=VALUE set configuration KEY to VALUE + -i, --[no-]id print matching id with output lines + -y, --[no-]ignore-case ignore case distinctions in patterns and data + -j, --[no-]job-name print \\jobname with output lines + -n, --[no-]line-number print TeX-source line number with output lines + -N, --[no-]log-line-number print log-file line number with output lines + -p, --[no-]page-number print page number with output lines + -P, --[no-]pager redirect output to pager + -w, --[no-]word-regexp match only whole words + + -a, --all, --any show all IDs in LOG-FILE + --debug turn on debug output + -h, --help display this help and exit + --show-config show default configuration and exit + -V, --version show version information and exit + +HELP_TEXT + + exit 0; +} + + +sub show_configuration { + my $format_string_value = sub {quote_literal($default_configuration->{$_[0]})}; + + print <<FIXED_CONFIGURATION_TEXT; +Configuration +Key Default Value +------------------------------------ ------------- +id-format @{[$format_string_value->('ID_INLINE_FORMAT')]} +id-heading $default_configuration->{PRINT_ID_AS_HEADING} +id-heading-format @{[$format_string_value->('ID_HEADING_FORMAT')]} +id-indent $default_configuration->{ID_INDENT} +id-max-length $default_configuration->{ID_MAX_LENGTH} +line-number-format @{[$format_string_value->('LINE_NUMBER_FORMAT')]} +log-line-number-format @{[$format_string_value->('LOG_LINE_NUMBER_FORMAT')]} +page-number-format @{[$format_string_value->('PAGE_NUMBER_FORMAT')]} +pager @{[$format_string_value->('PAGER')]} +pager-flags @{[$format_string_value->('PAGER_FLAGS')]} + +FIXED_CONFIGURATION_TEXT + + foreach my $configuration_key (sort keys %$configuration_key_map) { + next unless $configuration_key =~ m/-color$/; + printf("%-36s %s\n", + $configuration_key, + quote_literal($default_configuration-> + {COLORS}-> + {$configuration_key_map->{$configuration_key}})); + } + + exit 0; +} + + +sub show_version { + print <<VERSION_TEXT; +typog-grep 0.1 + +Copyright (C) 2024 by Ch. L. Spiel +License LPPL: LaTeX Project Public License version 1.3 or later +VERSION_TEXT + + exit 0; +} + + +sub get_options { + my ($options, $configuration) = @_; + + Getopt::Long::Configure('gnu_getopt', 'no_ignore_case'); + + Getopt::Long::GetOptions('a|all|any' => \$options->{SHOW_ALL_IDS}, + 'color|colour=s' => \$options->{COLORIZE_MODE}, + 'C|configuration=s' => sub{setup_configuation($_[1], $configuration)}, + 'debug+' => \$DEBUG, + 'h|help' => \&show_help, + 'i|id!' => \$options->{ID}, + 'y|ignore-case!' => \$options->{IGNORE_CASE}, + 'j|job-name!' => \$options->{JOB_NAME}, + 'n|line-number!' => \$options->{LINE_NUMBER}, + 'N|log-line-number!' => \$options->{LOG_LINE_NUMBER}, + 'p|page-number!' => \$options->{PAGE_NUMBER}, + 'P|pager!' => \$options->{REQUEST_PAGER}, + 'show-config' => \&show_configuration, + 'V|version' => \&show_version, + 'w|word-regexp!' => \$options->{WORD_REGEXP}) or + fail_with_error('problems while parsing options'); + + fail_with_error("unknown colorize mode @{[quote_literal($options->{COLORIZE_MODE})]}") + unless $options->{COLORIZE_MODE} =~ m/^(?:always|auto|never)$/i +} + + +sub do_colorize { + my $colorize_mode = shift; + + if ($colorize_mode =~ m/never/i) { + 0; + } elsif ($colorize_mode =~ m/always/i) { + 1; + } elsif ($colorize_mode =~ m/auto/i) { + not $OUTPUT_IS_REDIRECTED; + } +} + + +## For the comparison with the POSIX spec of grep(1) consult +## https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html + + +sub main { + $OUTPUT_IS_REDIRECTED = -t STDOUT ? 0 : 1; + + my $options = {%$default_options}; + my $configuration = {%$default_configuration}; + + get_options($options, $configuration); + $options->{COLORIZE_OUTPUT} = do_colorize($options->{COLORIZE_MODE}); + initialize_highlighting_from_configuration($configuration); + debug_print(Data::Dumper::Dumper($configuration)); + debug_print(Data::Dumper::Dumper($options)); + + my $id_regexp; + if ($options->{SHOW_ALL_IDS}) { + $id_regexp = '^'; + issue_warning("option @{[quote_literal('--id')]} ignored in @{[quote_literal('--all')]} mode") + if $options->{ID}; + } else { + fail_with_error('missing ID-REGEXP') unless @ARGV >= 1; + $id_regexp = shift @ARGV; + } + + if ($options->{REQUEST_PAGER} && $OUTPUT_IS_REDIRECTED) { + issue_warning("option @{[quote_literal('--pager')]} ignored because output is redirected"); + } + my $use_pager = $options->{REQUEST_PAGER} && !$OUTPUT_IS_REDIRECTED; + if ($use_pager) { + redirect_and_scan_files($options, $configuration, $id_regexp, \@ARGV); + } else { + scan_files($options, $configuration, $id_regexp, \@ARGV); + } + + exit ($MATCH_COUNT == 0); +} + + +main(); +%</typog-grep> +% \fi +% +% +% +% \iffalse +%<*typog-grep-documentation> +=begin man + +.\" Turn off justification. +.na + +=end man + +=head1 NAME + +typog-grep - grep for typog-inspect elements in LaTeX log files + + +=head1 SYNOPSIS + +=over + +=item B<typog-grep> -a|--all|--any [I<OPTION>...] F<LOG-FILE>... + +=item B<typog-grep> [I<OPTION>...] I<REGEXP> F<LOG-FILE>... + +=back + +The first form shows all C<E<lt>typog-inspect id="I<ID>" ...E<gt>> elements in F<LOG-FILE>. + +The second form shows the contents of C<E<lt>typog-inspect id="I<ID>" ...E<gt>> elements +whose I<ID>s match I<REGEXP> in F<LOG-FILE>. + +If no F<LOG-FILE> is given read from F<stdin>. +The S<filename C<->> is synonymous to F<stdin>. + + +=head1 DESCRIPTION + +B<typog-grep> is a tailored post-processor for LaTeX log files +and the C<typoginspect> environment as provided by S<package typog>. +It shares more with the venerable +L<B<sgrep>|https://www.cs.helsinki.fi/u/jjaakkol/sgrep.html> +than with S<POSIX L<B<grep>|https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html>>. + +The LaTeX user brackets her text in + + \begin{typoginspect}{ID} + Text and code to investigate + \end{typoginspect} + +where I<ID> is used to identify one or more bracketed snippets. +I<ID> does not have to be unique. +The I<REGEXP> mechanism makes it easy to select groups of related I<ID>s +if they are named accordingly. + +In F<LOG-FILE> the environment shows up, packed with tracing information, as + +=begin texinfo + +@display +@relax + +=end texinfo + + <typog-inspect id="ID" job="JOB-NAME" line="LINE-NUMBER" page="PAGE-NUMBER"> + Trace Data + </typog-inspect> + +=begin texinfo + +@end display +@relax + +=end texinfo + +where all the capital-letter sequences are meta-variables +and in particular +I<JOB-NAME> is the expansion of C<\jobname>, +I<LINE-NUMBER> is the LaTeX source file line number +of the beginning of the C<typoginspect> environment, +and I<PAGE-NUMBER> is the page where +the output of S<C<Text and code to investigate>> occurs. + +B<typog-grep> reveals the contents of F<LOG-FILE> +between C<E<lt>typog-inspect id="I<ID>" ...E<gt>> +and C<E<lt>/typog-inspectE<gt>> excluding the XML-tags. +Access the I<JOB-NAME>, I<LINE-NUMBER>, and I<PAGE-NUMBER> +with the commandline options +B<--job-name>, B<--line-number>, and B<--page-number>, respectively. +Use B<--id> to show the name of the IDs that matched I<REGEXP>. + +C<typoginspect> environments can be nested. +B<typog-grep> respects the nesting, +i.e., if the I<ID> of the nested environment does not match I<REGEXP> +it will not be included in the program's output. + + +=head1 OPTIONS + +The list of options is sorted by the names of the long options. + +=over 4 + +=item B<-a>, B<--all>, B<--any> + +ID-discovery mode: +Show all C<typog-inspect> elements independent of any matching patterns. + +=item B<--color>, B<colour> I<WHEN> + +Colorize specific log contents for the matching ids. +The S<argument I<WHEN>> determines when to apply color: +C<always>, C<never>, S<or C<auto>>. +The setting C<auto> checks whether standard output has been redirected. +This is the default. + +=item B<-C>, B<--config> I<KEY>=I<VALUE>[:I<KEY>=I<VALUE>[:...]] + +Set one or more configuration I<KEY> to I<VALUE> pairs. +See S<Sec. CONFIGURATION> below for a description of all available configuration items. +Use option B<--show-config> to display the default configuration. + +=item B<--debug> + +Turn on debug output on F<stderr>. + +=item B<-h>, B<--help> + +Display brief help then exit. + +=item B<-i>, B<--[no-]id> + +Print the actual id name that matched I<REGEXP>. +Control the appearance of the matching id with configuration S<item C<id-heading>>. + +=item B<-y>, B<--[no-]ignore-case> + +Match ids while ignoring case distinctions in patterns and data. + +=item B<-j>, B<--[no-]job-name> + +Print the C<\jobname> that B<tex> associated with the input file. + +=item B<-n>, B<--[no-]line-number> + +Print the line number where the S<C<typoginspect> environment> +was encountered in the LaTeX source file. + +=item B<-N>, B<--[no-]log-line-number> + +Print the line number of the F<log>-file where the current line was encountered. + +=item B<-p>, B<--[no-]page-number> + +Print page number where the contents of the S<C<typoginspect> environment> +starts in the typeset document. + +=item B<-P>, B<--[no-]pager> + +Redirect output from F<stdout> to the configured pager. + +=item B<--show-config> + +Show the default configuration and exit. + +=item B<-V>, B<--version> + +Show version information and exit. + +=item B<-w>, B<--[no-]word-regexp> + +Match only whole words. + +=back + + +=head1 CONFIGURATION + +=over 4 + +=item C<id-format>=I<FORMAT> + +Control the I<FORMAT> for printing matching ids in inline-mode, +where I<FORMAT> is passed to Perl's C<printf>. +S<Default: C<%s:>.> + +=item C<id-heading>=C<0>E<verbar>C<1> + +Choose between printing the matching ids with S<option B<--id>>: +S<Inline (C<0>)> or heading before the matching data (C<1>). +S<Default: C<0>.> + +=item C<id-heading-format>=I<FORMAT> + +Control the I<FORMAT> for printing matching ids in heading-mode, +where I<FORMAT> is passed to Perl's C<printf>. +S<Default: C<--E<gt> %s E<lt>-->.> + +=item C<id-indent>=I<INDENT> + +Indentation of nested typog-inspect tags. +Only used in ``discovery'' mode (first form), i.e., if B<--all> is active. +S<Default: 8.> + +=item C<id-max-length>=I<MAXIMUM-LENGTH> + +Set the maximum length of a matching id for printing. +It a matching id exceeds this length it will be truncated +and the last three characters (short of I<MAXIMUM-LENGTH>) will be replaced by dots. +S<Default: 40.> + +=item C<line-number-format>=I<FORMAT> + +Control the I<FORMAT> for printing TeX source line numbers, +where I<FORMAT> is passed to Perl's C<printf>. +S<Default: C<%5d>.> + +=item C<log-line-number-format>=I<FORMAT> + +Control the I<FORMAT> for printing log line numbers, +where I<FORMAT> is passed to Perl's C<printf>. +S<Default: C<%6d>.> + +=item C<page-number-format>=I<FORMAT> + +Control the I<FORMAT> for printing page numbers, +where I<FORMAT> is passed to Perl's C<printf>. +S<Default: C<[%3d]>.> + +=item C<pager>=I<PAGER> + +Name of pager application to pipe output into +if run with S<option B<--pager>>. +S<Default: C<less>>. + +=item C<pager-flags>=I<FLAGS> + +Pass I<FLAGS> to I<PAGER>. +S<Default: C<--quit-if-one-screen>>. + +=item Color Configuration + +For the syntax of the color specifications consult +the manual page of Term::ANSIColor(pm). + +=over 4 + +=item C<file-header-color> + +Color of the filename header. + +=item C<fill-state-color> + +Color of the messages that report ``Underfull hbox'' or ``Overfull hbox''. + +=item C<first-vbox-color> + +Color of the first vbox on a page. + +=item C<font-spec-color> + +Color of font specifications. + +=item C<horizontal-break-candidate-color> + +Color of lines with horizontal-breakpoint S<candidates C<@>>. + +=item C<horizontal-breakpoint-color> + +Color of lines with horizontal S<breakpoints C<@@>>. + +=item C<id-color> + +Color of matching ids when printed inline. + +=item C<id-heading-color> + +Color of matching ids when printed in heading form. + +=item C<line-break-pass-color> + +Color of the lines showing which pass (e.g., C<@firstpass>) +of the line-breaking algorithm is active. + +=item C<line-number-color> + +Color of TeX-source-file line numbers. + +=item C<log-line-number-color> + +Color of log-file line numbers. + +=item C<math-color> + +Color used for math expressions including their font specs. + +=item C<page-number-color> + +Color of page numbers of the final output. + +=item C<tightness-color> + +Color of lines with Tight/Loose hbox reports. + +=item C<vertical-breakpoint-color> + +Color of possible vertical breakpoints. + +=back + +=back + + +=head2 Brief summary of colors and attributes + +=over 4 + +=item Foreground Color + +C<black>, C<red>, C<green>, C<yellow>, +C<blue>, C<magenta>, C<cyan>, C<white>, + +Prefix with C<bright_> for high-intensity or bold foreground. + +=item Foreground Grey + +C<grey0>, ..., C<grey23> + +=item Background Color + +C<on_black>, C<on_red>, C<on_green>, C<on_yellow>, +S<C<on_blue>>, S<C<on_magenta>>, S<C<on_cyan>>, S<C<on_white>> + +Replace C<on_> with C<on_bright_> for high-intensity or bold background. + +=item Background Grey + +C<on_grey0>, ..., C<on_grey23> + +=item Text Attribute + +C<bold>, C<dark>, C<italic>, C<underline>, C<reverse> + +=back + + +=head1 EXIT STATUS + +The exit status is 0 if at least one I<ID> matched I<REGEXP>, +1 if no I<ID> matched I<REGEXP>, and 2 if an error occurred. + + +=head1 SEE ALSO + +B<grep>(1), B<printf>(3), B<Term::ANSIColor>(pm) + + +=cut +%</typog-grep-documentation> +% \fi +% +% +% +\endinput +% +% +% +%%% Local Variables: +%%% compile-command: "latex typog.dtx" +%%% fill-column: 96 +%%% End: diff --git a/macros/latex/contrib/typog/typog.ins b/macros/latex/contrib/typog/typog.ins new file mode 100644 index 0000000000..06378d86bb --- /dev/null +++ b/macros/latex/contrib/typog/typog.ins @@ -0,0 +1,74 @@ +%% Copyright (C) 2024 by Ch. L. Spiel +%% +%% This work may be distributed and/or modified under the conditions +%% of the LaTeX Project Public License, either version 1.3 of this +%% license or (at your option) any later version. The latest version +%% of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2003/12/01 or later. + + +\input docstrip + + +\keepsilent +\askforoverwritefalse + + +\preamble + +This is a generated file. + +Copyright (C) 2024 by Ch. L. Spiel + +This work may be distributed and/or modified under the conditions +of the LaTeX Project Public License, either version 1.3 of this +license or (at your option) any later version. The latest version +of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2003/12/01 or later. + +This work has the LPPL maintenance status `maintained'. + +The Current Maintainer of this work is Ch. L. Spiel. + +This work consists of the files typog.dtx and typog.ins +and the derived files typog.sty, slant-angle.mp, +crooked-paragraphs.mp, smooth-parshapes.mp, title.mp, +typog-example.tex, typog-nomt.tex, typog-grep.pl, +typog-grep.pod, and teximan2latex.sed. + + +\endpreamble + + +\edef\source{\jobname.dtx} + +\generate{\file{typog.sty}{\from{\source}{package}} + \file{typog-example.tex}{\from{\source}{example}} + \file{typog-nomt.tex}{\from{\source}{nomicrotype}} + \file{typog.ist}{\from{\source}{index-style}}} + + +\nopostamble +\generate{\file{title.mp}{\from{\source}{title}} + \file{slant-angle.mp}{\from{\source}{slantangle}} + \file{crooked-paragraphs.mp}{\from{\source}{crookedparagraphs}} + \file{smooth-parshapes.mp}{\from{\source}{smoothparshapes}}} + + +\nopreamble +\generate{\file{teximan2latex.sed}{\from{\source}{teximan2latex}} + \file{typog-grep.pl}{\from{\source}{typog-grep}} + \file{typog-grep.pod}{\from{\source}{typog-grep-documentation}}} + + +\endbatchfile + + +%% Local Variables: +%% compile-command: "latex typog.ins" +%% mode: latex +%% End: diff --git a/macros/unicodetex/latex/fontspec/CHANGES.md b/macros/unicodetex/latex/fontspec/CHANGES.md index 7dab8151f3..47c3b7128e 100644 --- a/macros/unicodetex/latex/fontspec/CHANGES.md +++ b/macros/unicodetex/latex/fontspec/CHANGES.md @@ -1,6 +1,22 @@ Change history ============== +## v2.9d (2024/05/07) + + * Now that `Script` and `Language` are retained even if the font doesn't support them, + we can no longer check for font feature existence before applying the OpenType tags. + This release removes checking. (#515) + + * Fix bug/regression in loading font families constructed from fonts with different file + extensions; e.g.: (#514) + + \setmainfont{MyLato} + [ + UprightFont = Lato-Regular.ttf , + BoldFont = FiraSans-Bold.otf , + ] + + ## v2.9c (2024/05/03) * Fix copy/paste regression bug with the `Language` feature (primarily exposed through `babel` package). (#513) diff --git a/macros/unicodetex/latex/fontspec/README.md b/macros/unicodetex/latex/fontspec/README.md index 6624bcca6b..0f66c46901 100644 --- a/macros/unicodetex/latex/fontspec/README.md +++ b/macros/unicodetex/latex/fontspec/README.md @@ -11,7 +11,27 @@ available with OpenType (and other) fonts, including upper and lower case number proportional and monospaced numbers, swash letters, ligature control, and many many others. -See the documentation `fontspec.pdf` for full information. + +Documentation +------------- + +See the PDF documentation for complete user information (including examples): + + texdoc fontspec + +Additional online documentation is provided at: + <http://latex3.github.io/fontspec/> + +The package code is documented in typeset PDF form via + + texdoc fontspec-code + +Licence +------- + +This package is distributed under the terms and conditions of the LaTeX Project Public License (LPPL), version 1.3a or higher. + +The maintainer of the package is Will Robertson and the LaTeX3 project. Summary of user commands @@ -50,9 +70,6 @@ To add features to the font family currently in use: Package details --------------- -Repository documentation is provided at: - <http://latex3.github.io/fontspec/> - Release versions of fontspec are available from CTAN: <http://www.ctan.org/pkg/fontspec> @@ -70,7 +87,11 @@ package by running If you wish to manually download the latest release version from CTAN, get the pre-built TDS package and extract it into your local texmf tree: - http://mirror.ctan.org/install/macros/latex/contrib/fontspec.tds.zip + http://mirror.ctan.org/install/macros/unicodetex/latex/fontspec.tds.zip + +Historical releases are available via GitHub: + <https://github.com/latex3/fontspec/releases> + <https://github.com/latex3/fontspec/tags> If you wish to use the latest development version from Github, use git to obtain the latest repository code with diff --git a/macros/unicodetex/latex/fontspec/fontspec-code-api.dtx b/macros/unicodetex/latex/fontspec/fontspec-code-api.dtx index be63bcc056..2b21012472 100644 --- a/macros/unicodetex/latex/fontspec/fontspec-code-api.dtx +++ b/macros/unicodetex/latex/fontspec/fontspec-code-api.dtx @@ -388,6 +388,7 @@ \@@_tl_new_if_free:N #1 #4 #1 \l_fontspec_family_tl \tl_set:Nn \l_@@_fontface_cs_tl {\l_fontspec_font} % reset +%<debug>\typeout{::::::~END~fontspec_set_family:Nnn} } \cs_new:Nn \fontspec_gset_family:Nnn { \@@_set_family:NnnN #1 {#2} {#3} \tl_gset_eq:NN } \cs_new:Nn \fontspec_set_family:Nnn { \@@_set_family:NnnN #1 {#2} {#3} \tl_set_eq:NN } diff --git a/macros/unicodetex/latex/fontspec/fontspec-code-internal.dtx b/macros/unicodetex/latex/fontspec/fontspec-code-internal.dtx index 16e2922b39..fd52183c18 100644 --- a/macros/unicodetex/latex/fontspec/fontspec-code-internal.dtx +++ b/macros/unicodetex/latex/fontspec/fontspec-code-internal.dtx @@ -37,13 +37,11 @@ \@@_font_suppress_not_found_error: \@@_init: - \@@_sanitise_fontname:Nn \l_fontspec_fontname_tl {#2} - \@@_sanitise_fontname:Nn \l_@@_fontname_up_tl {#2} - \@@_sanitise_fontname:Nn \l_@@_basename_tl {#2} + \@@_sanitise_fontname:Nn \l_fontspec_fontname_tl {#2} + \tl_set_eq:NN \l_@@_fontname_up_tl \l_fontspec_fontname_tl + \tl_set_eq:NN \l_@@_basename_tl \l_fontspec_fontname_tl %<debug>\typeout{^^J::::::::::::::: l_fontspec_fontname_tl~ =~ \l_fontspec_fontname_tl } -%<debug>\typeout{::::::::::::::: _fontname_up_tl~ =~ \l_@@_fontname_up_tl } -%<debug>\typeout{::::::::::::::: l_@@_extension_tl~ =~ \l_@@_extension_tl } \@@_if_detect_external:nT {#2} { \keys_set:nn {fontspec-preparse-external} {Path} } @@ -80,6 +78,7 @@ \group_end: \tl_set_eq:NN \l_fontspec_family_tl \g_@@_nfss_family_tl +%<debug>\typeout{::::::::::::::::::::::::::::::} } % \end{macrocode} % \end{macro} @@ -107,6 +106,7 @@ { \tl_if_in:NnT #1 {##1} { +%<debug> \typeout{::@@_process_ext:N~ --~ Removing~ EXT:~ ##1} \tl_remove_once:Nn #1 {##1} \tl_set:Nn \l_@@_extension_tl {##1} \@@_font_is_file: @@ -143,9 +143,9 @@ { \str_if_eq:eeT { \str_lowercase:f {\l_@@_extension_tl} } {.ttc} { - \@@_sanitise_fontname:Nn \l_@@_fontname_it_tl {#1} - \@@_sanitise_fontname:Nn \l_@@_fontname_bf_tl {#1} - \@@_sanitise_fontname:Nn \l_@@_fontname_bfit_tl {#1} + \tl_set_eq:NN \l_@@_fontname_it_tl \l_fontspec_fontname_tl + \tl_set_eq:NN \l_@@_fontname_bf_tl \l_fontspec_fontname_tl + \tl_set_eq:NN \l_@@_fontname_bfit_tl \l_fontspec_fontname_tl } } % \end{macrocode} @@ -253,7 +253,8 @@ { %<debug>\typeout{:: @@_load_font} -%<debug>\typeout{Set~ base~ font~ for~ preliminary~ analysis: \@@_construct_font_call:nn { \l_@@_fontname_up_tl } {} } + \@@_sanitise_fontname:Nn \l_@@_fontname_up_tl { \l_@@_fontname_up_tl } +%<debug>\typeout{Set~ base~ font~ for~ preliminary~ analysis:~ "\l_@@_fontname_up_tl"~ with~ features~ "\l_@@_pre_feat_sclist" } \@@_primitive_font_set:NnnF \l_@@_test_font { \@@_construct_font_call:nn { \l_@@_fontname_up_tl } { \l_@@_pre_feat_sclist } } { \f@size pt - 2sp } @@ -543,6 +544,7 @@ % \begin{macrocode} \cs_new:Nn \@@_set_faces_aux:nnnnn { +%<debug> \typeout{:: @@_set_faces_aux:nnnnn \exp_not:n { {#1} {#2} {#3} {#4} {#5} } } \fontspec_complete_fontname:Nn \l_@@_curr_fontname_tl {#3} \@@_make_font_shapes:Nnnnn \l_@@_curr_fontname_tl {#1} {#2} {#4} {#5} } @@ -557,8 +559,10 @@ \cs_new:Nn \fontspec_complete_fontname:Nn { \tl_set:Nx #1 {#2} - \tl_replace_all:Nne #1 {*} {\l_@@_basename_tl} - \@@_process_ext:N #1 + \tl_if_in:NnF \l_fontspec_fontname_tl {*} + { + \tl_replace_all:Nne #1 {*} {\l_@@_basename_tl} + } } % \end{macrocode} % \end{macro} diff --git a/macros/unicodetex/latex/fontspec/fontspec-code-keyval.dtx b/macros/unicodetex/latex/fontspec/fontspec-code-keyval.dtx index a844b0e056..bd83f8556c 100644 --- a/macros/unicodetex/latex/fontspec/fontspec-code-keyval.dtx +++ b/macros/unicodetex/latex/fontspec/fontspec-code-keyval.dtx @@ -173,7 +173,7 @@ % \begin{macrocode} \@@_keys_define_code:nnn {fontspec-preparse} {Script} { -%<XE> \keys_set:nn {fontspec-renderer} {Renderer=OpenType} +%<XE> \tl_if_empty:NT \l_@@_renderer_tl { \keys_set:nn {fontspec-renderer} {Renderer=OpenType} } \tl_set:Nn \l_@@_script_name_tl {#1} } % \end{macrocode} @@ -181,7 +181,7 @@ % \begin{macrocode} \@@_keys_define_code:nnn {fontspec-preparse} {Language} { -%<XE> \keys_set:nn {fontspec-renderer} {Renderer=OpenType} +%<XE> \tl_if_empty:NT \l_@@_renderer_tl { \keys_set:nn {fontspec-renderer} {Renderer=OpenType} } \tl_set:Nn \l_@@_lang_name_tl {#1} } % \end{macrocode} diff --git a/macros/unicodetex/latex/fontspec/fontspec-code-msg.dtx b/macros/unicodetex/latex/fontspec/fontspec-code-msg.dtx index 16b328fad3..2904f7350e 100644 --- a/macros/unicodetex/latex/fontspec/fontspec-code-msg.dtx +++ b/macros/unicodetex/latex/fontspec/fontspec-code-msg.dtx @@ -149,17 +149,6 @@ AAT feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available in font '\l_fontspec_fontname_tl'. } -\@@_msg_new:nn {icu-feature-not-exist} - { - '\l_keys_key_tl=\l_keys_value_tl' feature not supported - for OpenType font '\l_fontspec_fontname_tl' - } -\@@_msg_new:nn {icu-feature-not-exist-in-font} - { - OpenType feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available - for font '\l_fontspec_fontname_tl' - with script '\l_@@_script_name_tl' and language '\l_@@_lang_name_tl'. - } \@@_msg_new:nn {no-opticals} { '#1' doesn't appear to have an Optical Size axis. diff --git a/macros/unicodetex/latex/fontspec/fontspec-code-opentype.dtx b/macros/unicodetex/latex/fontspec/fontspec-code-opentype.dtx index d78e0a8be9..dab45952c6 100644 --- a/macros/unicodetex/latex/fontspec/fontspec-code-opentype.dtx +++ b/macros/unicodetex/latex/fontspec/fontspec-code-opentype.dtx @@ -127,21 +127,8 @@ \cs_new:Nn \@@_make_OT_feature:nnn { %<debug> \typeout{:: @@_make_OT_feature:nnn \exp_not:n { {#1}{#2}{#3} } } - - \bool_set_true:N \l_@@_proceed_bool - - \tl_if_empty:nF {#1} - { - \exp_args:No \@@_check_ot_feat:NnF \l_@@_fontface_cs_tl {#1} - { - \@@_warning:nx {icu-feature-not-exist-in-font} {#1} - \bool_set_false:N \l_@@_proceed_bool - } - } - \@@_remove_clashing_featstr:x { #2 , \@@_swap_plus_minus:n {#2} , #3 } - - \bool_if:NT \l_@@_proceed_bool { \@@_update_featstr:n {#2} } + \@@_update_featstr:n {#2} } \cs_generate_variant:Nn \@@_make_OT_feature:nnn {xxx} % \end{macrocode} diff --git a/macros/unicodetex/latex/fontspec/fontspec-code-vars.dtx b/macros/unicodetex/latex/fontspec/fontspec-code-vars.dtx index c2be0378c5..e063936404 100644 --- a/macros/unicodetex/latex/fontspec/fontspec-code-vars.dtx +++ b/macros/unicodetex/latex/fontspec/fontspec-code-vars.dtx @@ -68,7 +68,6 @@ \bool_new:N \l_@@_scriptlang_exist_bool \bool_new:N \g_@@_em_normalise_slant_bool \bool_new:N \l_@@_external_kpse_bool -\bool_new:N \l_@@_proceed_bool % \end{macrocode} % % \begin{macro}{\l_@@_never_check_bool} diff --git a/macros/unicodetex/latex/fontspec/fontspec-code.pdf b/macros/unicodetex/latex/fontspec/fontspec-code.pdf Binary files differindex 576b93ee4c..cf04b4a6a2 100644 --- a/macros/unicodetex/latex/fontspec/fontspec-code.pdf +++ b/macros/unicodetex/latex/fontspec/fontspec-code.pdf diff --git a/macros/unicodetex/latex/fontspec/fontspec.dtx b/macros/unicodetex/latex/fontspec/fontspec.dtx index e3002ff5e5..ea7bbffe55 100644 --- a/macros/unicodetex/latex/fontspec/fontspec.dtx +++ b/macros/unicodetex/latex/fontspec/fontspec.dtx @@ -70,7 +70,7 @@ \ProvidesExplFile{fontspec.dtx} %</dtx> %<*fontspec> - {2024/05/03}{2.9c}{Font selection for XeLaTeX and LuaLaTeX} + {2024/05/07}{2.9d}{Font selection for XeLaTeX and LuaLaTeX} %</fontspec> % \end{macrocode} % @@ -89,8 +89,8 @@ %<lua>local fontspec = fontspec %<lua>fontspec.module = { %<lua> name = "fontspec", -%<lua> version = "2.9c", -%<lua> date = "2024/05/03", +%<lua> version = "2.9d", +%<lua> date = "2024/05/07", %<lua> description = "Font selection for XeLaTeX and LuaLaTeX", %<lua> author = "Khaled Hosny, Philipp Gesang, Will Robertson", %<lua> copyright = "Khaled Hosny, Philipp Gesang, Will Robertson", diff --git a/macros/unicodetex/latex/fontspec/fontspec.pdf b/macros/unicodetex/latex/fontspec/fontspec.pdf Binary files differindex 0ceac30d40..643375da1e 100644 --- a/macros/unicodetex/latex/fontspec/fontspec.pdf +++ b/macros/unicodetex/latex/fontspec/fontspec.pdf |