% \iffalse meta-comment % % Copyright (C) 2022 by Ruben Deisenroth % % 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 %\NeedsTeXFormat{LaTeX2e}[2005/12/01] %\RequirePackage{expl3,l3keys2e} %\ProvidesExplPackage {darkmode} {2022-09-01} {1.0.1} %{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} % % \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