summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/darkmode/darkmode.dtx
blob: db2d105b7f508bc2d3f8997f4549b478b028a909 (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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
% \iffalse meta-comment
%
% Copyright (C) 2022 by Ruben Deisenroth <rdeisenroth@gmail.com>
%
% This file 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.
%
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\RequirePackage{expl3,l3keys2e}
%<package>\ProvidesExplPackage {darkmode} {2022-09-01} {1.0.1}
%<package>{Provide general dark mode support for any LaTeX document.}
%
%<*driver>
\documentclass{l3doc}
\hypersetup{
    hidelinks,
}
\usepackage{etoolbox}
\usepackage{darkmode}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\setlength{\parindent}{0pt}
%\setlength{\parskip}{1em}%
\begin{document}
\DocInput{darkmode.dtx}
\end{document}
%</driver>
% \fi
% \CheckSum{0}
% \GetFileInfo{darkmode.sty}
% \title{The \pkg{darkmode} package\thanks{This document
% corresponds to \textsf{darkmode}~\fileversion,
% dated~\filedate.}}
% \author{Ruben Deisenroth \\ \texttt{rdeisenroth@gmail.com}}
% \maketitle
% \tableofcontents
%
% \begin{documentation}
% \section{Introduction}
% The \pkg{darkmode} Package provides an API for template and package developers to create dynamic color schemes for light- and darkmodes. For those unaware: We refer to \emph{dark mode} when a document has a dark background with a light font and to light mode if it has a dark font with a light background.
% \subsection{Why}
% Now you might think: Why would anyone even need to use a dark mode for PDF files?\\ While for the common task of printing a dark mode has a lot of disadvantages and would take a lot of ink, theese days it becomes more and more common to view PDF files directly on a Screen. And Screens emit a lot of Blue light, which - especially in the evening - can be really annoying to stare at when working on a large text document. Also modern displays can get so bright that a stark black and white contrast is too strong for most lighting scenarios.
% \section{Usage}

% \subsection{Basic usage}
% The basic Idea behind this package is that the dark mode is enabled in the preamble once, either by passing the package option \verb+enable+ or via the command \tn{enabledarkmode}, and applies to the rest of the document. 
% \subsection{Adopting the Darkmode}
% When defining custom colors and commands, we can check if the dark mode is active or not to dynamically adjust the Colors.\par
% Example: \begin{verbatim}
% \DeclareDocumentCommand{\bluecode}{m}{%
%     \texttt{\textcolor{\IfDarkModeTF{cyan}{blue}}{#1}}%
% }
% \end{verbatim}
% Note that in most scenarios it is possible to use the \tn{IfDarkModeTF} command inline without any sideeffects. If cases where this doesn't work, an alternative is to wrap the entire definition of a macro in the switch:
% \begin{verbatim}
% \IfDarkModeTF{%
%     \definecolor{accentcolor}{RGB}{0, 157, 129}%
% }{%
%     \definecolor{accentcolor}{RGB}{0, 122, 93}%
% }
% \end{verbatim} 
% Another usefull trick is the usage of the colors \cs{thepagecolor} from the \pkg{pagecolor}-Package and the color \texttt{fgcolor} which is defined to the default font color. You can mix any color with these two colors to easily derive fitting colors:
% \begin{verbatim}
% % Fancy Altering Table Row Colors
% \rowcolors{2}{\thepagecolor}{fgcolor!10!\thepagecolor}
% \end{verbatim}
% Note that \verb+yellow!10!\thepagecolor+ is not the same as \verb+yellow!10+ because the second one would just default to \verb+yellow!10!white+.
% \section{Detailed documentation}
% \subsection{Package options}
% There following options can be passed to the package:
% \begin{itemize}
%    \item \texttt{enable} - boolean input, enables or disables the dark mode for the entire document
% \item \texttt{defaulthook} - boolean input, whether to enable or disable the default hook (\tn{@darkmode@on@enable} or \tn{\@darkmode@on@disable})
% \item \texttt{nodefaulthook} - meta key for disabeling the default hook
%\end{itemize}
% \subsection{User Commands}
% \begin{function}{\enabledarkmode,\disabledarkmode}
%    \tn{enabledarkmode} enables the dark Mode at the current position, while \tn{disabledarkmode} disables the dark mode at the current position.\\\textbf{Note:} that this is only intended to be used in the preamble for an entire document mainly with a CI/CD. Trying to toggle the dark mode between different pages may lead to unexpected behavior and is not recommended. For regular use to pass the \emph{enabled} option to the package.
% \end{function}
% \begin{function}[EXP]{\IfDarkModeT,\IfDarkModeF,\IfDarkModeTF}
%    \begin{syntax}
%        \tn{IfDarkModeT} \Arg{true code}
%        \tn{IfDarkModeF} \Arg{false code}
%        \tn{IfDarkModeTF} \Arg{true code} \Arg{false code}
%    \end{syntax}
%    Checks whether the dark mode is enabled or not. If so, \meta{true code} is executed, otherwise \meta{false code} is executed. These macros are fully expandable.
% \end{function}
% \subsection{Commands for developers}
% This functionality is mostly aimed at package developers and template creators, for the end user it should not be necessary to manually fixup the Switching with compatible Packages and Classes.
% \begin{function}[added = 2022-08-30]{\@darkmode@set@enabled,\@darkmode@set@disabled}
%      Functions for template developers that want to implement dark mode toggling with \LaTeXe{}.
% \end{function}
% \end{documentation}
% \clearpage
% \begin{implementation}
%     \section{implementation}
% \begin{variable}{\g_@@_dark_mode_bool}
%    First we define the package Options. The usage of initial ensures that the boolean \cs{g_@@_dark_mode_bool} always exists.
%    \begin{macrocode}
\RequirePackage{xcolor,pagecolor}
\keys_define:nn {darkmode} {
    enable .bool_gset:N = \g_@@_dark_mode_bool,
    enable .initial:n = false,
    enable .default:n = true,
    defaulthook .bool_gset:N = \g_@@_dark_mode_hook_bool,
    defaulthook .initial:n = true,
    defaulthook .default:n = true,
    nodefaulthook .meta:n = {defaulthook=false},
}
%    \end{macrocode}
%   Now we process the package options.
%    \begin{macrocode}
\ProcessKeysOptions{darkmode}
%    \end{macrocode}
% \end{variable}

% \begin{macro}[pTF]{\__darkmode_if_dark_mode:}
%    We need a global Conditional to decide whether the dark mode is currently active or not   
%    \begin{macrocode}
\prg_new_conditional:Nnn \__darkmode_if_dark_mode: {T,F,TF} {
    \bool_if:NTF \g_@@_dark_mode_bool
    {\prg_return_true:}
    {\prg_return_false:}
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\IfDarkModeT,\IfDarkModeF,\IfDarkModeTF}
%    \begin{macrocode}
\cs_set_eq:NN\IfDarkModeT \__darkmode_if_dark_mode:T
\cs_set_eq:NN\IfDarkModeF \__darkmode_if_dark_mode:F
\cs_set_eq:NN\IfDarkModeTF \__darkmode_if_dark_mode:TF
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\enabledarkmode,\@darkmode@set@enabled,\@darkmode@on@enable}
%    \begin{macrocode}
\definecolor{darkmode@anthrazitgrau}{HTML}{293133}
\colorlet{fgcolor}{.}
\DeclareDocumentCommand{\@darkmode@set@enabled}{}{
    \bool_set_true:c {g_@@_dark_mode_bool} 
}
\DeclareDocumentCommand{\@darkmode@on@enable}{}{
    \pagecolor{darkmode@anthrazitgrau}
    \color{white}
    \selectcolormodel{RGB}
    \colorlet{fgcolor}{.}
}
\DeclareDocumentCommand{\enabledarkmode}{}{
    \@darkmode@set@enabled
    \bool_if:cT {g_@@_dark_mode_hook_bool} {\@darkmode@on@enable}
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\disabledarkmode, \@darkmode@set@disabled, \@darkmode@on@disabled}
%    \begin{macrocode}
\DeclareDocumentCommand{\@darkmode@set@disabled}{}{
    \bool_set_false:c {g_@@_dark_mode_bool}
}
\DeclareDocumentCommand{\@darkmode@on@disable}{}{
    \pagecolor{white}
    \color{black}
    \colorlet{fgcolor}{.}
}
\DeclareDocumentCommand{\disabledarkmode}{}{
    \@darkmode@set@disabled
    \bool_if:cT {g_@@_dark_mode_hook_bool} {\@darkmode@on@disable}
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\__darkmode_update_from_bool}
%    \begin{macrocode}
\DeclareDocumentCommand{\__darkmode_update_from_bool}{}{
    \IfDarkModeTF{\enabledarkmode}{\disabledarkmode}
}
\__darkmode_update_from_bool
%    \end{macrocode}
% \end{macro}
% \end{implementation}
% \clearpage
% \PrintIndex
\endinput