summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/pdfarticle/pdfArticle.cls
blob: 6f6fe3aab3f278b38dd5a33c484b5db9cd5aef93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
% Copyright (c) 2015-2019 Robert Ryszard Paciorek <rrp@opcode.eu.org>
% 
% MIT License
% 
% Permission is hereby granted, free of charge, to any person obtaining a copy
% of this software and associated documentation files (the "Software"), to deal
% in the Software without restriction, including without limitation the rights
% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
% copies of the Software, and to permit persons to whom the Software is
% furnished to do so, subject to the following conditions:
% 
% The above copyright notice and this permission notice shall be included in all
% copies or substantial portions of the Software.
% 
% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
% SOFTWARE.

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{pdfArticle}[2019/05/01 v1.0 simple class for creating PDF documents with LuaLaTeX]

\RequirePackage{kvoptions} % key=value option for class ... use also by hyperref, so zero overhead
	\SetupKeyvalOptions{family=KVP, prefix=KVP@} % KVP = Key Val Parameters
	
	% Fonts settings
	\DeclareStringOption[11pt]                         {fontSize}       % base size of font (8pt, 9pt, 10pt, 11pt, 12pt, 14pt, 17pt, or 20pt with extarticle document class)
	\DeclareStringOption[
		UprightFeatures = { SmallCapsFont={ lmromancaps10regular } },
		ItalicFeatures  = { SmallCapsFont={ lmromancaps10oblique } },
		SlantedFont     = lmromanslant10regular,
		BoldSlantedFont = lmromanslant10bold,
		Ligatures=TeX
	]                                                  {mainFontFeat}   % features settings for mainFont
	\DeclareStringOption[Latin Modern Roman]           {mainFont}       % document default main (serif) fornt
	\DeclareStringOption[
		Ligatures=TeX
	]                                                  {sansFontFeat}   % features settings for sansFont
	\DeclareStringOption[Latin Modern Sans]            {sansFont}       % document default main sans-serif fornt
	\DeclareStringOption[
		UprightFeatures = { SmallCapsFont={ lmmonocaps10regular } },
		ItalicFont      = lmmono10italic,
		ItalicFeatures  = { SmallCapsFont={ lmmonocaps10oblique } },
		SlantedFont     = lmmonoslant10regular
	]                                                  {monoFontFeat}   % features settings for monoFont
	\DeclareStringOption[Latin Modern Mono Light]      {monoFont}       % document default main mono-space fornt
	
	% Paper settings
	\DeclareStringOption[a4paper]    {paperSize}      % paper size
	\DeclareStringOption[portrait]   {paperMode}      % paper orientation: portrait lub landscape
	\DeclareStringOption[2.2cm]      {tmargin}        % top margin size
	\DeclareStringOption[2.5cm]      {bmargin}        % bottom margin size
	\DeclareStringOption[2.2cm]      {lmargin}        % left margin size
	\DeclareStringOption[2.2cm]      {rmargin}        % right margin size
	\DeclareBoolOption  [true]       {twoside}        % two side mode (switch left/right margin size): true lub false
	
	% Other settings
	\DeclareStringOption[150]        {imgResolution}  % default resolution (ppi) for raster images inserted into PDF files (override by file header info)
	\DeclareBoolOption  [false]      {extra}          % enable load extra package set
	
	\ProcessKeyvalOptions*

% disable automatic convert eps -> pdf
\def\DoNotLoadEpstopdf{\relax}

% use extarticle as base class
\LoadClass[\KVP@fontSize]{extarticle}

% advanced fonts for LuaLaTeX
\RequirePackage{fontspec}
	\defaultfontfeatures[\rmfamily,\sffamily, \ttfamily]{}
	\setmainfont{\KVP@mainFont}[\KVP@mainFontFeat]
	\setsansfont{\KVP@sansFont}[\KVP@sansFontFeat]
	\setmonofont{\KVP@monoFont}[\KVP@monoFontFeat]

% insert images, with extended key=value interface ... set some defaults
\RequirePackage{graphicx, graphbox}
	\DeclareGraphicsExtensions{.mp, .pdf, .png, .jpg, .jpeg}
	\pdfvariable imageresolution \KVP@imgResolution

% foreground and background colours ... use stack of colors
\RequirePackage{xcolor, fifo-stack}
	\FSCreate{colors}{black}

% page size and settings
\RequirePackage{geometry}
	\geometry{
		\KVP@paperSize, \KVP@paperMode,
		tmargin=\KVP@tmargin, bmargin=\KVP@bmargin, lmargin=\KVP@lmargin, rmargin=\KVP@rmargin
	}
	\ifKVP@twoside \geometry{twoside=true} \else \geometry{twoside=false} \fi

% command for enforce new page geometry inside document, in contrast to \newgeometry:
%  * allow chage paper size and orientation (only pdf output)
%  * don't reset current settings (but allow modifies it)
\newcommand{\forceNewPageGeometry}[1]{%
	\clearpage%
	\Gm@clean\setkeys{Gm}{#1}\Gm@process%
	\eject \pagewidth=\paperwidth \pageheight=\paperheight%
	\Gm@changelayout%
	\ifdefined\headwidth\headwidth=\textwidth\fi%
}

% better verbatim environment ... replace standard verbatim environment by fancyvrb package
\RequirePackage{fancyvrb, fvextra}
	\DefineVerbatimEnvironment{verbatim}{Verbatim}{}
	\let\verb\Verb
	\fvset{breaklines=true, breakafter={/-}, breakaftersymbolpre={}, breakaftersymbolpost={\tiny\ensuremath{\ \hookrightarrow\ }}}

 % text decorations (under line, striking out, highlight, contours, shadows, ...)
\RequirePackage[normalem]{ulem}
	\newcommand{\ul}[1][blue]{\bgroup\markoverwith{\textcolor{#1}{\rule[-0.6ex]{2pt}{0.17ex}}}\ULon}
	\newcommand{\st}[1][red]{\bgroup\markoverwith{\textcolor{#1}{\rule[0.5ex]{2pt}{0.25ex}}}\ULon}
	\newcommand{\hl}[1][yellow]{\bgroup\markoverwith{\textcolor{#1}{\rule[-0.6ex]{1.02pt}{2.7ex}}}\ULon}
\RequirePackage{contour, shadowtext}

% items lists
\RequirePackage{enumitem} % better enumerate, itemize and description environments
\RequirePackage{alphalph} % use display counters as letters with support for big numbers (as: ... x, y, z, aa, ab, ac, ...)
	\let\alph\relax \def\alph#1{\alphalph{\value{#1}}}
	\let\Alph\relax \def\Alph#1{\AlphAlph{\value{#1}}}

% other useful stuff ...
\RequirePackage{pbox,varwidth} % vertical box with automatic minimal width
\RequirePackage{overpic} % put LaTeX stuff on images
\RequirePackage{wrapfig} % wrapfigure and wraptable environments for wraping text around images, tables, etc
\RequirePackage{array,dcolumn} % extentions for tables
\RequirePackage{tabto}  % tabbing to fixed positions
\RequirePackage{changepage} % for adjustwidth environment
\RequirePackage{ragged2e} % \justifying command, justify environment and alternative left, center and right ragged text 
\RequirePackage{setspace} % set line stretch with \setstretch{} command (it's more powerful way than \linespread{}\selectfont or manualy set \baselineskip)
\RequirePackage{amsmath,unicode-math} % math with unicode open-type fonts
\RequirePackage{adjustbox} % scale, clip, rotate, etc boxes

\ifKVP@extra
	\typeout{Document class "pdfArticle" starting to load "EXTRA" packages ...}\typeout{}
	\RequirePackage{minted}  % nice code highlight (use minted insted of listings, due to encoding problems in listings)
	% \ifnum\pdf@shellescape=1 \RequirePackage{minted} \else \typeout{}\typeout{Warning: No -shell-escape, so DO NOT use minted package.} \fi
	\RequirePackage[many,vignette,minted,magazine,poster,external]{tcolorbox} % nice framed boxes
\fi

% if \pdfArticlePreHyperRef is defined run it before load hyperref, but after load all other packages
% (for loading packages and do other stuff than should be do before load hyperref)
\ifdefined\pdfArticlePreHyperRef\pdfArticlePreHyperRef\fi

% internal and external links ... use curent color from stack for refernces
\RequirePackage[unicode=true, colorlinks=true, linkcolor=black, urlcolor=blue]{hyperref}
	\let\oldref\ref
	\AtBeginDocument{\renewcommand\ref[1]{\hyperref[#1]{\color{\FSTop{colors}}\oldref*{#1}}}}

% create label with explicit provided name; usage: \namedLabel{label}{name}
\newcommand\namedLabel[2]{\begingroup%
	\let\@currentlabel\@currentlabelx%
	\def\@currentlabel{#2}%
	\label{#1}%
	\let\@currentlabelx\@currentlabel%
\endgroup}

\typeout{Loading document class "pdfArticle" completed!}\typeout{}