%% This is file `hvextern.sty', %% %% Copyright (C) 2016-22 %% Herbert Voss %% %% It may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3c or later is part of all distributions of LaTeX %% version 2005/12/01 or later. \def\hvexternFileversion{0.19} \ProvidesFile{hvextern}[2022/04/23 v\hvexternFileversion: package for running external documents (HV)] \RequirePackage{shellesc,xkeyval,graphicx,marginnote,fancyvrb,tikz,listings,ifplatform} \RequirePackage{tcolorbox} \tcbuselibrary{skins,breakable} \ifwindows \def\hv@move{move }% \def\hv@rm{del }% \else \def\hv@move{mv } \def\hv@rm{rm } \fi \newcounter{hv@extern@runs} \newcounter{@@@runs} \newsavebox\hv@extern@box \newlength\LineWidth \AtBeginDocument{\setlength\LineWidth{\dimexpr\linewidth-2\fboxsep-2\fboxrule}} \newlength\hv@extern@mpwidth \setlength\hv@extern@mpwidth{\z@} \define@key{hv}{progpath}{\def\hv@extern@progpath{#1}} \define@key{hv}{runsequence}[]{\def\hv@extern@runsequence{#1}} \define@key{hv}{runs}[1]{\setcounter{hv@extern@runs}{#1}} \define@key{hv}{grfOptions}[]{\def\hv@extern@grfOptions{#1}} \define@key{hv}{lstOptions}[]{\def\hv@extern@lstOptions{#1}} \define@key{hv}{BGpreamble}[black!12]{\def\hv@extern@BGpreamble{#1}} \define@key{hv}{BGbody}[black!8]{\def\hv@extern@BGbody{#1}} \define@key{hv}{BOpreamble}[black!12]{\def\hv@extern@BOpreamble{#1}} \define@key{hv}{BObody}[black!8]{\def\hv@extern@BObody{#1}} \define@key{hv}{docType}[latex]{\def\hv@extern@docType{#1}} \define@key{hv}{caption}[]{\def\hv@extern@caption{#1}} \define@key{hv}{label}[]{\def\hv@extern@label{#1}} \define@key{hv}{pages}[1]{\def\hv@extern@pages{#1}} \define@key{hv}{cropmargin}[2]{\def\hv@extern@cropmargin{#1 }} \define@key{hv}{mpwidth}[0pt]{\setlength\hv@extern@mpwidth{#1}} \define@key{hv}{ext}[tex]{\def\hv@extern@ext{.#1}} \define@boolkey{hv}[hv@extern@]{usefancyvrb}[true]{} \define@boolkey{hv}[hv@extern@]{showFilename}[true]{} \define@boolkey{hv}[hv@extern@]{code}[true]{} \define@boolkey{hv}[hv@extern@]{force}[true]{} \define@boolkey{hv}[hv@extern@]{crop}[true]{} \define@boolkey{hv}[hv@extern@]{biber}[true]{} \define@boolkey{hv}[hv@extern@]{xindex}[true]{} \define@key{hv}{xindexOptions}[]{\def\hv@extern@xindexOptions{#1}} \define@boolkey{hv}[hv@extern@]{includegraphic}[true]{} \define@boolkey{hv}[hv@extern@]{inline}[true]{\hv@extern@codefalse} \define@boolkey{hv}[hv@extern@]{frame}[true]{} \define@boolkey{hv}[hv@extern@]{float}[true]{} %\define@boolkey{hv}[hv@extern@]{cleanup}[true]{} \define@key{hv}{cleanup}[{aux,log}]{\def\hv@extern@cleanup{#1}}% \define@boolkey{hv}[hv@extern@]{moveToExampleDir}[true]{} \define@key{hv}{align}[\centering]{\def\hv@extern@align{#1}} \define@key{hv}{ExampleDir}[Examples]{% \ifhv@extern@moveToExampleDir \def\hv@extern@ExamplesDir{#1/}% \else \def\hv@extern@ExamplesDir{}% \fi } \define@boolkey{hv}[hv@extern@]{eps}[true]{} \define@boolkey{hv}[hv@extern@]{verbose}[true]{} \def\hv@typeout#1{\ifhv@extern@verbose\typeout{#1}\fi} %\define@key{hv}{compiler}[pdflatex]{\def\hv@extern@compiler{#1}} \define@choicekey*+{hv}{compiler}[\val\nr]{mpost,tex,latex,luatex,python3,perl,lua,xetex,pdflatex,lualatex,xelatex,context}[pdflatex]{% % \hv@typeout{>>>> Compiler type \nr}% \def\hv@extern@compiler{\val}% \edef\hv@extern@compilerNo{\nr}% }{\PackageWarning{hvextern}{erroneous input (#1) for compiler ignored. Using pdflatex.}% \def\hv@extern@compiler{pdflatex}% \def\hv@extern@compilerNo{6}% } \def\ResetKeys{% \setkeys{hv}{ showFilename=false,% Dateinamen im Rand angeben ext=tex,% file extension code=false,% show Code crop=false,% erzeugte PDF "croppen" compiler=pdflatex,% zu verwendener Compiler grfOptions={},% Optionen der einzubindenden Grafik lstOptions={},% Optionen für das Listing BGpreamble=black!12,% Backgroundcolor for preamble BGbody=black!8,% Backgroundcolor for body BOpreamble=black!12,% Bodercolor for preamble BObody=black!8,% Bodercolor for body includegraphic=true,% Grafik einbinden oder User überlassen inline=false,% Grafik nicht in derselben Zeile runs=1,% Anzahl Compiler-Durchläufe runsequence={},% Im Moment nicht aktiv biber=false,% Biber laufen lassen? xindex=false,% xindex laufen lassen? xindexOptions={},% options for xindex force=false,% Compiler, auch wenn PDF existiert? frame=false,% keinen Rahmen um Abbildung float=false,% nicht als Gleitumgebung caption=,% keine Caption label=,% kein Label pages=1,% welche Seiten auszugeben sind docType=latex,% LaTeX example Code cleanup={},% Hilfsdateien nicht löschen moveToExampleDir=false,% Verschieben nach ExamplesDir ExampleDir=Examples,% Unterverzeichnis für Beispiele align=\centering,% Ausgabe zentrieren mpwidth=0pt,% no minipage usefancyvrb=false,% use VerbatimInput instead of listings progpath={}, cropmargin=2,% 2pb margin eps=false,% create an eps output? } } \ResetKeys {\catcode`\%=12 \catcode`\#=12 \gdef\perCent{%} \gdef\DoubleperCent{%%} \gdef\NumChar{#} \gdef\DoubleNumChar{##} } \def\run@hv@extern@cleanup#1{\expandafter\run@hv@extern@cleanup@i#1,\@nil} \def\run@hv@extern@cleanup@i#1,#2\@nil{% \def\hv@next{}% \ifx\relax#1\relax \else \hv@typeout{>>>> Delete file \hv@extern@ExamplesDir\hvExternDateiname.#1}% \ShellEscape{\hv@rm \hv@extern@ExamplesDir\hvExternDateiname.#1}% \ifx\relax#2\relax\else \def\hv@next{\run@hv@extern@cleanup@i#2,\@nil}% \fi \fi \hv@next } \lstset{belowskip=0pt,aboveskip=0pt}% global \tcbset{breakable,left=2pt,right=2pt,top=2pt,bottom=2pt,boxsep=0pt} \newcommand\PreambleVerbatim[2][]{\begin{tcolorbox}\VerbatimInput[#1]{#2}\end{tcolorbox}} \newcommand\BodyVerbatim[2][]{\begin{tcolorbox}\VerbatimInput[#1]{#2}\end{tcolorbox}} \newcommand\PreambleListing[2][]{\begin{tcolorbox}\expandafter\lstinputlisting\expandafter[#1]{#2}\end{tcolorbox}} \newcommand\BodyListing[2][]{\begin{tcolorbox}\expandafter\lstinputlisting\expandafter[#1]{#2}\end{tcolorbox}} \newcounter{hv@example@counter} \newcommand\extern@ExampleType[5]{% \@namedef{#1@initTextFancy}{\edef\FancyVerbStartString{#2}\edef\FancyVerbStopString{#3}}% text \@namedef{#1@initPreambleFancy}{\edef\FancyVerbStartString{#4}\edef\FancyVerbStopString{#5}}% code \@namedef{#1@initText}{linerange={#2}-{#3},includerangemarker=false}% text \@namedef{#1@initPreamble}{linerange={#4}-{#5},includerangemarker=false}% code }% ^^to prevent problems with lua comments \input{hvextern-mp.cfg} \input{hvextern-tex.cfg} \input{hvextern-latex.cfg} \input{hvextern-context.cfg} \input{hvextern-py.cfg} \input{hvextern-pl.cfg} \input{hvextern-lua.cfg} %% %% [#1]: Optionen #2: Dateiname %% \newenvironment{ErstelleGrafik}[2][]{% \xdef\hvExternDateiname{#2-\arabic{hv@example@counter}}% \setkeys{hv}{#1}% \begin \expandafter\IfFileExists\expandafter{\hv@extern@ExamplesDir\hvExternDateiname.pdf}{}{% \expandafter\IfFileExists\expandafter{\hv@extern@ExamplesDir\hvExternDateiname.png}{}{% \expandafter\IfFileExists\expandafter{\hv@extern@ExamplesDir\hvExternDateiname.txt}{}{% \global\hv@extern@forcetrue}}}% set force, if no pdf or png exists \begingroup \hv@typeout{>>> writing file \hvExternDateiname\hv@extern@ext ...}% \filecontents[force,noheader]{\hvExternDateiname\hv@extern@ext} } {\endfilecontents% \end \hv@typeout{>>> ... done}% \global\stepcounter{hv@example@counter}% \endgroup \ifhv@extern@force \hv@typeout{>>> force=true: running \hv@extern@progpath\hv@extern@compiler~ \hvExternDateiname\hv@extern@ext ...}% \setcounter{@@@runs}{\value{hv@extern@runs}}% \loop\ifnum\the@@@runs > 0\relax \ifcase\hv@extern@compilerNo \relax % we have metapost \hv@typeout{>>>> running mpost \hvExternDateiname\hv@extern@ext}% \hv@extern@runMP{\hv@extern@progpath}{\hv@extern@compiler}{\hvExternDateiname}{\hv@extern@ext}% \or %1 \hv@typeout{>>>> running tex \hvExternDateiname\hv@extern@ext}% \hv@extern@runTEX{\hv@extern@progpath}{\hv@extern@compiler}{\hvExternDateiname}{\hv@extern@ext}% \or %2 \hv@typeout{>>>> running \hv@extern@compiler~ \hvExternDateiname\hv@extern@ext}% \hv@extern@runLATEX{\hv@extern@progpath}{\hv@extern@compiler}{\hvExternDateiname}{\hv@extern@ext}% \else \hv@typeout{>>>> running \hv@extern@compiler~ \hvExternDateiname\hv@extern@ext}% \ShellEscape{\hv@extern@progpath\hv@extern@compiler\space\hvExternDateiname\hv@extern@ext}% \fi \addtocounter{@@@runs}{-1}% \repeat \hv@typeout{>>> ... done}% \ifhv@extern@biber \ShellEscape{biber \hvExternDateiname}% NAch biber nochmal latex \ShellEscape{\hv@extern@progpath\hv@extern@compiler\space\hvExternDateiname}% \fi \ifhv@extern@xindex \ShellEscape{xindex \hv@extern@xindexOptions\space \hvExternDateiname.idx}% NAch xindex nochmal latex \ShellEscape{\hv@extern@progpath\hv@extern@compiler\space\hvExternDateiname}% \fi \ifhv@extern@crop \ShellEscape{pdfcrop --margins \hv@extern@cropmargin \hvExternDateiname}% \ShellEscape{\hv@move \hvExternDateiname-crop.pdf \hvExternDateiname.pdf}% \fi \ifhv@extern@eps \ShellEscape{pdftops -eps -f 1 -l 1 \hvExternDateiname.pdf}% \fi \fi \ifhv@extern@code%-------------- Code Part \par\noindent \begingroup \ifdim\hv@extern@mpwidth>\z@ \minipage[t]{\hv@extern@mpwidth}\vspace{0pt}\fi \ifhv@extern@usefancyvrb \@nameuse{\hv@extern@docType @initPreambleFancy}% \edef\@@@temp{\@nameuse{\hv@extern@docType @initPreamble}}% % we need lstinputlisting, because \VerbatimInput doesn't work in a box \savebox\hv@extern@box{\expandafter\lstinputlisting\expandafter[\@@@temp]{\hvExternDateiname\hv@extern@ext}}% % \savebox\hv@extern@box{\VerbatimInput{\hvExternDateiname\hv@extern@ext}}% \ifdim\wd\hv@extern@box > \z@ \expandafter\fvset\expandafter{\hv@extern@lstOptions}% \tcbset{colback=\hv@extern@BGpreamble,colframe=\hv@extern@BOpreamble}% \PreambleVerbatim{\hvExternDateiname\hv@extern@ext}% \fi \else \edef\@@@temp{\@nameuse{\hv@extern@docType @initPreamble}}% \savebox\hv@extern@box{\expandafter\lstinputlisting\expandafter[\@@@temp]{\hvExternDateiname\hv@extern@ext}}% \ifdim\wd\hv@extern@box>\z@ \expandafter\lstset\expandafter{\hv@extern@lstOptions}% \tcbset{colback=\hv@extern@BGpreamble,colframe=\hv@extern@BOpreamble}% \PreambleListing[\@@@temp]{\hvExternDateiname\hv@extern@ext}% \fi \fi \ifhv@extern@showFilename \marginnote{\rotatebox{90}{\hvExternDateiname\hv@extern@ext}}%[-15mm]% \fi % \ifhv@extern@usefancyvrb \@nameuse{\hv@extern@docType @initTextFancy}% \expandafter\fvset\expandafter{\hv@extern@lstOptions}% \tcbset{colback=\hv@extern@BGbody,colframe=\hv@extern@BObody}% \expandafter\BodyVerbatim\expandafter[\hv@extern@lstOptions]{\hvExternDateiname\hv@extern@ext}% \else \expandafter\lstset\expandafter{\hv@extern@lstOptions}% \edef\@@@temp{\@nameuse{\hv@extern@docType @initText}}% \tcbset{colback=\hv@extern@BGbody,colframe=\hv@extern@BObody}% \BodyListing[\@@@temp]{\hvExternDateiname\hv@extern@ext}% \fi \ifdim\hv@extern@mpwidth > \z@\relax \endminipage\fi \endgroup \fi \ifhv@extern@code\else \ifhv@extern@showFilename \marginnote{\rotatebox{90}{\hvExternDateiname}}% \fi \fi \ifhv@extern@moveToExampleDir % \ShellEscape{mkdir\space\hv@extern@ExamplesDir/}% \ShellEscape{\hv@move \hvExternDateiname.*\space \hv@extern@ExamplesDir}% \fi \ifhv@extern@includegraphic \ifhv@extern@inline \expandafter\includegraphics\expandafter[\hv@extern@grfOptions]{\hv@extern@ExamplesDir\hvExternDateiname}% \else \ifhv@extern@float \begin{figure}[!htb] \else \ifdim\hv@extern@mpwidth>\z@ \hfill\minipage[t]{\dimexpr\linewidth-\hv@extern@mpwidth-1em\relax}\vspace{0pt}% \else \par\noindent\begingroup \fi \fi \hv@extern@align \ifhv@extern@frame \expandafter\@for\expandafter\next\expandafter:\expandafter=\hv@extern@pages\do{% \fbox{\expandafter\includegraphics\expandafter[\hv@extern@grfOptions,page=\next]{\hv@extern@ExamplesDir\hvExternDateiname}}% \hspace{5pt}}\hspace*{-5pt}% \else \expandafter\@for\expandafter\next\expandafter:\expandafter=\hv@extern@pages\do{% \expandafter\includegraphics\expandafter[\hv@extern@grfOptions,page=\next]{\hv@extern@ExamplesDir\hvExternDateiname}% \hspace{5pt}}\hspace*{-5pt}% \fi \ifx\hv@extern@caption\@empty\else\caption{\hv@extern@caption}\fi \ifx\hv@extern@label\@empty\else\label{\hv@extern@label}\fi \ifhv@extern@float \end{figure}% \else \ifdim\hv@extern@mpwidth>\z@ \endminipage\else\par\endgroup\fi \fi \fi \else% no graphic, only text \ifdim\hv@extern@mpwidth>\z@ \hfill\minipage[t]{\dimexpr\linewidth-\hv@extern@mpwidth-1em\relax}\vspace{0pt} \noindent\VerbatimInput{\hv@extern@ExamplesDir\hvExternDateiname.txt} \endminipage \else \noindent\VerbatimInput{\hv@extern@ExamplesDir\hvExternDateiname.txt} \fi \fi \ifhv@extern@force\run@hv@extern@cleanup{\hv@extern@cleanup}\fi% cleanup } \stepcounter{hv@example@counter}% % \let\externalDocument\ErstelleGrafik \let\endexternalDocument\endErstelleGrafik %% \endinput