\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{Jesse K Phillips (JesseKPhillips)} \pdfinfo{ /Title (d-scripting-toolbox.pdf) /Creator (Cheatography) /Author (Jesse K Phillips (JesseKPhillips)) /Subject (D Scripting Toolbox Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{EB4626} \definecolor{LightBackground}{HTML}{FDF3F1} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{D Scripting Toolbox Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{Jesse K Phillips (JesseKPhillips)} via \textcolor{DarkBackground}{\uline{cheatography.com/133808/cs/27440/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}Jesse K Phillips (JesseKPhillips) \\ \uline{cheatography.com/jessekphillips} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Published 22nd May, 2021.\\ Updated 22nd May, 2021.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{3} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Read File}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{void main() \{ \newline import std.file; \newline auto data = \seqsplit{readText("filename.ext");} \newline \}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_file.html\#readText "\}\}readText\{\{/link\}\} reads the entire file into memory.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Matching Beginning or End}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.algorithm; \newline auto data = "word word" \newline assert(data.startsWith("word")); \newline assert(data.endsWith("word")); \newline assert(data.skipOver("word")); \newline assert(data == " word");} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_algorithm\_searching.html\#.skipOver"\}\}skipOver\{\{/link\}\} will not only identify if the string is found at the beginning, but also move data past the string.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Removing Whitespace}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.string; \newline auto data = " str "; \newline assert(data.strip == "str"); \newline assert(data.stripLeft == " str"); \newline assert(data.stripRight == "str ");} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_string.html\#.strip"\}\}strip\{\{/link\}\} Along with whitespace an argument can be past in to specify a specific string to strip off.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Find a String}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.algorithm; \newline \newline auto haystack = "some long name"; \newline auto needle = "long"; \newline \newline if(!haystack.find(needle).empty) \newline \seqsplit{haystackHasNeedle(haystack);}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_algorithm\_searching.html\#.find"\}\}find\{\{/link\}\} is a general function that works on any range. So it can be used with numbers and other containers. Similar to count and filter it is possible to specify more complex conditions.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Split Strings}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.algorithm; \newline \newline auto data = "one str\textbackslash{}ntwo"; \newline assert(data.splitter(" ").equal( \newline {[}"one", "str\textbackslash{}ntwo"{]})); \newline \newline import std.array; \newline \newline assert(data.split().equal({[}"one", "str", "two"{]}));} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_algorithm\_iteration.html\#.splitter "\}\}splitter\{\{/link\}\} is a lazy operation with no memory allocation, \{\{link="https://dlang.org/phobos/std\_array.html\#split "\}\}split\{\{/link\}\} eagerly evaluates into a new dynamic array. The second, when passing no arguments will also split on all whitespace including new lines.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Head and Tail}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.range; \newline \newline auto data = {[}"one", "two"{]}; \newline auto head = data.front; \newline auto tail = data.dropOne;} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_range.html\#dropOne"\}\}dropOne\{\{/link\}\} modifies and returns the same range having removed the first element.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Slice}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{auto content = {[}"post" , "tweet", "video", "talk"{]}; \newline auto begin = content{[}0..2{]}; \newline auto end = content{[}2..\${]}; \newline // content is {[}"post" , "tweet", "video", "talk"{]}; \newline // begin is {[}'post', 'tweet'{]} \newline // end is {[}'video', 'talk'{]}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{The right index is exclusive and does not include that indexes content. These made no modifications to the original array and no allocation was performed. This does mean modifying the slice will modify the original.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Remove the Middle of Array}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.algorithm; \newline import std.typecons : tuple; \newline auto content = {[}"post" , "tweet", "video", "talk"{]}; \newline content = content.remove(tuple(1,3)); \newline assert(content.equal({[}"post" , "talk"{]}) );} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_algorithm\_mutation.html\#.remove"\}\}remove()\{\{/link\}\} resembles removing elements at a specified index. A \{\{link="https://dlang.org/phobos/std\_typecons.html\#tuple"\}\}tuple\{\{/link\}\} can be utilized to provide a sequence of indexes to be removed, and like slicing the first number is inclusive and last number is exclusive.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Execute a Program}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.process; \newline import std.exception; \newline \newline auto res = execute({[}"app name", "arg 1", "arg 2"{]}); \newline enforce(res.status == 0, "App exited with failure"); \newline \newline import std.stdio; \newline writeln(res.output);} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\{\{link="https://dlang.org/phobos/std\_process.html\#execute"\}\}execute\{\{/link\}\} will run the application to completion and store the output for review.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Handling Paths}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import std.path; \newline buildNormalizedPath("foo/bar/../peas" \newline \seqsplit{.absolutePath.expandTilde);} \newline auto a = "foo"; \newline auto b = "bar"; \newline \newline assert({[}a, b{]}.joiner("/").equal(a.buildPath(b))); \newline \newline assert("file.ext".extension == ".ext"); \newline assert("file.ext".setExtension("gif") == "file.gif"); \newline assert("file.ext".stripExtension == "file");} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{There are lots of utilities in \{\{link="https://dlang.org/phobos/std\_path.html"\}\}std.path\{\{/link\}\}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}