% arara: lualatex % arara: lualatex % arara: clean: { extensions: [ aux, log, out, ilg, ind, idx, toc, hd, fls ] } \documentclass{ltxdoc} \usepackage[top=0.5in, bottom=0.3in, left=1.4in, right=0.7in,footskip=0.2in,headheight=1cm,headsep=0.27cm]{geometry} \usepackage{unicode-math} % \setmathfont[Scale = 0.95]{Latin Modern Math} \setmainfont[ Numbers = OldStyle, Ligatures = TeX, Scale = 0.95, UprightFont = *-Regular, ItalicFont = *-Italic, BoldFont = *-Bold, BoldItalicFont = *-BoldItalic, SmallCapsFeatures = {Letters=SmallCaps}, Extension =.otf]{LibertinusSerif} \setsansfont[ Numbers = OldStyle, Ligatures = TeX, Scale = 0.95, UprightFont = *-Regular, ItalicFont = *-Italic, BoldFont = *-Bold, SmallCapsFeatures = {Letters=SmallCaps}, Extension = .otf]{LibertinusSans} \setmonofont[ Numbers = OldStyle, Scale = 0.80, UprightFont = *-Regular, ItalicFont = *-RegularIt, BoldFont = *-Semibold, BoldItalicFont = *-SemiboldIt, RawFeature = {+zero,+ss06}, FontFace = {m}{sc}{LinBiolinum_R.otf}, Extension = .otf]{SourceCodePro} % source code font \newfontfamily\lmmitalic{lmmono10-italic.otf}[ Scale = 0.95,% Extension = .otf,% ItalicFont = lmmono10-italic,% SmallCapsFont = lmmonocaps10-oblique,% SlantedFont = lmmonoslant10-regular, ] \newfontfamily\fetamontotf{ffmw10.otf}[ Scale = 0.95,% RawFeature = {+latn,+rand,+kern,+size},% FontFace = {bx}{n}{ffmw10.otf}, ] \newfontfamily\libertinusinitials{LibertinusSerifInitials-Regular.otf} % The character of visible space is now taken from Latin Modern Mono % to prevent fonts in T1. The original definition for xetex/luatex is % \def\verbvisiblespace{\usefont{OT1}{cmtt}{m}{n}\asciispace} \def\verbvisiblespace{{\fontfamily{lmtt}\selectfont\char"2423}} \usepackage{fontawesome5} \usepackage{hologo} % LaTeX logos \usepackage{enumitem,lastpage,microtype,titletoc} % custom \usepackage[svgnames]{xcolor} % \usepackage[sf,bf,compact,medium]{titlesec} % section styles \usepackage[topmarks,extramarks]{titleps} % pagestyles \settitlemarks*{section,subsection} \usepackage{adjustbox,multicol,hyperref,xparse,listings,accsupp} \usepackage{csquotes} \usepackage{hyperxmp,imakeidx}% % Hyperref number in index \newcommand{\HP}[1]{\emph{\hyperpage{#1}}\normalsize} \def\SortIndex#1#2{\index{#1\actualchar#2|HP}} \indexsetup{level=\section,firstpagestyle=myheader} \makeindex[options=-q -s gind.ist,columnsep=15pt,title={Index of Documentation}] %noautomatic %\makeindex[noautomatic,columnsep=15pt,title={Index of Documentation}] % % parindent \setlength{\parindent}{0pt} % Colors for options \definecolor{optcolor}{rgb}{0.281,0.275,0.485} \definecolor{pkgcolor}{rgb}{0,0.5,0.5} \definecolor{araracolor}{rgb}{0, 0.72, 0.28} \definecolor{linkcolor}{rgb}{0.04,0.38,0.04} \definecolor{rulecolor}{rgb}{0.96,0.96,0.96} % Only for arara... I like arara :) \usepackage[scale=0.85]{comfortaa} \newcommand{\araratext}[1]{{\small\normalfont\comfortaa\color{araracolor}\bfseries#1}} \newcommand*\arara{\araratext{ar\kern-.03emar\kern-.03ema}} % Identification \def\myscript{ltximg} \def\fileversion{2.1} \def\filedate{2021-05-21} % Logo with fetamont and libertuns font \ExplSyntaxOn \NewDocumentCommand{\pkglogo}{} { \group_begin: \libertinusinitials% \textcolor{red}{L}\hspace{-3.0pt}% \raisebox{-0.2em}{\small \textcolor{green}{T}}% \hspace{-2.9pt}\textcolor{blue}{X}% \hspace{-1pt} \fetamontotf{\textcolor{gray}{img}} \group_end: } \ExplSyntaxOff % Logo with libertuns and fetamont font (box) \newsavebox{\logobox} \savebox{\logobox}{% \normalsize% {\libertinusinitials% \textcolor{red}{L}\hspace{-3.0pt}% \raisebox{-0.2em}{\small \textcolor{green}{T}}% \hspace{-2.9pt}\textcolor{blue}{X}}% \hspace{-1pt}\fetamontotf{\textcolor{gray}{img}}% }% \makeatletter \newcommand{\LTXimg}{% \settoheight{\@tempdima}{L}% \resizebox{!}{\@tempdima}{\usebox{\logobox}}% } \makeatother % email https://tex.stackexchange.com/a/663 \catcode`\_=11\relax% \newcommand\email[1]{\_email #1\q_nil}% \def\_email#1@#2\q_nil{% \href{mailto:#1@#2}{{\emailfont #1\emailampersat #2}}% }% \newcommand\emailfont{\sffamily}% \newcommand\emailampersat{{\color{pkgcolor}\footnotesize@}}% \catcode`\_=8\relax% % % Config hyperref \hypersetup{ linkcolor = linkcolor,% citecolor = magenta,% urlcolor = magenta,% colorlinks = true,% linktoc = all, pdftitle = {.:: ltximg v\fileversion{} [\filedate] --- LaTeX environments to image and standalone files ::.},% pdfauthor = {Pablo Gonz\'{a}lez Luengo},% pdfsubject = {Documentation for version \fileversion},% pdfcopyright = {\textcopyright 2013 - 2021 by Pablo González Luengo}, pdfcontacturl = {https://github.com/pablgonz/ltximg}, pdfkeywords = {extract, conversion, images, TikZ, PStricks, standalone files}, pdfstartview = {FitH},% bookmarksopenlevel = 2,% } % Configuration titleps and titlesec \renewpagestyle{plain}[\color{optcolor}\small\sffamily]{% \setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax% \parbox{1.93\paperwidth}{\hfil\thepage\,/\,\pageref{LastPage}}}}% {}% {}% } \newpagestyle{myheader}[\color{optcolor}\small\sffamily]{% \renewcommand\makeheadrule{% \rlap{\hskip\dimexpr-\oddsidemargin-1in\relax \color{rulecolor}\rule[0.3cm]{\paperwidth}{0.7cm}}\hss } \setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax% \parbox{1.93\paperwidth}{\hfil\thepage\,/\,\pageref{LastPage}}}}% {\parbox{\textwidth}{\raggedright \textcolor{gray}{\raisebox{-1pt}{\textcopyright}{}2013 -- 2021 by Pablo González}}}% {}% \sethead{\llap{\raisebox{0.55cm}{\parbox{\dimexpr\oddsidemargin+1in\relax}{\makebox[0pt][l]{\hspace{15pt}\pkglogo\space\fileversion}}}}} {\raisebox{0.55cm}{\parbox{\textwidth}{\hspace*{-\oddsidemargin}\centering\small\S.\firstextramarks{section}\thesection\space\sectiontitle}}}% {}% } % Table of contents \titlecontents{section}[0mm]{}% {\bfseries\contentspush{\makebox[5mm][l]{\thecontentslabel\hfill}}}% {\hspace*{-5mm}}% numberless {\hspace{0.25em}\titlerule*[6pt]{.}\contentspage}% \titlecontents{subsection}[5mm]{}% {\contentspush{\makebox[6mm][l]{\thecontentslabel\hfill}}} {\hspace*{-11mm}}% numberless {\hspace{0.25em}\titlerule*[6pt]{.}\contentspage}% \titlecontents{subsubsection}[11mm]{}% {\contentspush{\makebox[8mm][l]{\thecontentslabel\hfill}}} {\hspace*{-19mm}}% numberless {\hspace{0.25em}\titlerule*[6pt]{.}\contentspage}% \makeatletter \renewcommand\tableofcontents{% \begingroup% \section*{\contentsname\quad{\color{optcolor}\leaders\hrule height 5pt depth -4.4pt\hfill}% \@mkboth{% \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}% \vspace*{-14pt} \setlength{\columnsep}{10pt}% \begin{multicols}{2}% \@starttoc{toc}% \end{multicols}% \vspace*{-3pt}{\color{optcolor}\hrule height 0.6pt}% \vspace*{5pt} \endgroup } \makeatother % Custom thanks \makeatletter \renewcommand*{\@fnsymbol}[1]{\ensuremath{\ifcase#1\or \textcolor{pkgcolor}{*} \or \textcolor{pkgcolor}{\dagger} \or \ddagger\or \mathsection \or \mathparagraph\or \|\or **\or \dagger\dagger \or \ddagger\ddagger \else\@ctrerr\fi}} \makeatother % Custom \meta[...]{...}, \marg[...]{...} and \oarg[...]{...} for color \ExplSyntaxOn \RenewDocumentCommand{\meta}{O{}m} { \ltximg_meta_generic:Nnn \ltximg_meta:n { #1 } { #2 } } \RenewDocumentCommand{\marg}{O{}m} { \ltximg_meta_generic:Nnn \ltximg_marg:n { #1 } { #2 } } \RenewDocumentCommand{\oarg}{O{}m} { \ltximg_meta_generic:Nnn \ltximg_oarg:n { #1 } { #2 } } %^^A Variables and keys \tl_new:N \l_ltximg_meta_font_tl \keys_define:nn { ltximg/meta } { type .choice:, type / tt .code:n = \tl_set:Nn \l_ltximg_meta_font_tl { \ttfamily }, type / rm .code:n = \tl_set:Nn \l_ltximg_meta_font_tl { \rmfamily }, type .initial:n = rm, cf .tl_set:N = \l_ltximg_meta_color_tl, cf .initial:n = optcolor, ac .tl_set:N = \l_ltximg_meta_anglecolor_tl, ac .initial:n = lightgray, sbc .tl_set:N = \l_ltximg_meta_brackcolor_tl, sbc .initial:n = gray, cbc .tl_set:N = \l_ltximg_meta_bracecolor_tl, cbc .initial:n = gray, } %^^A Internal commands \cs_new_protected:Npn \ltximg_meta_generic:Nnn #1 #2 #3 { \group_begin: \keys_set:nn { ltximg/meta } { #2 } \color{ \l_ltximg_meta_color_tl } \l_ltximg_meta_font_tl #1 { #3 } % #1 is \ltximg_meta:n, \ltximg_marg:n or \ltximg_oarg:n \group_end: } \cs_new_protected:Npn \ltximg_meta:n #1 { \ltximg_meta_angle:n { \textlangle } \ltximg_meta_meta:n { #1 } \ltximg_meta_angle:n { \textrangle } } \cs_new_protected:Npn \ltximg_marg:n #1 { \ltximg_meta_brace:n { \textbraceleft } \ltximg_meta:n { #1 } \ltximg_meta_brace:n { \textbraceright } } \cs_new_protected:Npn \ltximg_oarg:n #1 { \ltximg_meta_brack:n { [ } \ltximg_meta:n { #1 } \ltximg_meta_brack:n { ] } } \cs_new_protected:Npn \ltximg_meta_meta:n #1 { \textnormal{\textit{#1}} } \cs_new_protected:Npn \ltximg_meta_angle:n #1 { \group_begin: \fontfamily{lmr}\selectfont \textcolor{\l_ltximg_meta_anglecolor_tl}{#1} \group_end: } \cs_new_protected:Npn \ltximg_meta_brace:n #1 { \group_begin: \color{\l_ltximg_meta_bracecolor_tl} #1 \group_end: } \cs_new_protected:Npn \ltximg_meta_brack:n #1 { \textcolor{\l_ltximg_meta_brackcolor_tl}{#1} } % \ltximg for body document \NewDocumentCommand{\ltximg}{} { \normalsize\texttt{\bfseries\textcolor{pkgcolor}{ltximg}} } % \prgname{sm} : #1 index compiler, #2 index programs: \NewDocumentCommand{\prgname}{sm} { \IfBooleanTF{#1} { \textcolor{ForestGreen}{\texttt{#2}} \SortIndex{compiler}{Compiler>\small\texttt{#2}} } { \textcolor{ForestGreen}{\texttt{#2}} \SortIndex{programs}{Programs>\small\texttt{#2}} } } % \prgopt{sm} : #1 compiler opt, #2 program opt: \NewDocumentCommand{\prgopt}{sm} { \IfBooleanTF{#1} { \mbox{\textcolor{gray}{\texttt{-{}#2}}} \SortIndex{compiler ~ options}{Compiler ~ options>\small\texttt{-{}#2}} } { \mbox{\textcolor{gray}{\texttt{-{}#2}}} \SortIndex{#2}{\small\texttt{-{}#2} (program ~ option)}% } } % \scriptname*{m} \NewDocumentCommand{\scriptname}{m} { \textcolor{ForestGreen}{\texttt{#1}} \SortIndex{scripts}{Scripts>\small\texttt{#1}} } % \scriptopt{m} \NewDocumentCommand{\scriptopt}{m} { \mbox{\texttt{#1}} \SortIndex{script ~ option}{Script ~ options>\small\texttt{#1}} } % \myclass{m} \NewDocumentCommand{\myclass}{ m } { \mbox{\textsf{\textcolor{SlateBlue}{#1}}} \SortIndex{document}{Document ~ class>\small\texttt{#1}} \SortIndex{#1}{\texttt{#1} ~ (class)} } % \pkgname{m} \NewDocumentCommand{\pkgname}{ m } { \textsf{\textcolor{SlateBlue}{#1}} \SortIndex{packages}{Packages>\small\texttt{#1}} \SortIndex{#1}{\texttt{#1} ~ (package)} } % \pkgopt{m} \NewDocumentCommand{\pkgopt}{ m } { \textsf{\textcolor{gray}{#1}} \SortIndex{package ~ options}{Package ~ options>\small\texttt{#1}} \SortIndex{#1}{\texttt{#1} ~ (package ~ option)} } % \env{m} \NewDocumentCommand{\env}{ m } { \textcolor{pkgcolor}{\texttt{#1}} \SortIndex{environment}{Environments>\small\texttt{#1}} } % \LVenv{m} \NewDocumentCommand{\LVenv}{ m } { \textcolor{pkgcolor}{\texttt{#1}} \SortIndex{environment ~ verbatim}{Environments ~ verbatim>\small\texttt{#1}} } % \LWenv{m} \NewDocumentCommand{\LWenv}{ m } { \textcolor{pkgcolor}{\texttt{#1}} \SortIndex{environment ~ verbatim ~ write}{Environments ~ verbatim ~ write>\small\texttt{#1}} } % \ics{sm} \NewDocumentCommand{\ics}{sm} { \IfBooleanTF{#1} { \tl_set:Nn \l_tmpa_tl { #2 } \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl \textcolor{blue!75}{\ttfamily\textbackslash{\tl_use:N \l_tmpa_tl}} } { \textcolor{blue!75}{\ttfamily{\textbackslash#2}} } \SortIndex{#2}{\texttt{\small\textbackslash#2}} } % \module{m} \NewDocumentCommand{\module}{m} { \SortIndex{Perl ~ module}{Perl ~ module >\small\texttt{#1}} \tl_set:Nn \l_tmpa_tl { #1 } \regex_replace_all:nnN { (\:\:) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl \textcolor{blue!75}{\ttfamily{\tl_use:N \l_tmpa_tl}} %\SortIndex{Perl ~ module}{Perl ~ module >\small\texttt{\tl_use:N \l_tmpa_tl}} } % File extention \NewDocumentCommand{\fext}{m} { \mbox{\textcolor{OrangeRed}{\texttt{.#1}}} \SortIndex{file ~ extention}{File ~ extentions >\small\texttt{.#1}} } % File \NewDocumentCommand{\Fext}{m m} { \mbox{\textcolor{OrangeRed}{\texttt{#1}\fext{#2}}} \SortIndex{file}{File >\small\texttt{#1.#2}} } % Image format/extention \NewDocumentCommand{\iext}{m} { \textcolor{optcolor}{\texttt{#1}} \SortIndex{Image ~ format}{Image ~ formats>\small\texttt{#1}} } % \sysydir{m} \NewDocumentCommand{\sysdir}{m} { \mbox{\textcolor{OrangeRed}{\texttt{#1}}} } % \sysfile{m} ...only for color in some examples \NewDocumentCommand{\sysfile}{m} { \mbox{\textcolor{OrangeRed}{\texttt{#1}}} } % \OSsystem{m} ...only for color in some examples \NewDocumentCommand{\OSsystem}{m} { \mbox{\textcolor{OrangeRed}{\texttt{#1}}} \SortIndex{Operating ~ system}{Operating ~ system>\small\texttt{#1}} } % \cmdopt[short]{long} \NewDocumentCommand{\cmdopt}{om} { \IfNoValueTF{#1} { \textcolor{optcolor}{\texttt{-\/-#2}} } { \textcolor{optcolor}{\texttt{-{}#1}}, \textcolor{optcolor}{\texttt{-\/-#2}} } \SortIndex{options}{\textsf{\myscript}\ options ~ in ~ command ~ line>\small\texttt{-\/-#2}} } \ExplSyntaxOff % \DescribeIF{m}, #1 image format \newsavebox{\marginIF} \NewDocumentCommand{\DescribeIF}{ m } {% \begin{lrbox}{\marginIF}% \begin{minipage}[t]{\marginparwidth}% \raggedleft\ttfamily\bfseries% \textcolor{optcolor}{#1} \end{minipage}% \end{lrbox}% \SortIndex{Image format}{Image formats>\small\texttt{#1}} \leavevmode% \marginpar{\usebox{\marginIF}}% \ignorespaces% }% % \myenv{environ} for margin \NewDocumentCommand{\myenv}{m} { \begin{minipage}[t]{\marginparwidth}% \raggedleft\ttfamily\small% {\textcolor{gray}{\textbackslash begin\{}}{\bfseries\textcolor{pkgcolor}{#1}}\textcolor{gray}{\}}\par% \meta[ac=lightgray,cf=gray]{env content}\par% {\textcolor{gray}{\textbackslash end\{}}{\bfseries\textcolor{pkgcolor}{#1}}\textcolor{gray}{\}}% \end{minipage}% \SortIndex{Environment}{Environments suport by default>\small\texttt{#1}}% } % \mytag{dtxtag} for margin \NewDocumentCommand{\mytag}{m} {% \begin{minipage}[t]{\marginparwidth}% \raggedleft\ttfamily\small% \textcolor{gray}{\%<*}{\bfseries\textcolor{pkgcolor}{#1}}\textcolor{gray}{>}\par% \meta[ac=lightgray,cf=gray]{content}\par% \textcolor{gray}{\%}% \end{minipage}% \SortIndex{docstrip}{Docstrip tag>\small\texttt{#1}}% }% % \DescribeTE{sm}, #1 tag, #2 env \newsavebox{\marginenvtag} \NewDocumentCommand{\DescribeTE}{sm}{% \begin{lrbox}{\marginenvtag}% \begin{minipage}[t]{\marginparwidth}% \raggedleft \IfBooleanTF{#1}{\mytag{#2}}{\myenv{#2}} \end{minipage}% \end{lrbox}% \leavevmode% \marginpar{\usebox{\marginenvtag}}% \ignorespaces% }% % DescribeOptFile*{options}{example}[!] \newsavebox{\optinfile} \NewDocumentCommand{\DescribeOptFile}{s m m O{\hphantom{!}}}{ \begin{lrbox}{\optinfile}% \begin{minipage}[t]{\marginparwidth}% \raggedleft\ttfamily\bfseries% \textcolor{gray}{\%}\textcolor{optcolor}{{#4}\myscript}\textcolor{gray}{\texttt{:}}% \end{minipage}% \end{lrbox}% \leavevmode% \lapbox[0pt]{-\marginparwidth-0.5\marginparsep}{\usebox{\optinfile}}% \textcolor{optcolor}{\bfseries\texttt{{#2}}}% \textcolor{gray}{\texttt{:}}\space% \marg[type=tt,cbc=gray,ac=lightgray,cf=optcolor!85]{#3}% \vspace*{2pt}\par% \IfBooleanF{#1} {% \SortIndex{options}{\textsf{\myscript}\ options in input file>\small\texttt{#2}}% }% } % \DescribeCmd[...]{...}{...}{...} \newsavebox{\optcmdline} \NewDocumentCommand{\DescribeCmd}{ o m m m } { \begin{lrbox}{\optcmdline}% \begin{minipage}[t]{\marginparwidth}% \ttfamily\bfseries\raggedleft% \IfNoValueTF{#1} {\textcolor{optcolor}{-\/-#2}} {\textcolor{optcolor}{-{#1}}\textcolor{gray}{,} \textcolor{optcolor}{-\/-#2}}% \end{minipage}% \SortIndex{options}{\textsf{\myscript}\ options in command line>\small\texttt{-\/-#2}}% \end{lrbox}% \leavevmode% \marginpar{\usebox{\optcmdline}}% \ignorespaces \meta[ac=lightgray,cf=gray]{#3} \hfill\textcolor{gray}{\textsf{(default: {#4})}}% \vspace*{2pt}\par% } % don't copy numbers in code example for listings \newcommand*{\noaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}} % Create a language for documentation \lstdefinelanguage{ltximg-doc}{ texcsstyle=*,% escapechar=`,% showstringspaces=false,% extendedchars=true, % stringstyle = {\color{red}},% alsoletter={\-,.},% % comments morecomment=[l]{\%},% commentstyle=\lmmitalic\color{lightgray},% % Important words 1 keywordstyle=[1]{\color{NavyBlue}},% keywords=[1]{PassOptionsToPackage,AtBeginDocument,documentclass,usepackage,section},% % Important words 2 (macros) keywordstyle=[2]{\color{blue!75}},% keywords=[2]{graphicspath,RequirePackage,renewcommand,includegraphics,coordinate,draw,approx,% PreviewBbAdjust,setlength,parindent,usetikzlibrary,tikzexternalize,psset,tikzset,PrependGraphicsExtensions,cmd,% DefineShortVerb,lstMakeShortInline,MakeSpecialShortVerb,UndefineShortVerb,verb,myverb,macro,put,line,Win32::Console::ANSI},% % Important words 3, options in input file keywordstyle=[3]{\color{optcolor!85}},% keywords=[3]{extrenv,deltenv,skipenv,options,arara,extensions,luatex,env,norun,% clean,pst,tkz,eps,pdf,xetex,latex,luatex,dvips,png,latexmk,svg,srcenv,noprew,imgdir,prefix,output},% % Important words 4, environments and tags keywordstyle=[4]{\color{pkgcolor}},% keywords=[4]{ltximg,noltximg,remove,pspicture,endpspicture,overlay,remember,% description,filecontents,PSTexample,pgfpicture, endpgfpicture, tikzpicture, endtikzpicture, % psgraph, endpsgraph,nopreview,postscript,picture},% % Important words 5, directory keywordstyle=[5]{\color{OrangeRed}},% keywords=[5]{images,pics},% % Important words 6, begin, end and other keywordstyle=[6]{\color{gray}},% replace this color keywords=[6]{begin,end,-recorder,doc,active,inactive,tightpage,BEGIN,END,% -shell-escape,osf,--output-format,--exact-bbox,-o,dvi},% % Important words 7, reserved for arara keywordstyle=[7]{\color{araracolor}},% keywords=[7]{lualatex,dvisvgm,halt,xelatex},% % Important words 8, pkg and others load in examples keywordstyle=[8]{\color{SlateBlue}},% keywords=[8]{graphicx,grfext,tikz,article,document,preview,libertinus,calc,tikzmark,pst-pdf},% % Important words 9, files used in examples keywordstyle=[10]{\color{OrangeRed}},% keywords=[10]{file.tex,test-fig-1981.tex,test-fig-1981.pdf,test-fig-1,test-fig-2,test-out,test-in.ltx,% test-fig-1981.tex,test-out.tex,file-in.tex,file-out,test.tex,test-fig-all.dvi,test-fig-1.svg,test-fig-all.tex},% }[keywords,tex,comments,strings]% end languaje % \begin{examplecode}[opts]...\end{examplecode} \lstnewenvironment{examplecode}[1][]{% \lstset{ language=ltximg-doc,% stringstyle = {\color{red}},% basicstyle=\ttfamily\small,% numbersep=1em,% numberstyle=\tiny\color{gray}\noaccsupp,% rulecolor=\color{gray!50},% framesep=\fboxsep,% framerule=\fboxrule,% xleftmargin=\dimexpr\fboxsep+\fboxrule\relax,% xrightmargin=\dimexpr\fboxsep+\fboxrule\relax,% % literateee literate=*{\{}{{\bfseries\textcolor{gray}{\{}}}{1} {\}}{{\bfseries\textcolor{gray}{\}}}}{1} {[}{{\textcolor{gray}{[}}}{1} {]}{{\textcolor{gray}{]}}}{1} {\*}{{\bfseries\textcolor{MediumOrchid}{*}}}{1} {:}{{\textcolor{gray}{:}}}{1} {,}{{\textcolor{gray}{,}}}{1} {=}{{\textcolor{gray}{=}}}{1} {/}{{\textcolor{OrangeRed}{/}}}{1} {scale=1}{{\textcolor{gray}{scale=1}}}{7} {\%\ ltximg}{{\textcolor{gray}{\%}\space\textcolor{optcolor}{ltximg}}}{8} {\%\ arara}{{\textcolor{gray}{\%}\space\textcolor{araracolor}{arara}}}{7} {\%<*remove>}{{\textcolor{gray}{\%<*}\textcolor{pkgcolor}{remove}\textcolor{gray}{>}}}{10} {\%}{{\textcolor{gray}{\%}}}{10} {\%<*ltximg>}{{\textcolor{gray}{\%<*}\textcolor{pkgcolor}{ltximg}\textcolor{gray}{>}}}{10} {\%}{{\textcolor{gray}{\%}}}{10} {\%<*noltximg>}{{\textcolor{gray}{\%<*}\textcolor{pkgcolor}{noltximg}\textcolor{gray}{>}}}{12} {\%}{{\textcolor{gray}{\%}}}{12},% #1,% }% close lstset }% {\vspace{-\parskip}}% close examplecode % \begin{examplecmd}...\end{examplecmd} \lstnewenvironment{examplecmd}{% \lstset{ language=ltximg-doc,% basicstyle=\ttfamily\small,% frame=single,% alsoletter={\-,.,\-\-},% rulecolor=\color{gray!50},% framesep=\fboxsep,% framerule=\fboxrule,% xleftmargin=\dimexpr\fboxsep+\fboxrule\relax,% xrightmargin=\dimexpr\fboxsep+\fboxrule\relax,% keywordstyle=[20]{\color{gray}},% replace this color keywords=[20]{-recorder,-shell-escape,--latex,-s,-o,--arara,--log,% -no-shell-escape,-interaction,nonstopmode,--norun,--luatex,--latexmk,% --svg,--png,--nopdf,--margins},% % Reserved words (cmd line options) deletekeywords=[4]{ltximg},% classoffset=7,% keywordstyle=\bfseries\color{pkgcolor},% morekeywords={ltximg},% % % Reserved words (cmd line options) classoffset=8,% keywordstyle={\color{ForestGreen}},% morekeywords={gs,ps2pdf,pdftoppm,pdftocairo,pdftops,cd,perl,pdfcrop},% % Only for command line options classoffset=5,% keywordstyle=\color{blue},% keywords={user,machine},% literate=*{[}{{\textcolor{darkgray}{[}}}{1} {]}{{\textcolor{darkgray}{]}}}{1} {=}{{\textcolor{gray}{=}}}{1} {@}{{\textcolor{blue}{@}}}{1} {\$}{{\textcolor{blue}{\$}}}{1} {:}{{\textcolor{blue}{:}}}{1} {§}{{\textcolor{red}{\$}}}{1} {~}{{\textcolor{blue}{\bfseries\textasciitilde}}}{1}% }% close lstset }% {\vspace{-\parskip}}% close examplecmd % \lstinline[style=inline]|...| \lstdefinestyle{inline} { language=ltximg-doc,% basicstyle=\ttfamily\color{gray},% escapechar=`,% upquote=true,% deletekeywords=[8]{preview},% morekeywords =[4]{preview},% literate=*{\%}{{\bfseries\textcolor{gray}{\%}}}{1} {\*}{{\bfseries\textcolor{MediumOrchid}{*}}}{1} } % set default style \lstset{style=inline} \begin{document} \title{% {\fetamontotf latex environments }\\[3pt]% \scalebox{3.4}{\LTXimg}\\[2pt]% {\fetamontotf\addfontfeature{LetterSpace=12.0} to image format}\\% \Large v\fileversion{} --- \filedate\thanks{% This file describes a documentation for version \fileversion, last revised \filedate.}\\[25pt]% \author{% \large% \raisebox{-1pt}{\textcopyright}{}2013--2021 by Pablo González L% \thanks{E-mail: \textcolor{optcolor}{\textsf{\guillemotleft}}\email{pablgonz@yahoo.com}\textcolor{optcolor}{\textsf{\guillemotright}}} }% \small \textcolor{gray}{\textsc{ctan}}\,\,\,\url{https://www.ctan.org/pkg/ltximg}\\ \textcolor{gray}{\scriptsize\faIcon[regular]{github}}\,\,\,\url{https://github.com/pablgonz/ltximg} \vspace*{-2cm} }% \date{} \maketitle \begin{abstract} \ltximg{} is a \prgname{perl} \emph{script} that automates the process of extracting and converting environments provided by \pkgname{TikZ}, % \pkgname{PStricks} and other packages from \meta[cf=optcolor]{input file} to image formats and standalone files using \prgname{ghostscript} and % \prgname{poppler-utils}. Generates a file with only extracted environments and another with all extracted environments converted to \ics{includegraphics}. \end{abstract} \tableofcontents \setlength{\parskip}{3pt} \section{License} This program is free software; you can redistribute it and/or modify it under the terms of the \href{https://www.gnu.org/licenses/gpl-3.0.html}{GNU General Public License} as published by the \href{https://www.fsf.org/}{Free Software Foundation}; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \href{https://www.gnu.org/licenses/gpl-3.0.html}{GNU General Public License} for more details. \section{Motivation and Acknowledgments} The original idea was to extend the functionality of the \scriptname{pst2pdf}\cite{pst2pdf} script to work with \env{tikzpicture} and other environments. The \pkgname{TikZ}\cite{tikz} package allows to \emph{externalize} the environments, but, the idea was to be able to extend this to \emph{any type} of environment covering three central points: \begin{enumerate}[font=\small,noitemsep,leftmargin=*,nosep] \item Generate a separate image files for environments. \item Generate a standalone files with only the extracted environments. \item Generate a file replacing the environments by \ics{includegraphics}. \end{enumerate} From the side of \hologo{TeX} there are some packages that cover several of these points such as the \pkgname{preview}\cite{preview}, \pkgname{xcomment}\cite{xcomment}, \pkgname{extract}\cite{extract} and \pkgname{cachepic}\cite{cachepic} packages among others, but none covered all points. In the network there are some solutions in \texttt{bash} that were able to extract and convert environments, but in general they presented problems when the document contained \emph{\enquote{verbatim style}} code or were only available for \OSsystem{Linux}. \thispagestyle{plain} \newpage \pagestyle{myheader} Analysed the situation the best thing was to create a new \emph{\enquote{script}} that was able to cover the three points and was multi platform, the union of all these ideas is born \ltximg. This script would not be possible without the great work of Herbert Voß author of \scriptname{pst2pdf}\footnote{\url{https://ctan.org/pkg/pst2pdf}} and Heiko Oberdiek author of \scriptname{pdfcrop}\footnote{\url{https://ctan.org/pkg/pdfcrop}}. Several parts of the code have been taken and adapted from both scripts. \section{Requirements for operation} \label{sec:requirements} For the complete operation of \ltximg{} you need to have a modern % \hologo{TeX} distribution such as \hologo{TeX} Live or \hologo{MiKTeX}, have a version equal to or greater than \liningnums{5.28} of \prgname{perl}, a version equal to or greater than \liningnums{9.52} of \prgname{ghostscript}, a version equal to or greater than \liningnums{1.40} of \scriptname{pdfcrop} and have a version equal to or greater than \liningnums{0.52} of % \prgname{poppler-utils}. \hologo{MiKTeX} and \prgname{cygwin} users must install the appropriate software for full operation. \ltximg{} auto detects the \prgname{ghostscript}, but not \prgname{poppler-utils}. You should keep this in mind if you are using the script directly and not the version provided in your \hologo{TeX} distribution. The script has been tested on \OSsystem{Windows} 10, \prgname{cygwin} 3.1.6, \prgname{Git for Windows} 2.30 and \OSsystem{Linux} (fedora 34) using \prgname{ghostscript} 9.53.3, \prgname{poppler-utils} 0.90, \prgname{perl} 5.32 and the standard classes offers by \hologo{LaTeX}: \myclass{book}, \myclass{report}, \myclass{article} and \myclass{letter}. The \pkgname{preview}\cite{preview} and \pkgname{pst-pdf}\cite{pst-pdf} packages are required to process the \meta{input file} and if an \meta{output file} is generated, the \pkgname{graphicx}\cite{graphicx} and \pkgname{grfext}\cite{grfext} packages will be needed. \subsection{Modules required} \ltximg{} uses only packages from the core of the \prgname{perl}, the distribution encapsulated in \hologo{TeX} Live 2020 for \OSsystem{Windows} does not have the module \module{Win32::Console::ANSI}, this does not affect the operation of the script, but it does affect the presentation of the messages when invoked from \emph{standart} \prgname{cmd}, it is recommended to use a more modern (and comfortable) application such as \prgname{Windows Terminal}. \setlength{\multicolsep}{2ex} \begin{multicols}{2} \begin{itemize}[font=\sffamily\small,first=\small,partopsep=5pt,parsep=5pt,nosep,leftmargin=*] \item \module{Getopt::Long} \item \module{File::Spec::Functions} \item \module{File::Basename} \item \module{Archive::Tar} \item \module{Data::Dumper} \item \module{FileHandle} \item \module{IO::Compress::Zip} \item \module{File::Path} \item \module{File::Temp} \item \module{POSIX} \item \module{File::Copy} \item \module{File::Find} \item \module{Env} \item \module{autodie} \item \module{Config} \item \module{Cwd} \item \module{Term::ANSIColor} \item \module{Module::Load::Conditional} \item Only on \OSsystem{Windows}: \begin{itemize}[font=\sffamily\small,first=\small,nosep] \item \module{Win32} \item \module{Win32::Console::ANSI} \item \module{Win32::TieRegistry} \end{itemize} \end{itemize} \end{multicols} \section{How it works} \label{sec:howtowork} It is important to have a general idea of how the \emph{\enquote{extraction and conversion}} process works and the requirements that must be fulfilled so that everything works correctly, for this we must be clear about some concepts related to how to work with the \meta[cf=optcolor]{input file}, the \meta{verbatim content} and the \meta{steps process}. \subsection{The input file} \label{sec:inputfile} The \meta[cf=optcolor]{input file} must comply with \emph{certain characteristics} in order to be processed, the content at the beginning and at the end of the \meta{input file} is treated in a special way, before \lstinline|\documentclass| and after \lstinline|\end{document}| can go any type of content, internally the script will \emph{\enquote{split}} the \meta[cf=optcolor]{input file} at this points. If the \meta[cf=optcolor]{input file} contains files using \ics{input}\marg[type=tt]{file} or \ics{include}\marg[type=tt]{file} these will not be processed, from the side of the \emph{script} they only represent lines within the file, if you want them to be processed it is better to use the \scriptname{latexpand}\footnote{\url{https://www.ctan.org/pkg/latexpand}} first and then process the file. Like \ics{input}\marg[type=tt]{file} or \ics{include}\marg[type=tt]{file}, blank lines, vertical spaces and tab characters are treated literally, for the \emph{script} the \meta[cf=optcolor]{input file} is just a set of characters, as if it was a simple text file. It is advisable to format the source code \meta[cf=optcolor]{input file} using utilities such as \prgname{chktex}\footnote{\url{https://www.ctan.org/pkg/chktex}} and \scriptname{latexindent}\footnote{\url{https://www.ctan.org/pkg/latexindent}}, especially if you want to extract the source code of the environments. Both \ics{thispagestyle}\marg[type=tt]{style} and \ics{pagestyle}\marg[type=tt]{style} are treated in a special way by the script, if they do not appear in the preamble then \ics{pagestyle}\marg[type=tt]{empty} will be added and if they are present and \marg[type=tt]{style} is different from \marg[type=tt]{empty} this will be replaced by \marg[type=tt]{empty}. This is necessary for the image creation process, it does not affect the \meta{output file}, but it does affect the \emph{standalone} files. For the script the process of dividing the \meta{input file} into four parts and then processing them: \begin{examplecode}[numbers=left,frame=single] % Part One: Everything before \documentclass \documentclass{article} % Part two: Everything between \documentclass and \begin{document} \begin{document} % Part three: : Everything between \begin{document} and \end{document} \end{document} % Part Four: Everything after \end{document} \end{examplecode} If for some reason you have an environment \LWenv{filecontents} before \lstinline|\documentclass| or in the preamble of the \meta{input file} that contains a \emph{sub-document} or \emph{environment} you want to extract, the script will ignore them. Similarly, the content after \lstinline|\end{document}| is ignored in the extraction process. \subsection{Verbatim contents} \label{sec:verbatim} One of the greatest capabilities of this script is to \emph{\enquote{skip}} the complications that \meta{verbatim content} produces with the extraction of environments using tools outside the \enquote{\hologo{TeX} world}\footnote{Only \hologo{TeX} can understand \hologo{TeX}, all other languages and programs are just lines in a file.}. In order to \emph{\enquote{skip}} the complications, the \meta{verbatim content} is classified into three types: \begin{itemize}[nosep] \item Verbatim in line. \item Verbatim standard. \item Verbatim write. \end{itemize} \subsection*{Verbatim in line} \label{sec:verbatim:inline} The small pieces of code written using a \emph{\enquote{verbatim macro}} are considered \meta{verbatim in line}, such as \lstinline+\verb|+\meta{code}\lstinline+|+ or \lstinline+\verb*|+\meta{code}\lstinline+|+ or \lstinline+\macro+\marg[type=tt]{code} or \lstinline+\macro+\oarg[type=tt]{opts}\marg[type=tt]{code}. Most \emph{\enquote{verbatim macro}} provide by packages \pkgname{minted}\cite{minted}, % \pkgname{fancyvrb}\cite{fancyvrb} and \pkgname{listings}\cite{listings} have been tested and are fully supported. They are automatically detected the \emph{verbatim macro} (including \texttt{\small\bfseries\textcolor{MediumOrchid}{*}} argument) generates by \ics{newmint} and \ics{newmintinline} and the following list: \setlength{\multicolsep}{2ex} \begin{multicols}{3} \begin{itemize}[font=\sffamily\small,first=\small,partopsep=5pt,parsep=5pt,nosep,leftmargin=*] \item \ics{mint} \item \ics{spverb} \item \ics{qverb} \item \ics{fverb} \item \ics{verb} \item \ics{Verb} \item \ics{lstinline} \item \ics{pyginline} \item \ics{pygment} \item \ics{Scontents} \item \ics{tcboxverb} \item \ics{mintinline} \end{itemize} \end{multicols} Some packages define abbreviated versions for \emph{\enquote{verbatim macro}} as % \ics{DefineShortVerb}, \ics{lstMakeShortInline} and % \ics{MakeSpecialShortVerb}, will be detected automatically if are declared explicitly in \meta[cf=optcolor]{input file}. The following consideration should be kept in mind for some packages that use abbreviations for verbatim macros, such as \pkgname{shortvrb}\cite{doc} or % \pkgname{doc}\cite{doc} for example in which there is no explicit \lstinline+\macro+ in the document by means of which the abbreviated form can be detected, for automatic detection need to find \ics{DefineShortVerb} explicitly to process it correctly. The solution is quite simple, just add in \meta[cf=optcolor]{input file}: \begin{examplecode} \UndefineShortVerb{\|} \DefineShortVerb{\|} \end{examplecode} depending on the package you are using. If your \emph{\enquote{verbatim macro}} is not supported by default or can not detect, use the options described in \ref{sec:optline} and \ref{sec:optfile}. \subsection*{Verbatim standard} \label{sec:verbatim:std} These are the \emph{\enquote{classic}} environments for \emph{\enquote{writing code}} are considered % \meta{verbatim standard}, such as \LVenv{verbatim} and \LVenv{lstlisting} environments. The following list (including \texttt{\small\bfseries\textcolor{MediumOrchid}{*}} argument) is considered as \meta{verbatim standard} environments: \setlength{\multicolsep}{2ex} \begin{multicols}{4} \begin{itemize}[font=\sffamily\small, first=\small,noitemsep,leftmargin=*] \item \LVenv{Example} \item \LVenv{CenterExample} \item \LVenv{SideBySideExample} \item \LVenv{PCenterExample} \item \LVenv{PSideBySideExample} \item \LVenv{verbatim} \item \LVenv{Verbatim} \item \LVenv{BVerbatim} \item \LVenv{LVerbatim} \item \LVenv{SaveVerbatim} \item \LVenv{PSTcode} \item \LVenv{LTXexample} \item \LVenv{tcblisting} \item \LVenv{spverbatim} \item \LVenv{minted} \item \LVenv{listing} \item \LVenv{lstlisting} \item \LVenv{alltt} \item \LVenv{comment} \item \LVenv{chklisting} \item \LVenv{verbatimtab} \item \LVenv{listingcont} \item \LVenv{boxedverbatim} \item \LVenv{demo} \item \LVenv{sourcecode} \item \LVenv{xcomment} \item \LVenv{pygmented} \item \LVenv{pyglist} \item \LVenv{program} \item \LVenv{programl} \item \LVenv{programL} \item \LVenv{programs} \item \LVenv{programf} \item \LVenv{programsc} \item \LVenv{programt} \end{itemize} \end{multicols} They are automatically detected \meta{verbatim standard} environments (including \texttt{\small\bfseries\textcolor{MediumOrchid}{*}} argument) generates by commands: \setlength{\multicolsep}{2ex} \begin{multicols}{2} \begin{itemize}[font=\sffamily\small,first=\small,noitemsep,leftmargin=*] \item \ics{DefineVerbatimEnvironment} \item \ics{NewListingEnvironment} \item \ics{DeclareTCBListing} \item \ics{ProvideTCBListing} \item \ics{lstnewenvironment} \item \ics{newtabverbatim} \item \ics{specialcomment} \item \ics{includecomment} \item \ics{newtcblisting} \item \ics{NewTCBListing} \item \ics{newverbatim} \item \ics{NewProgram} \item \ics{newminted} \end{itemize} \end{multicols} If any of the \meta{verbatim standard} environments is not supported by default or can not detected, you can use the options described in \ref% {sec:optline} and \ref{sec:optfile}. \subsection*{Verbatim write} \label{sec:verbatim:write} Some environments have the ability to write \emph{\enquote{external files}} or \emph{\enquote{store content}} in memory, these environments are considered \meta{verbatim write}, such as \LWenv{scontents}, \LWenv{filecontents} or \LWenv{VerbatimOut} environments. The following list is considered (including \texttt{\small\bfseries\textcolor{MediumOrchid}{*}} argument) as % \meta{verbatim write} environments: \setlength{\multicolsep}{2ex} \begin{multicols}{4} \begin{itemize}[font=\sffamily\small, first=\ttfamily\small,noitemsep,leftmargin=*] \item \LWenv{scontents} \item \LWenv{filecontents} \item \LWenv{tcboutputlisting} \item \LWenv{tcbexternal} \item \LWenv{tcbwritetmp} \item \LWenv{extcolorbox} \item \LWenv{extikzpicture} \item \LWenv{VerbatimOut} \item \LWenv{verbatimwrite} \item \LWenv{filecontentsdef} \item \LWenv{filecontentshere} \item \LWenv{filecontentsdefmacro} \item \LWenv{filecontentsdefstarred} \item \LWenv{filecontentsgdef} \item \LWenv{filecontentsdefmacro} \item \LWenv{filecontentsgdefmacro} \end{itemize} \end{multicols} They are automatically detected \meta{verbatim write} (including \texttt{\small\bfseries\textcolor{MediumOrchid}{*}} argument) environments generates by commands: \begin{itemize}[font=\sffamily\small, first=\small, noitemsep,leftmargin=*] \item \ics{renewtcbexternalizetcolorbox} \item \ics{renewtcbexternalizeenvironment} \item \ics{newtcbexternalizeenvironment} \item \ics{newtcbexternalizetcolorbox} \item \ics{newenvsc} \end{itemize} If any of the \meta{verbatim write} environments is not supported by default or can not detected, you can use the options described in \ref{sec:optline} and \ref{sec:optfile}. \subsection{Steps process} \label{sec:steps:process} For creation of the image formats, extraction of source code of environments and creation of an \meta[cf=optcolor]{output file}, \ltximg{} need a various steps. Let's assume that the % \meta[cf=optcolor]{input file} is \sysfile{test.tex}, \meta[cf=optcolor]{output file} is % \sysfile{test-out.tex}, the working directory are \enquote{\sysdir{./}}, the directory for images are \sysdir{./images}, the temporary directory is \sysdir{/tmp} and we want to generate images in \iext{pdf} format and \meta{standalone} files for all environments extracted. We will use the following code as \sysfile{test.tex}: \begin{examplecode}[numbers=left,frame=single] % Some commented lines at begin file \documentclass{article} \usepackage{tikz} \begin{document} Some text \begin{tikzpicture} Some code \end{tikzpicture} Always use \verb|\begin{tikzpicture}| and \verb|\end{tikzpicture}| to open and close environment \begin{tikzpicture} Some code \end{tikzpicture} Some text \begin{verbatim} \begin{tikzpicture} Some code \end{tikzpicture} \end{verbatim} Some text \end{document} Some lines that will be ignored by the script \end{examplecode} \subsection*{Validating Options} The first step is read and validated \oarg[type=tt,cf=optcolor,sbc=gray,ac=lightgray]{options} from the command line and \sysfile{test.tex}, verifying that \sysfile{test.tex} contains \emph{some} environment to extract, check the name and extension of \sysfile{test-out.tex}, check the directory \sysdir{./images} if it doesn't exist create it and create a temporary directory \sysdir{/tmp/hG45uVklv9}. The entire \sysfile{test.tex} file is loaded into memory and \emph{\enquote{split}} to start the extraction process. \subsection*{Comment and ignore} In the second step, once the file \sysfile{test.tex} is loaded and divided in memory, proceeds (in general terms) as follows: \begin{quotation} Search the words \lstinline|\begin{| and \lstinline|\end{| in verbatim standard, verbatim write, verbatim in line and commented lines, if it finds them, converts to \lstinline|\BEGIN{| and \lstinline|\END{|, then places all code to extract inside the \lstinline|\begin{preview}| \ldots \lstinline|\end{preview}|. \end{quotation} At this point \emph{\enquote{all}} the code you want to extract is inside \lstinline|\begin{preview}|\ldots\lstinline|\end{preview}|. \subsection*{Creating files and extracting} In the third step, the script generate \meta{standalone} files: \sysfile{test-fig-1.tex}, \sysfile{test-fig-2.tex}, \dots{} and saved in \sysdir{./images} then proceed in two ways according to the \oarg[type=tt,cf=optcolor,sbc=gray,ac=lightgray]{options} passed to generate a temporary file with a random number (1981 for example): \begin{enumerate}[leftmargin=*] \item If script is call \emph{without} \cmdopt{noprew} options, the following lines will be added at the beginning of the \sysfile{test.tex} (in memory): \begin{examplecode} \PassOptionsToPackage{inactive}{pst-pdf}% \AtBeginDocument{% \RequirePackage[inactive]{pst-pdf}% \RequirePackage[active,tightpage]{preview}% \renewcommand\PreviewBbAdjust{-60pt -60pt 60pt 60pt}}% % rest of input file \end{examplecode} The different parts of the file read in memory are joined and save in a temporary file \sysfile{test-fig-1981.tex} in \enquote{\sysdir{./}}. This file will contain all the environments for extraction between \lstinline|\begin{preview}|\ldots\lstinline|\end{preview}| along with the rest of the document. If the document contains images, these must be in the formats supported by the \emph{engine} selected to process the \meta{input file}. \item If script is call \emph{with} \cmdopt{noprew} options, the \lstinline|\begin{preview}|\ldots\lstinline|\end{preview}| lines are only used as delimiters for extracting the content \emph{without} using the package \pkgname{preview}, the following lines will be added at the beginning of the \sysfile{test.tex} (in memory): \begin{examplecode} \PassOptionsToPackage{inactive}{pst-pdf}% \AtBeginDocument{% \RequirePackage[inactive]{pst-pdf}}% % only environments extracted \end{examplecode} Then it is joined with all extracted environments separated by \ics{newpage} and saved in a temporary file \sysfile{test-fig-1981.tex} in \enquote{\sysdir{./}}. \end{enumerate} If \cmdopt{norun} is passed, the temporary file \sysfile{test-fig-1981.tex} is renamed to \sysfile{test-fig-all.tex} and moved to \sysdir{./images}. \subsection*{Generate image formats} In the fourth step, the script generating the file \sysfile{test-fig-1981.pdf} with all code extracted and croping, running: \begin{examplecmd} [user@machine ~:]§ `\small\meta[type=tt,cf=ForestGreen,ac=lightgray]{compiler}` -no-shell-escape -interaction=nonstopmode -recorder test-fig-1981.tex [user@machine ~:]§ pdfcrop --margins `\small\textcolor{gray}{0}` test-fig-1981.pdf test-fig-1981.pdf \end{examplecmd} Now move \sysfile{test-fig-1981.pdf} to \sysdir{/tmp/hG45uVklv9} and rename to \sysfile{test-fig-all.pdf}, generate image files \sysfile{test-fig-1.pdf} and \sysfile{test-fig-2.pdf} and copy to \sysdir{./images}, if the image files exist, they will be rewritten each time you run the script. The file \sysfile{test-fig-1981.tex} is moved to the \sysdir{./images} and rename to \sysfile{test-fig-all.tex}. Note the options passed to \meta[type=tt,cf=ForestGreen,ac=lightgray]{compiler} always use \prgopt*{no-shell-escape} and \prgopt*{recorder} to generate the \fext{fls} file which is used to delete temporary files and directories after the process is completed. The \cmdopt{shell} option activates \prgopt*{shell-escape} or \prgopt*{enable-write18} in \hologo{MiKTeX} for compatibility with packages such as \pkgname{minted} or others. \subsection*{Create output file} In the fifth step, the script apply the option \cmdopt{clean}, remove all content betwen \lstinline|%<*remove> ... %| and try to detect whether the \pkgname{graphicx} package and the \ics{graphicspath} command are in the preamble of the \meta[cf=optcolor]{output file} (in memory). If it is not possible to find it, it will read the \fext{log} file generated by the temporary file with only preamble. Once the detection is complete, the package \pkgname{grfext} and \ics*{PrependGraphicsExtensions*} will be added at the end of the preamble: \begin{examplecode}[numbers=left] \usepackage{graphicx} \graphicspath{{images/}} \usepackage{grfext} \PrependGraphicsExtensions*{.pdf} \end{examplecode} Now converting all extracted code to \ics{includegraphics} and save \sysfile{test-out.tex} in \enquote{\sysdir{./}}, then proceed to run: \begin{examplecmd} [user@machine ~:]§ `\small\meta[type=tt,cf=ForestGreen,ac=lightgray]{compiler}` -recorder -no-shell-escape test-out.tex \end{examplecmd} generating the file \sysfile{test-out.pdf}. \subsection*{Clean temporary files and dirs} In the sixth step, the script read the files \sysfile{test-fig-1981.fls} and \sysfile{test-out.fls}, extract the information from the temporary files and dirs generated in the process in \enquote{\sysdir{./}} and then delete them together with the directory \sysdir{/tmp/hG45uVklv9}. Finally the output file \sysfile{test-out.tex} looks like this: \begin{examplecode}[numbers=left] % some commented lines at begin document \documentclass{article} \usepackage{tikz} \graphicspath{{images/}} \usepackage{grfext} \PrependGraphicsExtensions*{.pdf} \begin{document} Some text \includegraphics[scale=1]{test-fig-1} Always use \verb|\begin{tikzpicture}| and \verb|\end{tikzpicture}| to open and close environment \includegraphics[scale=1]{test-fig-2} Some text \begin{verbatim} \begin{tikzpicture} Some code \end{tikzpicture} \end{verbatim} Some text \end{document} \end{examplecode} \section{Extract content} \label{sec:extract} The script provides two ways to \meta{extract} content from \meta[cf=optcolor]{input file}, using \meta[type=rm,cf=optcolor,ac=gray]{environments} and \meta[type=rm,cf=optcolor,ac=gray]{docstrip tags}. Some environment (including \texttt{\small\bfseries\textcolor{MediumOrchid}{*}} argument) are supported by default. If environments are nested, the outermost one will be extracted. \subsection{Default environments} \label{sec:extract:env} \DescribeTE{preview} Environment provide by \pkgname{preview}\cite{preview} package. If any \env{preview} environments found in the \meta[cf=optcolor]{input file} will be extracted and converted these. Internally the script converts all environments to extract in \env{preview} environments. Is better comment this package in preamble unless the option \cmdopt[n]{noprew}{} is used. This environment is reserved for the internal process of extraction and conversion, it cannot be passed as an argument to the option \cmdopt{skipenv}. \vspace{0.25\baselineskip} \DescribeTE{postscript} Environment provide by \pkgname{pst-pdf}\cite{pst-pdf}, \pkgname{auto-pst-pdf}\cite{auto-pst-pdf} and \pkgname{auto-pst-pdf-lua}\cite{auto-pst-pdf-lua} packages. Since the \pkgname{pst-pdf}, \pkgname{auto-pst-pdf} and \pkgname{auto-pst-pdf-lua} packages internally use the \pkgname{preview} package, is better comment this in preamble. Only the \emph{content} of this environment is extracted and \emph{\enquote{not}} the environment itself when using the \cmdopt{srcenv}{} or \cmdopt{subenv}{} options. \vspace{0.25\baselineskip} \DescribeTE{PSTexample} Environment provide by \pkgname{pst-exa}\cite{pst-exa} packages. The script automatically detects the \lstinline|\begin{PSTexample}| \lstinline|...\end{PSTexample}| environments and processes them as separately compiled files. The user should have loaded the package with the [\pkgopt{swpl}] or [\pkgopt{tcb}] option and run the script using \cmdopt{latex}{} or \cmdopt{xetex}. This environment is reserved for the internal process of extraction and conversion, it cannot be passed as an argument to the option \cmdopt{skipenv}{}. \newpage \DescribeTE{pspicture} Environment provide by \pkgname{PStricks}\cite{pstricks} package. The plain \hologo{TeX} syntax \lstinline|\pspicture ... \endpspicture| its converted to \hologo{LaTeX} syntax \lstinline|\begin{pspicture} ... \end{pspicture}| if not within the \env{PSTexample} or \env{postscript} environments. \vspace{0.75\baselineskip} \DescribeTE{psgraph} Environment provide by \pkgname{pst-plot}\cite{pst-plot} package. The plain \hologo{TeX} syntax \lstinline|\psgraph ... \endpsgraph| its converted to \hologo{LaTeX} syntax \lstinline|\begin{psgraph} ... \end{psgraph}| if not within the \env{PSTexample} or \env{postscript} environments. \vspace{0.75\baselineskip} \DescribeTE{tikzpicture} Environment provide by \pkgname{TikZ}\cite{tikz} package. The plain \hologo{TeX} syntax \lstinline|\tikzpicture ... \tikzpicture| its converted to \hologo{LaTeX} syntax \lstinline|\begin{tikzpicture} ... \end{tikzpicture}| but no a short syntax \lstinline|\tikz ... ;|. \vspace{0.75\baselineskip} \DescribeTE{pgfpicture} Environment provide by \pkgname{pgf}\cite{tikz} package. Since the script uses a \emph{\enquote{recursive regular expression}} to extract environments, no presents problems if present \env{pgfinterruptpicture}. If you need to extract other environments you can use one of the options described in \ref{sec:optline} or \ref{sec:optfile}. \subsection{Extract with docstrip tags} \label{sec:extract:tag} \DescribeTE*{ltximg} All content included between \lstinline|%<*ltximg> ... %| is extracted. The tags can \emph{not} be nested and should be at the beginning of the line and in separate lines. Internally the script converts all this tags to \env{preview} environments. \begin{examplecode}[frame=single] % no space before open tag %<* %<*ltximg> code to extract % % no space before close tag % ... %| are ignored and no extract. The tags can \emph{not} be nested and should be at the beginning of the line and in separate lines. Internally the script converts all this tags to \env{nopreview} environments. \begin{examplecode}[frame=single] % no space before open tag %<* %<*noltximg> no extract this % % no space before close tag % ... %| are deleted in the \meta[cf=optcolor]{output file}. The tags can \emph{not} be nested and should be at the beginning of the line and in separate lines. \begin{examplecode}[frame=single] % no space before open tag %<* %<*remove> lines removed in output file % % no space before close tag % ... %|. Like this: \begin{examplecode}[numbers=left] %<*remove> % ltximg: options: { png, srcenv, xetex } % ltximg: extrenv: { description } % \end{examplecode} \subsection*{Passing options from input file} Adding the following lines to the beginning of the file \sysfile{file-in.tex}: \begin{examplecode}[numbers=left] % ltximg: options: { luatex, output = file-out, imgdir = pics, prefix = env } % ltximg: skipenv: { tikzpicture } % ltximg: deltenv: { filecontents } \end{examplecode} and run: \begin{examplecmd} [user@machine~:]§ ltximg file-in.tex \end{examplecmd} Create a \sysdir{./pics} directory (if it does not exist) with all extracted environments, except \env{tikzpicture}, converted to image formats (\iext{pdf}) in individual files, an output file \meta[ac=LightSlateGrey,cf=OrangeRed]{file-out.tex} with all extracted environments converted to \ics{includegraphics} and environment \LWenv{filecontents} removed, a single file \meta[ac=LightSlateGrey,cf=OrangeRed]{file-in-env-all.ltx} with \emph{only} the extracted environments using \prgname*{lualatex} and \pkgname{preview} package for process \meta[ac=LightSlateGrey,cf=OrangeRed]{file-in.tex} and \meta[ac=LightSlateGrey,cf=OrangeRed]{file-out.tex}. \section{The way of \texttt{arara}} \label{sec:arara} By design, \ltximg{} only runs \emph{\enquote{one or more compilation}} on top of the \meta[cf=optcolor]{input file}, but, sometimes you need to process in a specific mode the \meta[cf=optcolor]{input file} or needs to be processed with something other than \hologo{LaTeX}, \hologo{XeLaTeX}, \hologo{pdfLaTeX} or \hologo{LuaLaTeX} engine. This is where \arara\cite{arara} comes in, this \emph{\enquote{great little tool}}, is able to have complete control over the compilation of the \meta[cf=optcolor]{input file}, we just have to keep a few considerations in mind: \begin{enumerate}[font=\small, nosep, noitemsep,leftmargin=*] \item Read the documentation (this always comes first). \item Add \lstinline|{ options: [-recorder] }| to \enquote{rule} for clean temporary files. \item Avoiding the use of \lstinline|: clean: { extensions: [...] }|. \item Don't set \lstinline|-jobname| and \lstinline|-output-directory| in any \enquote{rule}. \end{enumerate} When the \cmdopt{arara} option is passed to the script, the line that runs in the system is: \begin{examplecmd} [user@machine~:]§ `\small\prgname{arara}` --log file.tex \end{examplecmd} If you have several \enquote{rules} within the file they will all be executed, to avoid this we must add: \begin{examplecode}[numbers=left] % arara: halt \end{examplecode} After the last \enquote{rule} you have at the beginning of the file. With all these considerations in mind it is possible to extract and convert environments from \emph{any file}. For example, by adding these lines at the beginning of the file: \begin{examplecode}[numbers=left] % arara: lualatex: { options: [-recorder] } % arara: lualatex: { options: [-recorder] } %<*remove> % ltximg: options: { arara, output = file-out, prefix = tkz} % \end{examplecode} and run: \begin{examplecmd} [user@machine~:]§ ltximg test.tex \end{examplecmd} Create a \sysdir{./images} directory (if it does not exist) with all extracted environments converted to image format (\iext{pdf}) in individual files, an output file \meta[ac=LightSlateGrey,cf=OrangeRed]{file-out.tex} with all exatracted environments converted to \ics{includegraphics}, a single file \meta[ac=LightSlateGrey,cf=OrangeRed]{test-tkz-all.tex} with only the extracted environments using \pkgname{preview} package and \prgname*{lualatex} \emph{\enquote{two times}} for process \meta[ac=LightSlateGrey,cf=OrangeRed]{test.tex} and \meta[ac=LightSlateGrey,cf=OrangeRed]{file-out.tex}. Remember that the \meta[cf=optcolor]{input file} and \meta[cf=optcolor]{output file} will be compiled using the same \enquote{rule}. One \emph{trick} to get around this situation is to use: \begin{examplecode}[numbers=left] %<*remove> % arara: lualatex: { options: [-recorder] } % arara: lualatex: { options: [-recorder] } % arara: halt % ltximg: options: { arara, output = file-out, prefix = tkz} % % arara: xelatex: { options: [-recorder] } % arara: xelatex: { options: [-recorder] } \end{examplecode} The content betwen \lstinline|%<*remove> ... %| are remove from output file before compiling. Thus, the output file \meta[ac=LightSlateGrey,cf=OrangeRed]{file-out.tex} will be compiled using \prgname*{xelatex} \emph{\enquote{two times}}. As a final consideration, \ltximg{} passes options to the \pkgname{preview} package and the \scriptname{pdfcrop} script according to the engine used. When using \cmdopt{arara} it will \emph{\enquote{try}} to detect the used engine by means of a regular expression, if the detection fails the default values will be used. This does not affect the process of creating \meta{standalone} files and can be prevented by using \cmdopt{noprew} or \cmdopt{nocrop} at the cost of not having the images cropped. In this way we can \meta{compile} and \meta{convert} any document as long as the conditions of the \meta[cf=optcolor]{input file} are met and the correct \enquote{rule} are used. \section{Note for \texttt{dvisvgm} users} \label{sec:dvisvgm} By design, the image format \iext{svg} is created using \prgname{pdftocairo} over the generated \iext{pdf} file, but, if you want to have a good \iext{svg} files that preserve our \emph{typographic} fonts it is best to use \prgname{dvisvgm}\footnote{\url{https://ctan.org/pkg/dvisvgm}}. The best results of \prgname{dvisvgm}\cite{dvisvgm} are obtained when processing the file in \fext{dvi} or \fext{xdv} format, there are two possible ways to do this: \begin{enumerate}[font=\small, nosep, noitemsep,leftmargin=*] \item Execute the script using \cmdopt{subenv}{} and \cmdopt{norun}{} to generate \meta{standalone} files, move to \sysdir{./images} and generate \fext{dvi} or \fext{xdv} files, then runing: \begin{examplecmd} [user@machine~:]§ for i in *.tex; do `\meta[type=tt,cf=ForestGreen,ac=lightgray]{compiler} \oarg[type=tt,cf=gray,sbc=optcolor,ac=gray]{options}` §i;done [user@machine~:]§ for i in *.dvi; do `\small\prgname{dvisvgm} \oarg[type=tt,cf=gray,sbc=optcolor,ac=gray]{options}` §i;done \end{examplecmd} \item Execute the script using \cmdopt{norun}{}, move to \sysdir{./images} and generate \fext{dvi} or \fext{xdv} file, then runing: \begin{examplecmd} [user@machine~:]§ `\meta[type=tt,cf=ForestGreen,ac=lightgray]{compiler} \oarg[type=tt,cf=gray,sbc=optcolor,ac=gray]{options}` test-fig-all.tex [user@machine~:]§ `\small\prgname{dvisvgm} \oarg[type=tt,cf=gray,sbc=optcolor,ac=gray]{options}` test-fig-all.dvi \end{examplecmd} \end{enumerate} \section{Example usign \texttt{latexmk}} If you are a user of \scriptname{latexmk}, another great utility that automates the compilation process, you must keep in mind that this will run only in the \meta{output file}. Consider the following example adapted from \href{https://tex.stackexchange.com/a/209059}{How to get tikzmark to work} and \href{https://tex.stackexchange.com/a/114847}{Draw an aircraft with Tikz} to generate an image in \iext{svg}, \iext{png} and \iext{pdf} format from environment \env{picture} using \prgname*{lualatex} and \scriptname{latexmk}. \begin{examplecode}[numbers=left] %<*remove> % ltximg: extrenv: {picture} % ltximg: skipenv: {tikzpicture} % \documentclass{article} \usepackage{tikz} \usetikzlibrary{calc,tikzmark} \setlength{\parindent}{0pt} \begin{document} \section{How to get Tikzmark to work} By taking logarithms of both sides: \[ t = \frac{30\cdot\ln(3/22)}{\ln(15/22)} \tikzmark{calculator}\approx\tikzmark{otherside} 156 \] \begin{tikzpicture}[overlay,remember picture] \coordinate (target) at ($(pic cs:calculator)!1/2!(pic cs:otherside) - (0,.5ex)$); \draw[arrows=->] (target) ++(0,-2ex) node [anchor=north] {use calculator} -- (target); \end{tikzpicture} \section{Draw an aircraft with Tikz} The best airplane ever drawn by David Carlise. No TikZ used, just the classic and perhaps forgotten \verb|\begin{picture} ... \end{picture}|. \begin{picture}(200,100) \put(30,40){\line(1,0){150}} \put(30,40){\line(0,1){60}} \put(30,100){\line(1,0){20}} \put(50,100){\line(1,-4){10}} \put(60,60){\line(1,0){100}} \put(160,60){\line(1,-1){20}} \put(100,50){\line(0,-1){80}} \put(130,50){\line(0,-1){80}} \put(100,-30){\line(1,0){30}} \put(100,61){\line(0,1){49}} \put(130,61){\line(0,1){49}} \put(100,110){\line(1,0){30}} \end{picture} \end{document} \end{examplecode} We now run: \begin{examplecmd} [user@machine~:]§ ltximg --luatex --latexmk --svg --png -o file-out file-in.tex \end{examplecmd} Create a \sysdir{./images} directory (if it does not exist) with all \env{picture} environments, except \env{tikzpicture}, converted to image formats (\iext{svg}, \iext{png}, \iext{pdf}), an output file \meta[ac=LightSlateGrey,cf=OrangeRed]{file-out.tex} with all \env{picture} environments converted to \ics{includegraphics}, a single file \meta[ac=LightSlateGrey,cf=OrangeRed]{file-in-fig-all.ltx} with only environments \env{picture} extracted using \prgname*{lualatex} and \pkgname{preview} package for process \meta[ac=LightSlateGrey,cf=OrangeRed]{file-in.tex} and \scriptname{latexmk} for \emph{full} process \meta[ac=LightSlateGrey,cf=OrangeRed]{file-out.tex}. \newpage \section{Final notes} The process and operations required to generate the various types of \meta{image formats} or \meta{standalone} files have been described throughout the documentation, but, as discussed in section \ref{sec:arara}, sometimes the requirements are a \emph{little different}. This is the best way to extend the capabilities of the \ltximg{}. Although many tasks can be \emph{automated}, in the end only the user knows what the document contains and how it should be generated. Finding the correct \emph{\enquote{regular expressions}} and writing a \emph{\enquote{good documentation}} would be the great mission (which does not end yet). \section{Change history} \label{sec:change:history} The most recent publicly released of \ltximg{} is available at \textsc{ctan}: \url{https://www.ctan.org/pkg/ltximg}. Historical and developmental versions are available at \textcolor{gray}{\scriptsize\faIcon[regular]{github}} \url{https://github.com/pablgonz/ltximg}. While general feedback via email is welcomed, specific bugs or feature requests should be reported through the issue tracker: \url{https://github.com/pablgonz/ltximg/issues}. This is a short list of some of the notable changes in the history of the \ltximg{} along with the versions, both development (devp) and public (ctan). \setlength{\columnsep}{30pt} \begin{multicols}{2} \setlist[itemize,1]{label=\textendash,nosep,noitemsep,leftmargin=-10pt} \begin{description}[font=\small\sffamily,style=nextline,nosep,noitemsep] \item [v\fileversion\ (ctan), \filedate] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Maintenance update. \item Fix internal \texttt{hash} for regex. \end{itemize} \item [v2.0 (ctan), 2021-01-24] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Add \texttt{-dALLOWPSTRANSPARENCY} to \texttt{ps2pdf}. \item The \texttt{--xetex} option now uses \texttt{xelatex} and then \texttt{xdvipdfmx}. \item Fix module detection under \hologo{TeX} Live on Windows. \item Add \texttt{POD} and \texttt{man} documentation. \end{itemize} \item [v1.9 (ctan), 2020-08-22] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Fix \texttt{graphicx} detection. \item Fix typos in documentation. \item Add more contents to \texttt{.log} file. \end{itemize} \item [v1.8 (ctan), 2020-08-18] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item It is now possible to extract any environment. \item Add \texttt{--log}, \texttt{--runs}, \texttt{--latexmk} and \texttt{--dvilua} options. \item All calls to the system are captured. \item Re-write source code acording to \texttt{Perl} v5.3x. \item Review of documentation. \end{itemize} \item [v1.7 (ctan), 2019-08-24] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Add \texttt{scontents} environment support. \item Add \texttt{filecontentsdefmacro} environment support. \item Fix regex in source code. \item Update documentation. \end{itemize} \item [v1.6 (ctan), 2019-07-13] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Add \texttt{--zip} and \texttt{--tar} options. \item Add new \texttt{Verb} from \texttt{fvextra}. \item Fix and update source code and documentation. \end{itemize} \item [v1.5 (ctan), 2018-04-12] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Use \texttt{GitHub} to control version. \item Rewrite and optimize code and options. \item Change \texttt{pdf2svg} for \texttt{pdftocairo}. \item Complete support for \texttt{pst-exa} package. \item Escape characters in regex according to \texttt{Perl} v5.2x. \end{itemize} \item [v1.4 (devp), 2016-11-29] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Remove and rewrite code for regex and system call. \item Add \texttt{--arara} compiler, clean and comment code. \item Add \texttt{--dvips} and \texttt{--dvipdfm(x)} for creation images. \item Add \texttt{bmp}, \texttt{tiff} image format. \end{itemize} \item [v1.3 (devp), 2016-08-14] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Rewrite some part of code (norun, nocrop, clean). \item Suport \texttt{minted} and \texttt{tcolorbox} package. \item Escape some characters in regex according to \texttt{Perl} v5.2x. \item All options read from command line and input file. \item Use \texttt{/tmp} dir for work process. \end{itemize} \item [v1.2 (ctan), 2015-04-22] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Remove unused modules. \item Add more image format. \item Fix regex. \end{itemize} \item [v1.1 (ctan), 2015-04-21] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item Change \texttt{mogrify} to \texttt{gs} for image formats. \item Create output file. \item Rewrite source code and fix regex. \item Change format date to iso format. \end{itemize} \item [v1.0 (ctan), 2013-12-01] \leavevmode\vspace{-\baselineskip} \begin{itemize} \item First public release. \end{itemize} \end{description} \end{multicols} \newpage \let\stdsection\section \def\section*#1{\stdsection{#1}} \begin{thebibliography}{9} \bibitem{preview} \textsc{Kastrup, David}. \enquote{The \textsf{preview} package for \hologo{LaTeX}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/preview}, 2017. \bibitem{tikz} \textsc{Tantau, Till}. \enquote{The \textsf{TikZ} and \textsf{PGF} Packages}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/pgf}, 2020. \bibitem{pstricks} \textsc{Van Zandt, Timothy}. \enquote{\textsf{PSTricks} - \textsf{PostScript} macros for generic \hologo{TeX}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/pstricks-base}, 2007. \bibitem{pst-plot} \textsc{Van Zandt, Timothy}. \enquote{\textsf{pst-plot} – Plot data using \textsf{PSTricks}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/pst-plot}, 2019. \bibitem{pst-pdf} \textsc{Niepraschk, Rolf}. \enquote{The \textsf{pst-pdf} Packages}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/pst-pdf}, 2019. \bibitem{auto-pst-pdf} \textsc{Robertson, Will}. \enquote{The \textsf{auto-pst-pdf} Packages}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/auto-pst-pdf}, 2009. \bibitem{auto-pst-pdf-lua} \textsc{Voß, Herbert}. \enquote{\textsf{auto-pst-pdf-lua} - Using \hologo{LuaLaTeX} with \textsf{PSTricks}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/auto-pst-pdf-lua}, 2018. \bibitem{pst-exa} \textsc{Voß, Herbert}. \enquote{\textsf{pst-exa} - Typeset \textsf{PSTricks} examples, with \hologo{pdfTeX}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/pst-exa}, 2017. \bibitem{pst2pdf} \textsc{Voß, Herbert}. \enquote{\textsf{pst2pdf} - A script to compile \textsf{PSTricks} documents via \hologo{pdfTeX}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/pst2pdf}, 2017. \bibitem{graphicx} \textsc{The \hologo{LaTeX3} Project}. \enquote{\textsf{graphics} – Enhanced support for graphics}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/graphicx}, 2017. \bibitem{grfext} \textsc{Oberdiek, Heiko}. \enquote{The \textsf{grfext} package}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/grfext}, 2019. \bibitem{xcomment} \textsc{Van Zandt, Timothy}. \enquote{The \textsf{xcomment} package}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/xcomment}, 2010. \bibitem{extract} \textsc{Adriaens, Hendri}. \enquote{The \textsf{extract} package}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/extract}, 2019. \bibitem{cachepic} \textsc{Trzeciak, Tomasz M}. \enquote{The \textsf{cachepic} package}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/cachepic}, 2009. \bibitem{doc} \textsc{Mittelbach, Frank}. \enquote{The \textsf{doc} and \textsf{shortvrb} Packages}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/doc}, 2020. \bibitem{fancyvrb} \textsc{Van Zandt, Timothy}. \enquote{The \textsf{fancyvrb} package - Fancy Verbatims in \hologo{LaTeX}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/fancyvrb}, 2020. \bibitem{listings} \textsc{Hoffmann, Jobst}. \enquote{The \textsf{listings} package}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/listings}, 2020. \bibitem{minted} \textsc{Poore, Geoffrey M}. \enquote{The \textsf{minted} package - Highlighted source code in \hologo{LaTeX}}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/minted}, 2017. \bibitem{arara} \textsc{The Island of \hologo{TeX}}. \enquote{\textsf{arara} - The cool \hologo{TeX} automation tool}. Available from \textsc{ctan}, \url{https://www.ctan.org/pkg/arara}, 2020. \bibitem{dvisvgm} \textsc{Gieseking, Martin}. \enquote{\textsf{dvisvgm} - A fast \textsf{DVI} to \textsf{SVG} converter}. Available from \textsc{ctan}, \url{https://ctan.org/pkg/dvisvgm}, 2020. \end{thebibliography} \let\section\stdsection \addtocontents{toc}{\protect\setcounter{tocdepth}{2}} \cleardoublepage \phantomsection \indexprologue{ The italic numbers denote the pages where the corresponding entry is described.} \printindex \end{document}