summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/iffont/iffont.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/iffont/iffont.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/iffont/iffont.dtx')
-rw-r--r--macros/latex/contrib/iffont/iffont.dtx316
1 files changed, 316 insertions, 0 deletions
diff --git a/macros/latex/contrib/iffont/iffont.dtx b/macros/latex/contrib/iffont/iffont.dtx
new file mode 100644
index 0000000000..b550caebea
--- /dev/null
+++ b/macros/latex/contrib/iffont/iffont.dtx
@@ -0,0 +1,316 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2015 by Benjamin Weiss <weissbenjamin@me.com>
+% ---------------------------------------------------------------------------
+% 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 Benjamin Weiss.
+%
+% This work consists of the files iffont.dtx and iffont.ins and the derived
+% file iffont.sty.
+%
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{iffont.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{iffont}
+%<*package>
+ [2015/11/11 1.0.0 Iffont package]
+%</package>
+%<*driver>
+\documentclass{ltxdoc}
+%\EnableCrossrefs
+%\CodelineIndex
+%\DisableCrossrefs
+%\RecordChanges
+%\OnlyDescription
+\usepackage[parfill]{parskip}
+\usepackage{setspace}
+\onehalfspacing
+
+\usepackage[no-math]{fontspec}
+\setmainfont[BoldFont={Fira Sans}]{Fira Sans Light}
+\setmonofont{Fira Mono}
+\defaultfontfeatures{Ligatures=TeX}
+
+\usepackage{metalogo}
+
+\usepackage{enumitem}
+\setlist[itemize]{noitemsep}
+\setlist[enumerate]{noitemsep}
+
+\usepackage[showerrors,table,hyperref]{xcolor}
+\usepackage{iffont}
+
+\definecolor{mDarkBrown}{HTML}{604c38}
+\definecolor{mDarkTeal}{HTML}{23373b}
+\definecolor{mLightBrown}{HTML}{EB811B}
+\definecolor{mLightGreen}{HTML}{14B03D}
+\definecolor{mBackground}{HTML}{FFFFFF}
+
+\usepackage{listings}
+\lstset{%
+ gobble=2,
+ language=[LaTeX]{TeX},
+ basicstyle=\ttfamily\small,
+ keywordstyle=\color{mLightBrown}\bfseries,
+ commentstyle=\color{mLightGreen},
+ stringstyle=\color{mLightGreen},
+ backgroundcolor=\color{mBackground},
+ numbers=none,
+ numberstyle=\tiny\ttfamily,
+ stepnumber=2,
+ showspaces=false,
+ showstringspaces=false,
+ showtabs=false,
+ frame=none,
+ framerule=1pt,
+ tabsize=2,
+ rulesep=5em,
+ captionpos=b,
+ breaklines=true,
+ breakatwhitespace=false,
+ framexleftmargin=0em,
+ framexrightmargin=0em,
+ xleftmargin=0em,
+ xrightmargin=0em,
+ aboveskip=1em,
+ belowskip=1em,
+ morekeywords={settofirstfound, setmainfont, boldfont, mainfont,
+ FrutigerLight, newfontfamily, lightfont},
+}
+\lstMakeShortInline|
+
+\usepackage[colorlinks=true,
+ linkcolor=mLightBrown,
+ menucolor=mLightBrown,
+ pagecolor=mLightBrown,
+ urlcolor=mLightBrown]{hyperref}
+
+\usepackage{tabu}
+\usepackage{longtable}
+\usepackage{xstring}
+
+\begin{document}
+\DocInput{iffont.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{0}
+%
+% \GetFileInfo{iffont.sty}
+% \title{The \textsc{iffont} package}
+% \author{Benjamin Weiss\\ \url{weissbenjamin@me.com}}
+% \date{Version \fileversion~from \filedate}
+%
+% \maketitle
+%
+% \section{Introduction}
+%
+% Using OpenType fonts within \XeLaTeX\ or \LuaTeX\ comes with a lot of
+% benefits, but also the problem, that desired fonts may not be installed on
+% the system, the user choses for the compilation. In case they are, there can
+% still be different revisions of a font with variant names, such as
+% \textit{Frutiger LT Std}, \textit{Frutiger Neue LT Pro} and \textit{Frutiger
+% Next Pro}.
+%
+% Inspired by a question on \href{http://tex.stackexchange.com/q/53443/}
+% {Stack Exchange} and a discussion on the
+% \href{http://tug.org/pipermail/xetex/2010-August/017833.html}{\XeTeX\
+% Mailinglist}, this package addresses the problem with a set of easy to use
+% macros: a macro to select the first font \XeLaTeX\ or \LuaTeX\ can find in a
+% comma separated list and, additionally, a number of macro tests.
+%
+% \section{Select a Font from a List of Fonts}
+%
+% \DescribeMacro{\settofirstfound} This command defines a new macro with the
+% first font found in the comma separated list. The list is provided as second
+% argument. The macro can then be used to set the main font, set the sans
+% font, define a new font family and so on. The following code shows how to
+% set the main font as the Frutiger Font with the black font weight as bold
+% font.
+% \begin{lstlisting}
+% \documentclass{article}
+% \usepackage{fontspec}
+% \usepackage{iffont}
+% \settofirstfound{\mainfont}{Frutiger Next Pro,
+% Frutiger Neue LT Pro,
+% Frutiger LT Std}
+% \settofirstfound{\boldfont}{Frutiger Next Pro Black,
+% Frutiger Neue LT Pro Black,
+% Frutiger LT Std 75 Black}
+% \setmainfont[BoldFont=\boldfont]{\mainfont}
+% \begin{document}
+% \begin{itemize}
+% \item \mainfont
+% \item \textbf{\boldfont}
+% \end{itemize}
+% \end{document}
+% \end{lstlisting}
+% Defining a new font family works just the same.
+% \begin{lstlisting}
+% \documentclass{article}
+% \usepackage{fontspec}
+% \usepackage{iffont}
+% \settofirstfound{\lightfont}{Frutiger Next Pro Light,
+% Frutiger Neue LT Pro Light,
+% Frutiger LT Std 45 Light}
+% \newfontfamily\FrutigerLight{\lightfont}
+% \begin{document}
+% \begin{itemize}
+% \item {\FrutigerLight \lightfont}
+% \end{itemize}
+% \end{document}
+% \end{lstlisting}
+% \StopEventually{}
+%
+% \section{Macro Tests}
+% In most cases the \lstinline|\settofirstfound| command is sufficient, but
+% for the more demanding user there is also a set of macro tests. They are
+% useful, if one wants to set specific font features only if the first choice
+% font cannot be found. The original \textit{Frutiger LT Std} font for example
+% does not support small caps. So in the following example the
+% \lstinline|\textsc|command is redefined as uppercase with increased letter
+% spacing, but only if the \textit{Frutiger Next Pro} font cannot be found.
+% \begin{lstlisting}
+% \documentclass{article}
+% \usepackage{fontspec}
+% \usepackage{iffont}
+% \settofirstfound{\mainfont}{Frutiger Next Pro,
+% Frutiger LT Std}
+% \setmainfont{\mainfont}
+% \ifxfontexists{Frutiger Next Pro}{%
+% \def\textsc#1{\addfontfeature{LetterSpace=5.0}%
+% \MakeUppercase{#1}}
+% }{}
+% \begin{document}
+% \begin{itemize}
+% \item \mainfont
+% \item \textsc{\mainfont}
+% \end{itemize}
+% \end{document}
+% \end{lstlisting}
+% \section{Implementation}
+%
+% \iffalse
+%<*package>
+% \fi
+%
+%
+%
+% \subsection{Required Packages}
+% Load required packages.
+% \begin{macrocode}
+\RequirePackage{fontspec}
+\RequirePackage{etoolbox}
+% \end{macrocode}
+%
+% Init required variables.
+% \begin{macrocode}
+\newtoggle{@iffont@fontfound}
+\newcommand{\@iffont@firstfont}{Fira Sans}
+\newcounter{@iffont@fontsnotfound}
+% \end{macrocode}
+%
+% \begin{macro}{\iffontsexist}
+% If all fonts are found the commands in the second argument will be executed,
+% otherwise the commands in the third argument.
+% \begin{macrocode}
+\newcommand{\iffontsexist}[3]{
+ \setcounter{@iffont@fontsnotfound}{0}
+ \expandafter\forcsvlist\expandafter\@iffont@checkfont\expandafter{#1}
+ \ifnumequal{\value{@iffont@fontsnotfound}}{0}{%
+ #2
+ }{%
+ #3
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifxfontsexist}
+% Same as \lstinline|\iffontsexist|, but negated.
+% \begin{macrocode}
+\newcommand{\ifxfontsexist}[3]{
+ \iffontsexist{#1}{#3}{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\iffontexists}
+% A simpler and therefore faster if clause, that only checks for a single font.
+% \begin{macrocode}
+\newcommand{\iffontexists}[3]{
+ \suppressfontnotfounderror=1
+ \font\x = "#1" at 10pt
+ \ifx\x\nullfont
+ #3
+ \else
+ #2
+ \fi
+ \suppressfontnotfounderror=0
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifxfontexists}
+% Same as \lstinline|\iffontexists|, but negated.
+% \begin{macrocode}
+\newcommand{\ifxfontexists}[3]{
+ \iffontexists{#1}{#3}{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\settofirstfound}
+% Sets the macro in the first argument to the first font in the comma separated
+% list of fonts in the second argument that is found.
+% \begin{macrocode}
+\newcommand{\settofirstfound}[2]{
+ \togglefalse{@iffont@fontfound}
+ \expandafter\forcsvlist\expandafter\@iffont@checkfont\expandafter{#2}
+ \let#1\@iffont@firstfont
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@iffont@checkfont}
+% Checks if a font is found and increases the \lstinline|@iffont@fontsnotfound|
+% counter if not. The first font found will be saved in
+% \lstinline|\@iffont@firstfont|.
+% \begin{macrocode}
+\newcommand{\@iffont@checkfont}[1]{
+ \suppressfontnotfounderror=1
+ \font\x = "#1" at 10pt
+ \ifx\x\nullfont
+ \stepcounter{@iffont@fontsnotfound}
+ \else
+ \nottoggle{@iffont@fontfound}{%
+ \renewcommand{\@iffont@firstfont}{#1}
+ \toggletrue{@iffont@fontfound}
+ }{}
+ \fi
+ \suppressfontnotfounderror=0
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \Finale
+\endinput