diff options
Diffstat (limited to 'macros/latex/contrib/yb-book/yb-book.dtx')
-rw-r--r-- | macros/latex/contrib/yb-book/yb-book.dtx | 653 |
1 files changed, 653 insertions, 0 deletions
diff --git a/macros/latex/contrib/yb-book/yb-book.dtx b/macros/latex/contrib/yb-book/yb-book.dtx new file mode 100644 index 0000000000..2ca33cb55e --- /dev/null +++ b/macros/latex/contrib/yb-book/yb-book.dtx @@ -0,0 +1,653 @@ +% \iffalse meta-comment +% (The MIT License) +% +% Copyright (c) 2021-2022 Yegor Bugayenko +% +% 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. +% \fi + +%%% \CheckSum{0} +% +% \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 +% Lower-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 +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} + +% \GetFileInfo{yb-book.dtx} +% \DoNotIndex{\end,\empty,\defined,\def,\begin,\if,\isempty,\endgroup,\begingroup,\let,\else,\fi,\newcommand,\newenvironment} + +% \iffalse +%<*driver> +\ProvidesFile{yb-book.dtx} +%</driver> +%<class>\NeedsTeXFormat{LaTeX2e} +%<class>\ProvidesClass{yb-book} +%<*class> +[02.10.2022 0.2.0 YB Branded Book Style] +%</class> +%<*driver> +\documentclass{ltxdoc} +\usepackage[tt=false, type1=true]{libertine} +\usepackage{href-ul} +\usepackage{graphicx} +\PageIndex +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{yb-book.dtx} + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi + +% \title{\includegraphics[width=0.75in]{yb-book-logo.pdf} \\ \LaTeX{} Class |yb-book|\thanks{The sources are in GitHub at \href{https://github.com/yegor256/yb-book.cls}{yegor256/yb-book.cls}}} +% \author{Yegor Bugayenko \\ \texttt{yegor256@gmail.com}} +% \date{\filedate, \fileversion} +% +% \maketitle +% +% \section{Introduction} +% +% \index{Amazon} +% The provided class |yb-book| helps me design +% \href{https://www.yegor256.com/books.html}{my books} and +% publish them +% \href{https://www.amazon.com/Yegor-Bugayenko/e/B01AM1QMDK}{on Amazon}. +% You are welcome to use is for your own books. It is as simple +% as this: +%\iffalse +%<*verb> +%\fi +\begin{verbatim} +\documentclass{yb-book} +\renewcommand*\thetitle{New Book About OOP} +\renewcommand*\theauthor{Jeff Lebowski} +\renewcommand*\thevolume{1} +\renewcommand*\theversion{1.0} +\begin{document} +\ybPrintTitlePage +\chapter{First One} +\section{About Something Interesting} +Hello, world! +\end{document} +\end{verbatim} +%\iffalse +%</verb> +%\fi + +% You are welcome to suggest additional options and commands, but the style +% of my books is intentionally as simple as possible, avoiding formatting +% as much as possible. Here is \href{https://www.yegor256.com/2019/05/21/dont-improvise.html}{why}. + +% \section{Options} + +% There are a few class options you can use: + +% \begin{macro}{compact} +% Use this package option when you need to make text more compact +% and take less vertical space. This may be convenient fiction books. +% I use this option to render \href{https://www.yegor256.com/code-ahead.html}{Code Ahead} book. +% \end{macro} + +% \begin{macro}{manuscript} +% When the format is not for Amazon printing, +% but for some other purposes (the page size is A4), this option may be +% convenient. I also use it when I want the book to be rendered for +% printing on paper for review purposes. +% \end{macro} + +% \begin{macro}{draft} +% When it's a draft for reviewers (the page size is A4) +% and you want to have a watermark and a compact form of the content. This +% option goes together with |\thereviewer{}| command, which you may redefine, +% in order to embed the name of the reviewed in the watermark. This may +% help you prevent theft of your book: +%\iffalse +%<*verb> +%\fi +\begin{verbatim} +\documentclass[draft]{yb-book} +\renewcommand*\thereviewer{Walter Sobchak} +\begin{document} +Hello, world! +\end{document} +\end{verbatim} +%\iffalse +%</verb> +%\fi +% \end{macro} + +% \section{Meta Commands} + +% There are a number of commands that you may redefine in the preamble: +%\iffalse +%<*verb> +%\fi +\begin{verbatim} +\documentclass{yb-book} +\newcommand*\thetitle{My New Book About OOP} +\newcommand*\theauthor{Yegor Bugayenko} +\newcommand*\thevolume{1} +\newcommand*\thedate{24 Feb 2022} +\newcommand*\theversion{1.4} +\newcommand*\thereviewer{Jeff Lebowski} +\begin{document} +... the content goes here ... +\end{document} +\end{verbatim} +%\iffalse +%</verb> +%\fi + +% \section{Printers} + +% There are a number of printers --- commands that print large blocks of text +% in the expected format: + +% \begin{macro}{\ybPrintTitlePage} +% Prints the first page of a book. It expects at least |\thetitle| +% and |theauthor| to be defined: +%\iffalse +%<*verb> +%\fi +\begin{verbatim} +\documentclass{yb-book} +\renewcommand*\thetitle{My New Book} +\renewcommand*\theauthor{Yegor Bugayenko} +\begin{document} +\ybPrintTitlePage +.. the rest of the book goes here +\end{document} +\end{verbatim} +%\iffalse +%</verb> +%\fi +% \end{macro} + +% \begin{macro}{\ybPrintTOC} +% Prints the table of contents. +% \end{macro} + +% \begin{macro}{\ybQuote} +% Prints a side quote: +%\iffalse +%<*verb> +%\fi +\begin{verbatim} +\documentclass{yb-book} +\begin{document} +Hello, world! +\ybQuote{Never tell the truth to people who + are not worthy of it}{Mark Twain}{} +\end{document} +\end{verbatim} +%\iffalse +%</verb> +%\fi +% \end{macro} + +% \begin{macro}{\ybPrintBibliography} +% Prints the list of bib references. +% \end{macro} + +% \begin{macro}{\ybPrintIndex} +% Prints index with an optional name of the section (instead of ``Index''): +%\iffalse +%<*verb> +%\fi +\begin{verbatim} +\documentclass{yb-book} +\begin{document} +Hello, world! +\ybPrintIndex{Recommended Books} +\end{document} +\end{verbatim} +%\iffalse +%</verb> +%\fi +% \end{macro} + +% \StopEventually{} + +% \section{Implementation} + +% \changes{v0.1.0}{2022/01/09}{Initial version} +% \changes{v0.2.0}{2022/10/02}{Started using l3build} + +% First, we use |xkeyval| package for package options parsing: +% \begin{macrocode} +\RequirePackage{xkeyval} +\makeatletter +\newif\ifyb@draft +\DeclareOptionX{draft}{\yb@drafttrue} +\newif\ifyb@compact +\DeclareOptionX{compact}{\yb@compacttrue} +\newif\ifyb@manuscript +\DeclareOptionX{manuscript}{\yb@manuscripttrue} +\ProcessOptionsX +\makeatother +% \end{macrocode} + +% Then, depending on the options like |draft| and |manuscript|, we preset +% options of the class |book| and then load it: +% \begin{macrocode} +\makeatletter\ifyb@draft + \PassOptionsToClass{11pt}{book} + \PassOptionsToClass{oneside}{book} +\else + \ifyb@manuscript + \PassOptionsToClass{12pt}{book} + \PassOptionsToClass{oneside}{book} + \else + \PassOptionsToClass{11pt}{book} + \PassOptionsToClass{twoside}{book} + \fi +\fi\makeatother +\LoadClass{book} +% \end{macrocode} + +% \begin{macro}{geometry} +% Then, using |geometry|, we setup page layout: +% \begin{macrocode} +\RequirePackage{geometry} +\geometry{paperwidth=6in, paperheight=9in, bindingoffset=0.25in, + left=0.75in, right=0.75in, top=0.75in, bottom=1.25in} +\makeatletter\ifyb@draft + \geometry{a4paper, margin=1in, left=1.5in} +\else + \ifyb@manuscript + \geometry{a4paper, margin=1.2in} + \fi +\fi\makeatother +% \end{macrocode} +% \end{macro} + +% Then, we configure input encoding for UTF-8: +% \begin{macrocode} +\RequirePackage[T1]{fontenc} +\RequirePackage[utf8]{inputenc} +\RequirePackage{lmodern} +% \end{macrocode} + +% Then, we load many important packages: +% \begin{macrocode} +\RequirePackage{anyfontsize} +\RequirePackage{tikz} + \usetikzlibrary{positioning} + \usetikzlibrary{shapes} + \usetikzlibrary{fit} +\RequirePackage{chngcntr} + \counterwithout{footnote}{chapter} +\RequirePackage{lastpage} +\RequirePackage{paralist} +\RequirePackage{xcolor} +\RequirePackage{graphicx} +\RequirePackage[inline]{enumitem} + \setlist{nosep} +\RequirePackage{float} +\RequirePackage[normalem]{ulem} +\RequirePackage{xfp} +\RequirePackage{soul} +\RequirePackage{xifthen} +\RequirePackage[autostyle=try]{csquotes} +% \end{macrocode} + +% \begin{macro}{\pagestyle} +% Then, we set the layout of a page to |plain|: +% \begin{macrocode} +\pagestyle{plain} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{setspace} +% Then, using |setspace| package we set the spacing between lines in the text, +% depending on the package options: +% \begin{macrocode} +\RequirePackage{setspace} + \setstretch{1.2} + \makeatletter\ifyb@draft\setstretch{1.1}\fi\makeatother + \makeatletter\ifyb@compact\setstretch{1.0}\fi\makeatother + \makeatletter\ifyb@manuscript\setstretch{1.1}\fi\makeatother +% \end{macrocode} +% \end{macro} + +% \begin{macro}{biblatex} +% Then, we configure |biblatex|, for citation management: +% \begin{macrocode} +\RequirePackage[indexing=cite,style=authoryear, + natbib=true,maxnames=1,minnames=1,doi=false, + url=false,isbn=false,isbn=false]{biblatex} + \DeclareCiteCommand{\citetitle} + {\boolfalse{citetracker}% + \boolfalse{pagetracker}% + \usebibmacro{prenote}} + {\ifciteindex + {\indexnames{labelname}} + {}% + \printfield[citetitle]{labeltitle}} + {\multicitedelim} + {\usebibmacro{postnote}} + \DeclareCiteCommand*{\citetitle} + {\boolfalse{citetracker}% + \boolfalse{pagetracker}% + \usebibmacro{prenote}} + {\ifciteindex + {\indexnames{labelname}} + {}% + \printfield[citetitle]{title}} + {\multicitedelim} + {\usebibmacro{postnote}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{condensed} +% Then, we define |condensed| environment for snippets +% (|lsstyle| is defined by |letterspace| in |microtype|): +% \begin{macrocode} +\newenvironment{condensed} + {\begingroup\setstretch{1.0}\lsstyle} + {\endgroup} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{microtype} +% Then, we include |microtype| for better rendering: +% \begin{macrocode} +\makeatletter\ifyb@draft\else + \RequirePackage[letterspace=-50]{microtype} +\fi\makeatother +% \end{macrocode} +% \end{macro} + +% \begin{macro}{libertine} +% Then, we include |libertine|, for a good looking font: +% \begin{macrocode} +\makeatletter\ifyb@manuscript + \RequirePackage[tt=false,type1=true]{libertine} +\fi\makeatother +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\section} +% Then, we redefine |\section| command: +% \begin{macrocode} +\makeatletter +\let\yb@oldsection\section +\ifyb@draft + \RequirePackage[medium]{titlesec} +\else + \RequirePackage[raggedright]{titlesec} + \titlespacing{\section}{0in}{6pt}{6pt}[1in] + \renewcommand\section{\newpage\yb@oldsection} +\fi +\ifyb@compact + \renewcommand\section{\vspace{2em}\yb@oldsection} +\fi +\makeatother +% \end{macrocode} +% \end{macro} + +% Then, if it's a |draft|, we put a watermark comment: +% \begin{macrocode} +\makeatletter\ifyb@draft +\RequirePackage{fancyhdr} +\pagestyle{fancy} +\renewcommand\headrulewidth{0pt} +\renewcommand\footrulewidth{0pt} +\fancyhf{} +\fancyhead[L,C,LO,CO]{} +\fancyhead[R,RO]{ + \begin{textblock}{4}(11.5,1)\begin{tikzpicture} + \node [color=gray, rotate=270, + font=\ttfamily\scriptsize, text width=5in] at (0,0) { + Copyright \textcopyright{} \the\year{} by \theauthor{}. + All rights reserved. No part of the contents of + this book may be reproduced or transmitted in any + form or by any means without the written permission + of the publisher. This particular manuscript is + printed for \textbf{\thereviewer}} and may be used only + for one-time review. The manuscript has to be destroyed + after the review. + }; + \end{tikzpicture}\end{textblock} +} +\fancyfoot[C,CO]{\small\ttfamily + page \#\thepage{} of \pageref{LastPage}} +\fi\makeatother +% \end{macrocode} + +% \begin{macro}{\maketitle} +% Then, we redefine |\maketitle| command: +% \begin{macrocode} +\renewcommand\maketitle{ + {\LARGE\textbf{\thetitle}} + \\[1em] + by \theauthor{} + \\[4em] + \ifx\thevolume\empty\else% + Volume \thevolume{}\\ + \fi + \ifx\thedate\empty\else% + Rendered on \thedate{} + \fi + \ifx\theversion\empty\else% + \\ + Ver. \theversion{} + \fi +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ybPrintTitlePage} +% Then, we define |\ybPrintTitlePage| command: +% \begin{macrocode} +\makeatletter\newcommand\ybPrintTitlePage{ + \ifyb@draft\else + \begin{titlepage} + \ttfamily + \vspace*{\fill} + \noindent + {\Huge\textbf{\thetitle}} + \\[1em] + by \theauthor{} + \\[4em] + \ifx\thevolume\empty\else% + Volume \thevolume{}\\ + \fi + \ifx\thedate\empty\else% + \thedate{} + \fi + \ifx\thedate\empty\else% + \\ + \theversion{} + \fi + \vspace*{\fill} + \end{titlepage} + \fi +}\makeatother +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ybPrintTOC} +% Then, we define |ybPrintTOC| command to print table of contents: +% \begin{macrocode} +\makeatletter\newcommand\ybPrintTOC{ + \ifyb@draft\else + \ifyb@compact\else\cleardoublepage\fi + {\setstretch{0.7}\tableofcontents} + \fi +}\makeatother +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ybPrintIndex} +% Then, we configure |imakeidx| package and define |\ybPrintIndex| command: +% \begin{macrocode} +\RequirePackage{imakeidx} + \renewbibmacro*{citeindex}{\indexnames{labelname}{}} + \makeindex + \indexsetup{othercode={\hyphenpenalty=10000}} +\makeatletter\newcommand\ybPrintIndex[1][Index]{ + \ifyb@draft\else + \cleardoublepage + { + \setstretch{1.0} + \small + \addcontentsline{toc}{chapter}{#1} + \printindex + } + \fi +}\makeatother +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ybQuote} +% Then, with the help of |wrapfig| and |mdframed|, we define |\ybQuote| command: +% \begin{macrocode} +\RequirePackage{wrapfig} +\RequirePackage{mdframed} +\RequirePackage{changepage} + \strictpagecheck +\mdfdefinestyle{quoteodd}{backgroundcolor=black!0, + leftmargin=6pt,rightmargin=0pt, + innerleftmargin=6pt,innerrightmargin=0pt, + innertopmargin=0pt,innerbottommargin=0pt, + skipabove=0pt,skipbelow=0pt, + linewidth=2pt, + topline=false,bottomline=false,rightline=false} +\mdfdefinestyle{quoteeven}{backgroundcolor=black!0, + rightmargin=6pt,leftmargin=0pt, + innerrightmargin=6pt,innerleftmargin=0pt, + innertopmargin=0pt,innerbottommargin=0pt, + skipabove=0pt,skipbelow=0pt, + linewidth=2pt, + topline=false,bottomline=false,leftline=false} +\makeatletter\newcommand\ybQuote[3]{% + \ifthenelse{\isempty{#3}}{}{ + \ifx\hfuzz#2\hfuzz% + \index{#3}% + \else% + \index{#3, #2}% + \fi% + }% + \def\yb@body{% + \raggedright% + \ifx\hfuzz#3\hfuzz% + #1% + \else% + ``#1''\\\raggedleft---#2 #3% + \fi% + } + \ifyb@draft% + \begin{wrapfigure}{r}{0.4\textwidth}% + \begin{mdframed}[style=quoteodd]% + \yb@body% + \end{mdframed}% + \end{wrapfigure}% + \else% + \begin{wrapfigure}{o}[12pt]{0.4\textwidth}% + \sffamily\checkoddpage% + \ifoddpage% + \begin{mdframed}[style=quoteodd]\yb@body\end{mdframed}% + \else% + \begin{mdframed}[style=quoteeven]\yb@body\end{mdframed}% + \fi% + \vspace{-12pt} + \end{wrapfigure}% + \fi% +}\makeatother +% \end{macrocode} +% \end{macro} + +% Then, we use and configure |footmisc| as suggested +% \href{https://tex.stackexchange.com/questions/40072/incompatibility-between-footmisc-option-multiple-and-hyperref/62091#62091}{here}: +% \begin{macrocode} +\RequirePackage{perpage} +\RequirePackage[bottom,perpage,multiple]{footmisc} +\makeatletter + \let\yb@oldfootnote\footnote +\newcommand\yb@nexttoken\relax +\newcommand\yb@isfootnote{% + \ifx\footnote\yb@nexttoken\textsuperscript{,}\fi} +\renewcommand\footnote[1]{% + \yb@oldfootnote{#1}\futurelet\yb@nexttoken\yb@isfootnote} +\makeatother +% \end{macrocode} + +% \begin{macro}{\ybPrintBibliography} +% Then, we define |\ybPrintBibliography|, to print a list of references: +% \begin{macrocode} +\makeatletter\newcommand\ybPrintBibliography{% + \AtNextBibliography{\small}% + \raggedright% + \ifyb@manuscript% + \setlength\bibitemsep{0pt}% + \newpage% + \begin{multicols}{2} + {\setstretch{1.0}\printbibliography} + \end{multicols} + \else + \printbibliography + \fi +}\makeatother +% \end{macrocode} +% \end{macro} + +% Then, a few layout configurations at the beginning of the document: +% \begin{macrocode} +\AtBeginDocument{% + \raggedbottom% + \setlength\topskip{0mm}% + \setlength\parindent{0pt}% + \setlength\fboxsep{0pt}% + \setlength\parskip{6pt}% + \interfootnotelinepenalty=10000% +} +% \end{macrocode} + +% Finally, a few meta commands with default values: +% \begin{macrocode} +\newcommand*\thetitle{\textbackslash{}thetitle} +\newcommand*\thevolume{} +\newcommand*\thedate{} +\newcommand*\theversion{\textbackslash{}theversion} +\newcommand*\theauthor{\textbackslash{}theauthor} +\newcommand*\thereviewer{\textbackslash{}thereviewer} +% \end{macrocode} + +% \Finale + +%\clearpage +% +%\PrintChanges +%\clearpage +%\PrintIndex |