From 78170e6bcc86acb1b5eb74180efa9ed73c7b04ee Mon Sep 17 00:00:00 2001 From: nobody Date: Sat, 7 Dec 2024 07:13:08 +0100 Subject: [PATCH] current experimental state --- .gitignore | 3 + Makefile | 6 + README.md | 18 + cccbform.cls | 74 +- doku.tex | 113 ++ fvextra.sty | 3281 ++++++++++++++++++++++++++++++++++++++++++++++++++ mwe.tex | 49 + 7 files changed, 3516 insertions(+), 28 deletions(-) create mode 100644 README.md create mode 100644 doku.tex create mode 100644 fvextra.sty create mode 100644 mwe.tex diff --git a/.gitignore b/.gitignore index af8f103..2b22163 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ *.aux +*.hd *.log *.out +*.toc *.pdf +_minted-* *.fdb_latexmk *.fls diff --git a/Makefile b/Makefile index 3d6fd1e..5a7415b 100644 --- a/Makefile +++ b/Makefile @@ -12,5 +12,11 @@ clean: distclean: latexmk -C +mwe.pdf: mwe.tex + latexmk -pdflua -lualatex="lualatex --shell-escape %O %S" $< + +doku.pdf: doku.tex cccbform.cls logo.pdf + latexmk -pdflua -lualatex="lualatex --shell-escape %O %S" $< + %.pdf :: %.tex cccbform.cls logo.pdf latexmk -pdflua $< diff --git a/README.md b/README.md new file mode 100644 index 0000000..f61a206 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Formulare + +## Zutaten + + * Debian: texlive-base, latexmk, TODO + + relevant sind: luahbtex / lualatex, latexmk, sowie diverse Pakete (siehe .cls) + * Font: Recursive () als variable font gobal installiert + +## Kurzanleitung + + * `make` baut alles, neue `.tex`-Datei sollte automatisch gefunden werden + * im Zweifel ein bestehendes Dokument kopieren und anpassen, die meisten + Sachen sollten relativ einfach verständlich sein + * es gibt ein paar Sonderzeichen in TeX, die nicht einfach so verwendet + werden können; meist ist es ausreichend einen Backslash davor zu packen, + ansonsten sollte helfen + (das Ergebnis sollte ohne `\usepackage{…}` auskommen und `textmode` sein) + diff --git a/cccbform.cls b/cccbform.cls index 8d07295..2707fc9 100644 --- a/cccbform.cls +++ b/cccbform.cls @@ -1,14 +1,35 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesClass{cccbform}[2024-11-08 In the Beginning, There Was Chaos] +\NeedsTeXFormat{LaTeX2e}[2020/10/01] +\ProvidesClass{cccbform}[2024/12/08 In the Beginning, There Was Chaos] \LoadClass{scrartcl} -\RequirePackage{geometry, calc, xparse, xcolor, hyperref, tikz, tikzpagenodes, - fontspec, changepage, letltxmacro, textpos} +\RequirePackage{geometry, calc, fontspec, tikz, hyperref, changepage, letltxmacro} +\RequirePackage[ngerman]{babel} \usetikzlibrary{calc} +\geometry{a4paper, margin=1.5cm, inner=2.5cm} +\pagestyle{empty} + +% allow disabling PDF forms in case they cause printing problems +% (*most* viewers don't print them, so we need "fake" fields below them anyways… +% but some do, and always put the form field on top (even if explicitly placed +% below other elements), which then obscures the label text…) \newif\if@DoPdfForm \@DoPdfFormtrue \DeclareOption{noform}{\@DoPdfFormfalse} +\newif\if@Example +\@Examplefalse +\DeclareOption{example}{ % for embedded examples in the documentation + \geometry{a6paper, margin=1ex} + \@Exampletrue +} +\DeclareOption{shortexample}{ + \geometry{paperwidth=105mm, paperheight=74mm, margin=1ex} + \@Exampletrue + \AtEndDocument{% + \pageheight=\pagetotal + \advance\pageheight by 2ex + } +} \ProcessOptions\relax % address @@ -18,10 +39,6 @@ 10117~Berlin } -% page -\geometry{a4paper, margin=1.5cm, inner=2.5cm} -\pagestyle{empty} - \setmainfont[ Renderer=HarfBuzz, ItalicFont=Recursive, @@ -67,20 +84,6 @@ ItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=-15,CRSV=1,wght=500}}} ]{Recursive} -% fonts -% cmr: 0 / 2.502 / 1.251 / 0.834 / 2.586 / 6.0 / 0.834 || -3 -%\setmainfont{Barlow} % 0 / 1.2 / 0.6 / 0.4 / 3.036 / 6.0 / 0.4 || -2 -%\setmainfont{Monaspace Neon} % 0 / 3.72 / 1.86 / 1.24 / 3.081 / 6.0 / 1.24 || -7 -%\setmainfont{Baltic Sund} % 0 / 1.476 / 0.738 / 0.492 / 3.0 / 6.0 / 0.492 || -3 -%\setmainfont{Cabin Sketch} % 0 / 1.35 / 0.675 / 0.45 / 3.03 / 6.0 / 0.45 || -2 -%\setmainfont{Consolas} % 0 / 3.2988 / 0 / 0 / 2.941 / 6.0 / 0 || -6 -%\setmainfont{Eagle Lake} % 0 / 1.787 / 0.89355 / 0.5957 / 3.2 / 6.0 / 0.5957 || -3 -%\setmainfont{Fira Sans} % 0 / 1.59 / 0.795 / 0.53 / 3.162 / 6.0 / 0.53 || -3 -%\setmainfont{Gentium Book Plus} % 0 / 1.32 / 0.66 / 0.44 / 2.72 / 6.0 / 0.44 || -2 -%\setmainfont{Ubuntu} % 0 / 1.38 / 0.69 / 0.46 / 3.12 / 6.0 / 0.46 || -2 -%\setmainfont{Ubuntu Condensed} % 0 / 1.17 / 0.58 / 0.39 / 3.12 / 6.0 / 0.39 || -2 -%\setmainfont{Ubuntu Mono} % 0 / 3.0 / 0 / 0 / 3.12 / 6.0 / 0 || -5 - % colors \definecolor{fieldcolor}{gray}{0.85} \definecolor{bordercolor}{gray}{0.1} @@ -486,17 +489,29 @@ % put the logo in the top right corner \NewDocumentCommand{\@logo}{}{ - \begin{tikzpicture}[remember picture, overlay] - \node[anchor=north east] at (current page.north east) [xshift=-1.5cm, yshift=-1.5cm] {% - \includegraphics[width=3cm]{logo.pdf}% - }; - \end{tikzpicture}% + \if@Example + \begin{tikzpicture}[remember picture, overlay] + \node[anchor=north east] at (current page.north east) [xshift=-0.5cm, yshift=-0.5cm] {% + \includegraphics[width=1.5cm]{logo.pdf}% + }; + \end{tikzpicture}% + \else + \begin{tikzpicture}[remember picture, overlay] + \node[anchor=north east] at (current page.north east) [xshift=-1.5cm, yshift=-1.5cm] {% + \includegraphics[width=3cm]{logo.pdf}% + }; + \end{tikzpicture}% + \fi } % LogoTitle{title} - logo on the right, title on the left \NewDocumentCommand{\LogoTitle}{m}{ \@logo - \\[1cm]{\titlefont\huge\bfseries #1}\\[1.5cm] + \if@Example + \\[0.5cm]{\titlefont\huge\bfseries #1}\\[1cm] + \else + \\[1cm]{\titlefont\huge\bfseries #1}\\[1.5cm] + \fi } % AddressTitle{title} - title at the top, address, then the form below @@ -516,11 +531,14 @@ } \NewDocumentCommand{\PageFoldMarks}{}{ + \if@Example + \else \begin{tikzpicture}[remember picture,overlay] \draw ($(current page.north west)!0.33!(current page.south west)$) -- ++(7.5mm,0cm); \draw ($(current page.north west)!0.50!(current page.south west)$) -- ++(1.25cm,0cm); \draw ($(current page.north west)!0.66!(current page.south west)$) -- ++(7.5mm,0cm); \end{tikzpicture} + \fi } % fold markers diff --git a/doku.tex b/doku.tex new file mode 100644 index 0000000..2ad39e2 --- /dev/null +++ b/doku.tex @@ -0,0 +1,113 @@ +\documentclass{ltxdoc} +\usepackage{tikz,fancyvrb,geometry,minted,fontspec} +\usepackage[ngerman]{babel} +\usetikzlibrary{positioning} +\geometry{a4paper,margin=2cm} +\setmainfont[ + Renderer=HarfBuzz, + ItalicFont=Recursive, + BoldFont=Recursive, + BoldItalicFont=Recursive, + Scale=0.9, + UprightFeatures={ + RawFeature={+ss01,+ss02,+ss08,+case}, + RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=0,CRSV=0,wght=400}} + }, + BoldFeatures={RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=0,CRSV=0,wght=700}}}, + BoldItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=-15,CRSV=1,wght=700}}}, + ItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=-15,CRSV=1,wght=400}}} + ]{Recursive} +\setmonofont[ + Renderer=HarfBuzz, + ItalicFont=Recursive, + BoldFont=Recursive, + BoldItalicFont=Recursive, + Scale=0.9, + UprightFeatures={ + RawFeature={+ss01,+ss02,+ss08,+case}, + RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=0,CRSV=0,wght=400}} + }, + BoldFeatures={RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=0,CRSV=0,wght=700}}}, + BoldItalicFeatures={RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=-15,CRSV=1,wght=700}}}, + ItalicFeatures={RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=-15,CRSV=1,wght=400}}} + ]{Recursive} +\newfontfamily\titlefont[ + Renderer=HarfBuzz, + ItalicFont=Recursive, + BoldFont=Recursive, + BoldItalicFont=Recursive, + Scale=0.9, + UprightFeatures={ + RawFeature={+ss01,+ss02,+ss08,+case}, + RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=0,CRSV=1,wght=500}} + }, + BoldFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=0,CRSV=1,wght=800}}}, + BoldItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=-15,CRSV=1,wght=800}}}, + ItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=-15,CRSV=1,wght=500}}} + ]{Recursive} + +\directlua{ os.execute "mkdir -p cccbform-examples" } +\directlua{ os.execute "cp cccbform.cls cccbform-examples/" } +\directlua{ os.execute "cp logo.pdf cccbform-examples/" } + +\NewDocumentCommand{\LineCount}{m}{\directlua{ + local n, f = 0, io.open("cccbform-examples/#1.tex") + for l in f:lines() do n = n + 1 end + tex.print( n - 1 ) +}} + +\NewDocumentEnvironment{ShortExample}{m}{ + \VerbatimEnvironment + \begin{VerbatimOut}{cccbform-examples/#1.tex}[] + \documentclass[shortexample]{cccbform} + \begin{document}}{ + \end{document} + \end{VerbatimOut} + \directlua{ os.execute "cd cccbform-examples ; latexmk -pdflua #1.tex" } + \edef\lc{\LineCount{#1}} + \begin{tikzpicture} + \node[anchor=north west, inner sep=1ex, draw] (code) { + \begin{minipage}[t]{0.45\textwidth} + \inputminted[firstline=3,lastline=\lc]{tex}{cccbform-examples/#1.tex} + \end{minipage} + }; + \node[anchor=north west, right=2mm of code, draw] (output) { + \begin{minipage}[t]{0.45\textwidth} + \includegraphics[width=\linewidth]{cccbform-examples/#1.pdf} + \end{minipage} + }; + \end{tikzpicture} +} +\NewDocumentEnvironment{StandaloneExample}{m}{ + \VerbatimEnvironment% + \begin{VerbatimOut}{cccbform-examples/#1.tex}}% + {\end{VerbatimOut}% + \directlua{ os.execute "cd cccbform-examples ; latexmk -pdflua #1.tex" } + \edef\lc{\LineCount{#1}} + \begin{tikzpicture} + \node[anchor=north west, inner sep=1ex, draw] (code) { + \begin{minipage}[t]{0.45\textwidth} + \inputminted[firstline=3,lastline=\lc]{tex}{cccbform-examples/#1.tex} + \end{minipage} + }; + \node[anchor=north west, right=2mm of code, draw] (output) { + \begin{minipage}[t]{0.45\textwidth} + \includegraphics[width=\linewidth]{cccbform-examples/#1.pdf} + \end{minipage} + }; + \end{tikzpicture} +} + +\title{\texttt{cccbform} -- Formulare für den CCCB} +\author{Frank Nord} +\begin{document} +\maketitle +\tableofcontents + +\section{Übersicht} + +\begin{ShortExample}{test} +\Text{Test} +\end{ShortExample} + +\end{document} diff --git a/fvextra.sty b/fvextra.sty new file mode 100644 index 0000000..9f9cd09 --- /dev/null +++ b/fvextra.sty @@ -0,0 +1,3281 @@ +%% +%% This is file `fvextra.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% fvextra.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2016-2024 by Geoffrey M. Poore +%% -------------------------------------------------------------------------- +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{fvextra} + [2024/11/17 v1.10.0 fvextra - extensions and patches for fancyvrb] +\RequirePackage{etoolbox} +\RequirePackage{fancyvrb} +\RequirePackage{upquote} +\AtEndPreamble{% + \ifx\encodingdefault\upquote@OTone + \ifx\ttdefault\upquote@cmtt\else\RequirePackage{textcomp}\fi + \else + \RequirePackage{textcomp} + \fi} +\RequirePackage{lineno} +\@ifpackageloaded{csquotes}% + {\PackageWarning{fvextra}{csquotes should be loaded after fvextra, % + to avoid a warning from the lineno package}}{} +\begingroup +\catcode`\ =\active% +\gdef\FV@ActiveSpaceToken{ }% +\endgroup% +\edef\FV@SpaceCatTen{{\detokenize{ }}} +\def\FV@FVSpaceToken{\FV@Space} +\def\FV@FVTabToken{\FV@Tab} +\def\FVExtraDoSpecials{% + \do\ \do\!\do\"\do\#\do\$\do\%\do\&\do\'\do\(\do\)\do\*\do\+\do\,\do\-% + \do\.\do\/\do\:\do\;\do\<\do\=\do\>\do\?\do\@\do\[\do\\\do\]\do\^\do\_% + \do\`\do\{\do\|\do\}\do\~} +\begingroup +\def\do#1{% + \expandafter\global\expandafter + \let\csname FV@Special:\expandafter\@gobble\detokenize{#1}\endcsname\relax} +\FVExtraDoSpecials +\endgroup +\begingroup +\catcode`\<=11 +\catcode`\>=11 +\gdef\FV@Sentinel{\FV@} +\endgroup +\begingroup +\catcode`\^^M=\active% +\gdef\FV@OuterDefEOLEmpty{\outer\def^^M{}}% +\endgroup +\begingroup +\catcode`\^^M=\active% +\gdef\FV@DefEOLEmpty{\def^^M{}}% +\endgroup +\begingroup +\catcode`\^^B=\active +\gdef\FV@OuterDefSTXEmpty{\outer\def^^B{}} +\endgroup +\begingroup +\catcode`\^^C=\active +\gdef\FV@OuterDefETXEmpty{\outer\def^^C{}} +\endgroup +\newif\ifFV@pdfTeXinputenc +\FV@pdfTeXinputencfalse +\ifcsname pdfmatch\endcsname +\ifx\pdfmatch\relax +\else + \@ifpackageloaded{inputenc}% + {\ifcsname inputencodingname\endcsname + \ifx\inputencodingname\relax + \else + \FV@pdfTeXinputenctrue + \fi\fi} + {}% +\fi\fi +\ifFV@pdfTeXinputenc +\begingroup +\catcode`\~=13 +\catcode`\"=12 +\def\FV@UTFviii@loop{% + \uccode`\~\count@ + \uppercase\expandafter{\FV@UTFviii@Tmp}% + \advance\count@\@ne + \ifnum\count@<\@tempcnta + \expandafter\FV@UTFviii@loop + \fi} +\count@"C2 +\@tempcnta"E0 +\def\FV@UTFviii@Tmp{\expandafter\gdef\csname FV@U8:\string~\endcsname{% + \FV@UTF@two@octets}} +\FV@UTFviii@loop +\count@"E0 +\@tempcnta"F0 +\def\FV@UTFviii@Tmp{\expandafter\gdef\csname FV@U8:\string~\endcsname{% + \FV@UTF@three@octets}} +\FV@UTFviii@loop +\count@"F0 +\@tempcnta"F4 +\def\FV@UTFviii@Tmp{\expandafter\gdef\csname FV@U8:\string~\endcsname{% + \FV@UTF@four@octets}} +\FV@UTFviii@loop +\endgroup +\def\FV@UTF@two@octets#1#2{% + \ifcsname u8:\detokenize{#1#2}\endcsname + \else + #1#2% + \fi + \FV@UTF@octets@after{#1#2}} +\def\FV@UTF@three@octets#1#2#3{% + \ifcsname u8:\detokenize{#1#2#3}\endcsname + \else + #1#2#3% + \fi + \FV@UTF@octets@after{#1#2#3}} +\def\FV@UTF@four@octets#1#2#3#4{% + \ifcsname u8:\detokenize{#1#2#3#4}\endcsname + \else + #1#2#3#4% + \fi + \FV@UTF@octets@after{#1#2#3#4}} +\fi +\long\def\FVExtra@ifnextcharAny#1#2#3{% + \let\reserved@d= #1% + \def\reserved@a{#2}% + \def\reserved@b{#3}% + \futurelet\@let@token\FVExtra@ifnchAny} +\def\FVExtra@ifnchAny{% + \ifx\@let@token\reserved@d + \expandafter\reserved@a + \else + \expandafter\reserved@b + \fi} + +\long\def\FVExtra@ifnextcharVArg#1#2#3{% + \begingroup + \edef\FV@TmpSpaceCat{\the\catcode` }% + \let\do\@makeother\FVExtraDoSpecials + \catcode`\ =\FV@TmpSpaceCat\relax + \catcode`\{=1 + \catcode`\}=2 + \@ifnextchar#1{\endgroup#2}{\endgroup#3}} +\begingroup +\catcode`\*=12 +\gdef\FVExtra@ifstarVArg#1{\FVExtra@ifnextcharVArg*{\@firstoftwo{#1}}} +\endgroup +\def\FV@ReadOArgContinue#1[#2]{#1{#2}} +\newcommand{\FVExtraReadOArgBeforeVArg}[2][]{% + \FVExtra@ifnextcharVArg[% + {\FV@ReadOArgContinue{#2}}% + {\FV@ReadOArgContinue{#2}[#1]}} +\newcommand{\FVExtraReadOArgBeforeVEnv}[2][]{% + \begingroup + \catcode`\^^M=\active + \@ifnextchar[% + {\endgroup\FVExtraReadOArgBeforeVEnv@i{#2}}% + {\endgroup\FVExtraReadOArgBeforeVEnv@i{#2}[#1]}} +\def\FVExtraReadOArgBeforeVEnv@i#1[#2]{% + \begingroup + \catcode`\^^M=\active + \FVExtraReadOArgBeforeVEnv@ii{#1}{#2}} +\begingroup +\catcode`\^^M=\active% +\gdef\FVExtraReadOArgBeforeVEnv@ii#1#2#3^^M{% + \endgroup% + \FVExtraReadOArgBeforeVEnv@iii{#1}{#2}{#3}}% +\endgroup% +\def\FVExtraReadOArgBeforeVEnv@iii#1#2#3{% + \if\relax\detokenize{#3}\relax + \else + \PackageError{fvextra}% + {Discarded invalid text while checking for optional argument of verbatim environment}% + {Discarded invalid text while checking for optional argument of verbatim environment}% + \fi + #1{#2}} +\def\FVExtraReadVArg#1{% + \begingroup + \ifFV@pdfTeXinputenc + \ifdefstring{\inputencodingname}{utf8}% + {\let\FV@ReadVArg@Char\FV@ReadVArg@Char@UTF}% + {}% + \fi + \edef\FV@TmpSpaceCat{\the\catcode` }% + \let\do\@makeother\FVExtraDoSpecials + \catcode`\^^B=\active + \FV@OuterDefSTXEmpty + \catcode`\^^C=\active + \FV@OuterDefETXEmpty + \begingroup + \catcode`\ =\FV@TmpSpaceCat\relax + \catcode`\{=1 + \catcode`\}=2 + \@ifnextchar\bgroup + {\endgroup + \catcode`\{=1 + \catcode`\}=2 + \catcode`\ =\active + \catcode`\^^I=\active + \FV@ReadVArg@Group{#1}}% + {\endgroup + \catcode`\ =\active + \catcode`\^^I=\active + \FV@ReadVArg@Char{#1}}} +\def\FVExtraReadVArgSingleLine#1{% + \begingroup + \ifFV@pdfTeXinputenc + \ifdefstring{\inputencodingname}{utf8}% + {\let\FV@ReadVArg@Char\FV@ReadVArg@Char@UTF}% + {}% + \fi + \edef\FV@TmpSpaceCat{\the\catcode` }% + \let\do\@makeother\FVExtraDoSpecials + \catcode`\^^B=\active + \FV@OuterDefSTXEmpty + \catcode`\^^C=\active + \FV@OuterDefETXEmpty + \catcode`\^^M=\active + \FV@OuterDefEOLEmpty + \begingroup + \catcode`\ =\FV@TmpSpaceCat\relax + \catcode`\{=1 + \catcode`\}=2 + \@ifnextchar\bgroup + {\endgroup + \catcode`\{=1 + \catcode`\}=2 + \catcode`\ =\active + \catcode`\^^I=\active + \FV@ReadVArg@Group{#1}}% + {\endgroup + \catcode`\ =\active + \catcode`\^^I=\active + \FV@ReadVArg@Char{#1}}} +\def\FV@ReadVArg@Group#1#2{% + \endgroup + #1{#2}} +\def\FV@ReadVArg@Char#1#2{% + \expandafter\expandafter\expandafter + \if\expandafter\expandafter\expandafter\relax\expandafter\@gobble\detokenize{#2}\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\PackageError{fvextra}% + {Verbatim delimiters must be single characters, not commands}% + {Try a different delimiter}}% + \def\FV@ReadVArg@Char@i##1##2#2{% + \endgroup + ##1{##2}}% + \FV@ReadVArg@Char@i{#1}}% +\ifFV@pdfTeXinputenc +\def\FV@ReadVArg@Char@UTF#1#2{% + \expandafter\expandafter\expandafter + \if\expandafter\expandafter\expandafter\relax\expandafter\@gobble\detokenize{#2}\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\PackageError{fvextra}% + {Verbatim delimiters must be single characters, not commands}% + {Try a different delimiter}}% + \ifcsname FV@U8:\detokenize{#2}\endcsname + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\def\FV@UTF@octets@after##1{\FV@ReadVArg@Char@UTF@i{#1}{##1}}% + \csname FV@U8:\detokenize{#2}\endcsname#2}% + {\FV@ReadVArg@Char@UTF@i{#1}{#2}}} +\def\FV@ReadVArg@Char@UTF@i#1#2{% + \def\FV@ReadVArg@Char@i##1##2#2{% + \endgroup + ##1{##2}}% + \FV@ReadVArg@Char@i{#1}}% +\fi +\newbool{FV@vargsingleline} +\define@booleankey{FV}{vargsingleline}% + {\booltrue{FV@vargsingleline}} + {\boolfalse{FV@vargsingleline}} +\fvset{vargsingleline=false} +\def\FVExtrapdfstringdef#1#2{% + \AfterPreamble{% + \ifcsname pdfstringdef\endcsname + \ifx\pdfstringdef\relax + \else + \pdfstringdef#1{#2}% + \fi\fi}} +\def\FVExtrapdfstringdefDisableCommands#1{% + \AfterPreamble{% + \ifcsname pdfstringdefDisableCommands\endcsname + \ifx\pdfstringdefDisableCommands\relax + \else + \pdfstringdefDisableCommands{#1}% + \fi\fi}} +\long\def\FVExtraAlwaysUnexpanded#1{% + \unexpanded{\FVExtraAlwaysUnexpanded{#1}}} +\FVExtrapdfstringdefDisableCommands{% + \long\def\FVExtraAlwaysUnexpanded#1{#1}} +\newbool{FVExtraRobustCommandExpanded} +\protected\def\FVExtraRobustCommand#1#2{% + \ifx#2\FVExtraAlwaysUnexpanded + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\booltrue{FVExtraRobustCommandExpanded}\FV@RobustCommand@i{#1}}% + {\boolfalse{FVExtraRobustCommandExpanded}#1}} +\FVExtrapdfstringdefDisableCommands{% + \def\FVExtraRobustCommand{}} +\def\FV@RobustCommand@i#1#2{\expandafter#1\@gobble#2} +\def\FVExtraUnexpandedReadStarOArgMArg#1#{% + \FV@UnexpandedReadStarOArgMArg@i{#1}} +\def\FV@UnexpandedReadStarOArgMArg@i#1#2{% + \FVExtraAlwaysUnexpanded{\FVExtraUnexpandedReadStarOArgMArg#1{#2}}} +\FVExtrapdfstringdefDisableCommands{% + \makeatletter + \def\FV@UnexpandedReadStarOArgMArg@i#1#2{#2}% + \makeatother} +\def\FVExtraUseVerbUnexpandedReadStarOArgMArg#1#{% + \FV@UseVerbUnexpandedReadStarOArgMArg@i{#1}} +\def\FV@UseVerbUnexpandedReadStarOArgMArg@i#1#2{% + \FVExtraAlwaysUnexpanded{\FVExtraUseVerbUnexpandedReadStarOArgMArg#1{#2}}} +\FVExtrapdfstringdefDisableCommands{% + \makeatletter + \def\FV@UseVerbUnexpandedReadStarOArgMArg@i#1#2{% + \ifcsname FV@SVRaw@#2\endcsname + \expandafter\expandafter\expandafter\FVExtraPDFStringVerbatimDetokenize + \expandafter\expandafter\expandafter{\csname FV@SVRaw@#2\endcsname}% + \fi}% + \makeatother} +\def\FVExtraUnexpandedReadStarOArgBVArg#1#{% + \FV@UnexpandedReadStarOArgBVArg@i{#1}} +\def\FV@UnexpandedReadStarOArgBVArg@i#1#2{% + \FVExtraAlwaysUnexpanded{\FVExtraUnexpandedReadStarOArgBVArg#1{#2}}} +\FVExtrapdfstringdefDisableCommands{% + \makeatletter + \def\FV@UnexpandedReadStarOArgBVArg@i#1#2{% + \FVExtraPDFStringVerbatimDetokenize{#2}}% + \makeatother} +\def\FVExtraUnexpandedReadStarOArgBEscVArg#1#{% + \FV@UnexpandedReadStarOArgBEscVArg@i{#1}} +\def\FV@UnexpandedReadStarOArgBEscVArg@i#1#2{% + \FVExtraAlwaysUnexpanded{\FVExtraUnexpandedReadStarOArgBEscVArg#1{#2}}} +\FVExtrapdfstringdefDisableCommands{% + \makeatletter + \def\FV@UnexpandedReadStarOArgBEscVArg@i#1#2{% + \FVExtraPDFStringEscapedVerbatimDetokenize{#2}}% + \makeatother} +\def\FVExtraUnexpandedReadStarOArgMArgBVArg#1#{% + \FV@UnexpandedReadStarOArgMArgBVArg@i{#1}} +\def\FV@UnexpandedReadStarOArgMArgBVArg@i#1#2{% + \FV@UnexpandedReadStarOArgMArgBVArg@ii{#1}{#2}} +\def\FV@UnexpandedReadStarOArgMArgBVArg@ii#1#2#3#{% + \FV@UnexpandedReadStarOArgMArgBVArg@iii{#1}{#2}{#3}} +\def\FV@UnexpandedReadStarOArgMArgBVArg@iii#1#2#3#4{% + \FVExtraAlwaysUnexpanded{\FVExtraUnexpandedReadStarOArgMArgBVArg#1{#2}#3{#4}}} +\FVExtrapdfstringdefDisableCommands{% + \makeatletter + \def\FV@UnexpandedReadStarOArgMArgBVArg@iii#1#2#3#4{% + \FVExtraPDFStringVerbatimDetokenize{#4}}% + \makeatother} +\def\FVExtraPDFStringEscapeChar#1{% + \ifcsname FV@PDFStringEscapeChar@#1\endcsname + \csname FV@PDFStringEscapeChar@#1\endcsname + \else + #1% + \fi} +\begingroup +\catcode`\&=14 +\catcode`\%=12& +\catcode`\(=12& +\catcode`\)=12& +\catcode`\^^J=12& +\catcode`\^^M=12& +\catcode`\^^I=12& +\catcode`\^^H=12& +\catcode`\^^L=12& +\catcode`\!=0\relax& +!catcode`!\=12!relax& +!expandafter!gdef!csname FV@PDFStringEscapeChar@\!endcsname{\\}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@%!endcsname{\%}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@(!endcsname{\(}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@)!endcsname{\)}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@^^J!endcsname{\n}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@^^M!endcsname{\r}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@^^I!endcsname{\t}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@^^H!endcsname{\b}& +!expandafter!gdef!csname FV@PDFStringEscapeChar@^^L!endcsname{\f}& +!catcode`!\=0!relax& +\endgroup +\def\FVExtraPDFStringEscapeChars#1{% + \FV@PDFStringEscapeChars#1\FV@Sentinel} +\def\FV@PDFStringEscapeChars#1{% + \ifx#1\FV@Sentinel + \else + \FVExtraPDFStringEscapeChar{#1}% + \expandafter\FV@PDFStringEscapeChars + \fi}% +\begingroup +\catcode`\ =10 +\catcode`\a=11 +\catcode`\<=11 +\catcode`\>=11 +\catcode`\^^C=\active +\gdef\FVExtraVerbatimDetokenize#1{% + \FV@VDetok@Scan{}#1^^C \FV@} +\gdef\FV@VDetok@Scan#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@VDetok@ScanEnd#1}% + {\FV@VDetok@ScanCont{#1}{#2}}} +\gdef\FV@VDetok@ScanEnd#1^^C{% + \if\relax\detokenize{#1}\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@VDetok@ScanGroup\@gobble#1{\FV@}}} +\begingroup +\catcode`\ =12% +\gdef\FV@VDetok@ScanCont#1#2{% +\if\relax\detokenize{#1}\relax% +\expandafter\@gobble% +\else% +\expandafter\@firstofone% +\fi% +{\expandafter\FV@VDetok@ScanGroup\@gobble#1{\FV@}}% + %<-catcode 12 space +\FV@VDetok@Scan{}#2\FV@}% +\endgroup +\gdef\FV@VDetok@ScanGroup#1#{% + \FV@VDetok@ScanToken#1\FV@Sentinel + \FV@VDetok@ScanGroup@i} +\gdef\FV@VDetok@ScanGroup@i#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@VDetok@ScanEmptyGroup}% + {\FV@VDetok@ScanGroup@ii{}#1\FV@^^C}} +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@VDetok@ScanEmptyGroup({}\FV@VDetok@ScanGroup) +\endgroup +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@VDetok@ScanGroup@ii#1\FV@#2^^C(% + \if\relax\detokenize(#2)\relax + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi + ({\FV@VDetok@Scan#1^^C \FV@}\FV@VDetok@ScanGroup)) +\endgroup +\gdef\FV@VDetok@ScanToken#1{% + \ifx\FV@Sentinel#1% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@VDetok@ScanToken@i\detokenize{#1}^^C \FV@}} +\gdef\FV@VDetok@ScanToken@i#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@VDetok@ScanTokenNoSpace#1}% + {\FV@VDetok@ScanTokenWithSpace{#1}}} +\gdef\FV@VDetok@ScanTokenNoSpace#1^^C{#1\FV@VDetok@ScanToken} +\gdef\FV@VDetok@ScanTokenWithSpace#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@VDetok@ScanTokenActiveSpace}% + {\FV@VDetok@ScanTokenWithSpace@i#1\FV@}} +\begingroup +\catcode`\ =12% +\gdef\FV@VDetok@ScanTokenActiveSpace{ \FV@VDetok@ScanToken}% +\endgroup +\gdef\FV@VDetok@ScanTokenWithSpace@i#1#2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@VDetok@ScanTokenEscSpace{#1}}% + {\FV@VDetok@ScanTokenCW{#1#2}}} +\begingroup +\catcode`\ =12% +\gdef\FV@VDetok@ScanTokenEscSpace#1{#1 \FV@VDetok@ScanToken}% +\endgroup +\begingroup +\catcode`\ =12% +\gdef\FV@VDetok@ScanTokenCW#1#2{% +\ifcat\noexpand#2a% +\expandafter\@firstoftwo% +\else% +\expandafter\@secondoftwo% +\fi% +{#1 \FV@VDetok@ScanToken#2}% +{#1\FV@VDetok@ScanToken#2}}% +\endgroup +\gdef\FVExtraPDFStringVerbatimDetokenize#1{% + \FV@PDFStrVDetok@Scan{}#1^^C \FV@} +\gdef\FV@PDFStrVDetok@Scan#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrVDetok@ScanEnd#1}% + {\FV@PDFStrVDetok@ScanCont{#1}{#2}}} +\gdef\FV@PDFStrVDetok@ScanEnd#1^^C{% + \if\relax\detokenize{#1}\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@PDFStrVDetok@ScanGroup\@gobble#1{\FV@}}} +\begingroup +\catcode`\ =12% +\gdef\FV@PDFStrVDetok@ScanCont#1#2{% +\if\relax\detokenize{#1}\relax% +\expandafter\@gobble% +\else% +\expandafter\@firstofone% +\fi% +{\expandafter\FV@PDFStrVDetok@ScanGroup\@gobble#1{\FV@}}% + %<-catcode 12 space +\FV@PDFStrVDetok@Scan{}#2\FV@}% +\endgroup +\gdef\FV@PDFStrVDetok@ScanGroup#1#{% + \FV@PDFStrVDetok@ScanToken#1\FV@Sentinel + \FV@PDFStrVDetok@ScanGroup@i} +\gdef\FV@PDFStrVDetok@ScanGroup@i#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrVDetok@ScanEmptyGroup}% + {\FV@PDFStrVDetok@ScanGroup@ii{}#1\FV@^^C}} +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@PDFStrVDetok@ScanEmptyGroup({}\FV@PDFStrVDetok@ScanGroup) +\endgroup +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@PDFStrVDetok@ScanGroup@ii#1\FV@#2^^C(% + \if\relax\detokenize(#2)\relax + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi + ({\FV@PDFStrVDetok@Scan#1^^C \FV@}\FV@PDFStrVDetok@ScanGroup)) +\endgroup +\gdef\FV@PDFStrVDetok@ScanToken#1{% + \ifx\FV@Sentinel#1% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@PDFStrVDetok@ScanToken@i\detokenize{#1}^^C \FV@}} +\gdef\FV@PDFStrVDetok@ScanToken@i#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrVDetok@ScanTokenNoSpace#1}% + {\FV@PDFStrVDetok@ScanTokenWithSpace{#1}}} +\gdef\FV@PDFStrVDetok@ScanTokenNoSpace#1^^C{% + \FVExtraPDFStringEscapeChars{#1}\FV@PDFStrVDetok@ScanToken} +\gdef\FV@PDFStrVDetok@ScanTokenWithSpace#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrVDetok@ScanTokenActiveSpace}% + {\FV@PDFStrVDetok@ScanTokenWithSpace@i#1\FV@}} +\begingroup +\catcode`\!=0\relax +\catcode`\\=12!relax +!gdef!FV@PDFStrVDetok@ScanTokenActiveSpace{\040!FV@PDFStrVDetok@ScanToken}% +!catcode`!\=0!relax +\endgroup +\gdef\FV@PDFStrVDetok@ScanTokenWithSpace@i#1#2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrVDetok@ScanTokenEscSpace{#1}}% + {\FV@PDFStrVDetok@ScanTokenCW{#1#2}}} +\begingroup +\catcode`\!=0\relax +\catcode`\\=12!relax +!gdef!FV@PDFStrVDetok@ScanTokenEscSpace#1{% + !FVExtraPDFStringEscapeChar{#1}\040!FV@PDFStrVDetok@ScanToken}% +!catcode`!\=0!relax +\endgroup +\begingroup +\catcode`\ =12% +\gdef\FV@PDFStrVDetok@ScanTokenCW#1#2{% +\ifcat\noexpand#2a% +\expandafter\@firstoftwo% +\else% +\expandafter\@secondoftwo% +\fi% +{\FVExtraPDFStringEscapeChars{#1} \FV@PDFStrVDetok@ScanToken#2}% +{\FVExtraPDFStringEscapeChars{#1}\FV@PDFStrVDetok@ScanToken#2}} +\endgroup +\gdef\FVExtraEscapedVerbatimDetokenize#1{% + \FV@EscVDetok@Scan{}#1^^C \FV@} +\gdef\FV@EscVDetok@Scan#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@EscVDetok@ScanEnd#1}% + {\FV@EscVDetok@ScanCont{#1}{#2}}} +\gdef\FV@EscVDetok@ScanEnd#1^^C{% + \if\relax\detokenize{#1}\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@EscVDetok@ScanGroup\@gobble#1{\FV@}}} +\begingroup +\catcode`\ =12% +\gdef\FV@EscVDetok@ScanCont#1#2{% +\if\relax\detokenize{#1}\relax% +\expandafter\@gobble% +\else% +\expandafter\@firstofone% +\fi% +{\expandafter\FV@EscVDetok@ScanGroup\@gobble#1{\FV@}}% + %<-catcode 12 space +\FV@EscVDetok@Scan{}#2\FV@}% +\endgroup +\gdef\FV@EscVDetok@ScanGroup#1#{% + \FV@EscVDetok@ScanToken#1\FV@Sentinel + \FV@EscVDetok@ScanGroup@i} +\gdef\FV@EscVDetok@ScanGroup@i#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@EscVDetok@ScanEmptyGroup}% + {\FV@EscVDetok@ScanGroup@ii{}#1\FV@^^C}} +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@EscVDetok@ScanEmptyGroup({}\FV@EscVDetok@ScanGroup) +\endgroup +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@EscVDetok@ScanGroup@ii#1\FV@#2^^C(% + \if\relax\detokenize(#2)\relax + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi + ({\FV@EscVDetok@Scan#1^^C \FV@}\FV@EscVDetok@ScanGroup)) +\endgroup +\gdef\FV@EscVDetok@ScanToken#1{% + \ifx\FV@Sentinel#1% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@EscVDetok@ScanToken@i\detokenize{#1}^^C \FV@}} +\gdef\FV@EscVDetok@ScanToken@i#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@EscVDetok@ScanTokenNoSpace#1}% + {\FV@EscVDetok@ScanTokenWithSpace{#1}}} +\gdef\FV@EscVDetok@ScanTokenNoSpace#1#2^^C{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {#1\FV@EscVDetok@ScanToken}% + {#2\FV@EscVDetok@ScanToken}} +\gdef\FV@REscVDetok@ScanTokenNoSpace#1#2^^C{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {#1\FV@EscVDetok@ScanToken}% + {\ifcsname FV@Special:\detokenize{#2}\endcsname#2\else\noexpand\FV@\fi + \FV@EscVDetok@ScanToken}} +\gdef\FV@EscVDetok@ScanTokenWithSpace#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@EscVDetok@ScanTokenActiveSpace}% + {\FV@EscVDetok@ScanTokenWithSpace@i#1\FV@}} +\begingroup +\catcode`\ =12% +\gdef\FV@EscVDetok@ScanTokenActiveSpace{ \FV@EscVDetok@ScanToken}% +\endgroup +\gdef\FV@EscVDetok@ScanTokenWithSpace@i#1#2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@EscVDetok@ScanTokenEscSpace{#1}}% + {\FV@EscVDetok@ScanTokenCW{#1}{#2}}} +\gdef\FV@REscVDetok@ScanTokenWithSpace@i#1#2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@EscVDetok@ScanTokenEscSpace{#1}}% + {\noexpand\FV@\FV@EscVDetok@ScanToken}} +\begingroup +\catcode`\ =12% +\gdef\FV@EscVDetok@ScanTokenEscSpace#1{ \FV@EscVDetok@ScanToken}% +\endgroup +\begingroup +\catcode`\ =12% +\gdef\FV@EscVDetok@ScanTokenCW#1#2#3{% +\ifcat\noexpand#2a% +\expandafter\@firstoftwo% +\else% +\expandafter\@secondoftwo% +\fi% +{#2 \FV@EscVDetok@ScanToken#3}% +{#2\FV@EscVDetok@ScanToken#3}} +\endgroup +\gdef\FVExtraPDFStringEscapedVerbatimDetokenize#1{% + \FV@PDFStrEscVDetok@Scan{}#1^^C \FV@} +\gdef\FV@PDFStrEscVDetok@Scan#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrEscVDetok@ScanEnd#1}% + {\FV@PDFStrEscVDetok@ScanCont{#1}{#2}}} +\gdef\FV@PDFStrEscVDetok@ScanEnd#1^^C{% + \if\relax\detokenize{#1}\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@PDFStrEscVDetok@ScanGroup\@gobble#1{\FV@}}} +\begingroup +\catcode`\!=0\relax +\catcode`\\=12!relax +!gdef!FV@PDFStrEscVDetok@ScanCont#1#2{% + !if!relax!detokenize{#1}!relax + !expandafter!@gobble + !else + !expandafter!@firstofone + !fi + {!expandafter!FV@PDFStrEscVDetok@ScanGroup!@gobble#1{!FV@}}% + \040%<-space + !FV@PDFStrEscVDetok@Scan{}#2!FV@}% +!catcode`!\=0!relax +\endgroup +\gdef\FV@PDFStrEscVDetok@ScanGroup#1#{% + \FV@PDFStrEscVDetok@ScanToken#1\FV@Sentinel + \FV@PDFStrEscVDetok@ScanGroup@i} +\gdef\FV@PDFStrEscVDetok@ScanGroup@i#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrEscVDetok@ScanEmptyGroup}% + {\FV@PDFStrEscVDetok@ScanGroup@ii{}#1\FV@^^C}} +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@PDFStrEscVDetok@ScanEmptyGroup({}\FV@PDFStrEscVDetok@ScanGroup) +\endgroup +\begingroup +\catcode`\(=1 +\catcode`\)=2 +\catcode`\{=12 +\catcode`\}=12 +\gdef\FV@PDFStrEscVDetok@ScanGroup@ii#1\FV@#2^^C(% + \if\relax\detokenize(#2)\relax + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi + ({\FV@PDFStrEscVDetok@Scan#1^^C \FV@}\FV@PDFStrEscVDetok@ScanGroup)) +\endgroup +\gdef\FV@PDFStrEscVDetok@ScanToken#1{% + \ifx\FV@Sentinel#1% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\expandafter\FV@PDFStrEscVDetok@ScanToken@i\detokenize{#1}^^C \FV@}} +\gdef\FV@PDFStrEscVDetok@ScanToken@i#1 #2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrEscVDetok@ScanTokenNoSpace#1}% + {\FV@PDFStrEscVDetok@ScanTokenWithSpace{#1}}} +\gdef\FV@PDFStrEscVDetok@ScanTokenNoSpace#1#2^^C{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FVExtraPDFStringEscapeChar{#1}\FV@PDFStrEscVDetok@ScanToken}% + {\FVExtraPDFStringEscapeChar{#2}\FV@PDFStrEscVDetok@ScanToken}} +\gdef\FV@PDFStrEscVDetok@ScanTokenWithSpace#1{% + \if\relax\detokenize{#1}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrEscVDetok@ScanTokenActiveSpace}% + {\FV@PDFStrEscVDetok@ScanTokenWithSpace@i#1\FV@}} +\begingroup +\catcode`\!=0\relax +\catcode`\\=12!relax +!gdef!FV@PDFStrEscVDetok@ScanTokenActiveSpace{\040!FV@PDFStrEscVDetok@ScanToken}% +!catcode`!\=0!relax +\endgroup +\gdef\FV@PDFStrEscVDetok@ScanTokenWithSpace@i#1#2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@PDFStrEscVDetok@ScanTokenEscSpace{#1}}% + {\FV@PDFStrEscVDetok@ScanTokenCW{#1}{#2}}} +\begingroup +\catcode`\!=0\relax +\catcode`\\=12!relax +!gdef!FV@PDFStrEscVDetok@ScanTokenEscSpace#1{\040!FV@PDFStrEscVDetok@ScanToken} +!catcode`!\=0!relax +\endgroup +\begingroup +\catcode`\ =12% +\gdef\FV@PDFStrEscVDetok@ScanTokenCW#1#2#3{% +\ifcat\noexpand#2a% +\expandafter\@firstoftwo% +\else% +\expandafter\@secondoftwo% +\fi% +{\FVExtraPDFStringEscapeChars{#2} \FV@PDFStrEscVDetok@ScanToken#3}% +{\FVExtraPDFStringEscapeChars{#2}\FV@PDFStrEscVDetok@ScanToken#3}} +\endgroup +\gdef\FVExtraDetokenizeVArg#1#2{% + \begingroup + \catcode`\^^C=\active + \let^^C\FV@Sentinel + \edef\FV@Tmp{\FVExtraVerbatimDetokenize{#2}}% + \expandafter\FV@DetokenizeVArg@i\expandafter{\FV@Tmp}{#1}} +\gdef\FV@DetokenizeVArg@i#1#2{% + \endgroup + #2{#1}} +\gdef\FVExtraDetokenizeEscVArg#1#2{% + \begingroup + \catcode`\^^C=\active + \let^^C\FV@Sentinel + \edef\FV@Tmp{\FVExtraEscapedVerbatimDetokenize{#2}}% + \expandafter\FV@DetokenizeVArg@i\expandafter{\FV@Tmp}{#1}} +\gdef\FVExtraDetokenizeREscVArg#1#2{% + \begingroup + \catcode`\^^C=\active + \let^^C\FV@Sentinel + \let\FV@EscVDetok@ScanTokenNoSpace\FV@REscVDetok@ScanTokenNoSpace + \let\FV@EscVDetok@ScanTokenWithSpace@i\FV@REscVDetok@ScanTokenWithSpace@i + \edef\FV@Tmp{\FVExtraEscapedVerbatimDetokenize{#2}}% + \expandafter\FV@DetokenizeREscVArg@InvalidEscapeCheck\FV@Tmp\FV@\FV@ + \expandafter\FV@DetokenizeVArg@i\expandafter{\FV@Tmp}{#1}} +\gdef\FV@DetokenizeREscVArg@InvalidEscapeCheck#1\FV@#2\FV@{% + \if\relax\detokenize{#2}\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {\PackageError{fvextra}% + {Invalid backslash escape; only escape ASCII symbols and punctuation}% + {Only use \@backslashchar for ASCII symbols and punctuation}}} +\endgroup +\begingroup +\catcode`\^^C=\active% +\catcode`\^^M=\active% +\gdef\FV@RetokVArg@Read#1^^C^^M{% + \endgroup% + \def\FV@TmpRetoked{#1}}% +\endgroup +\begingroup +\catcode`\^^B=\active +\catcode`\^^C=\active +\gdef\FVExtraRetokenizeVArg#1#2#3{% + \begingroup + #2% + \catcode`\^^B=\active + \catcode`\^^C=\active + \catcode`\^^M=\active + \let^^B\FV@RetokVArg@Read + \let^^C\@empty + \FV@DefEOLEmpty + \scantokens{^^B#3^^C}% + \expandafter\FV@RetokenizeVArg@i\expandafter{\FV@TmpRetoked}{#1}}% +\gdef\FV@RetokenizeVArg@i#1#2{% + #2{#1}} +\endgroup +\let\FV@FormattingPrep@PreHook\@empty +\let\FV@FormattingPrep@PostHook\@empty +\expandafter\def\expandafter\FV@FormattingPrep\expandafter{% + \expandafter\FV@FormattingPrep@PreHook\FV@FormattingPrep\FV@FormattingPrep@PostHook} +\let\FV@PygmentsHook\relax +\g@addto@macro\FV@FormattingPrep@PreHook{\FV@PygmentsHook} +\edef\FV@hashchar{\string#} +\edef\FV@dollarchar{\string$} +\edef\FV@ampchar{\string&} +\edef\FV@underscorechar{\string_} +\edef\FV@caretchar{\string^} +\edef\FV@tildechar{\string~} +\edef\FV@leftsquarebracket{\string[} +\edef\FV@rightsquarebracket{\string]} +\edef\FV@commachar{\string,} +\newcommand{\FV@EscChars}{% + \let\#\FV@hashchar + \let\%\@percentchar + \let\{\@charlb + \let\}\@charrb + \let\$\FV@dollarchar + \let\&\FV@ampchar + \let\_\FV@underscorechar + \let\^\FV@caretchar + \let\\\@backslashchar + \let~\FV@tildechar + \let\~\FV@tildechar + \let\[\FV@leftsquarebracket + \let\]\FV@rightsquarebracket + \let\,\FV@commachar +} %$ <- highlighting +\def\FV@InlineKeyValues{} +\def\fvinlineset#1{% + \expandafter\def\expandafter\FV@InlineKeyValues\expandafter{% + \FV@InlineKeyValues#1,}} + +\def\FV@UseInlineKeyValues{% + \expandafter\fvset\expandafter{\FV@InlineKeyValues}% + \FV@ApplyBreakAnywhereInlineStretch} +\newbool{FV@extra} +\define@booleankey{FV}{extra}% + {\booltrue{FV@extra}}% + {\boolfalse{FV@extra}} +\fvset{extra=true} +\def\FancyVerbFormatInline#1{#1} +\def\Verb{% + \FVExtraRobustCommand\RobustVerb\FVExtraUnexpandedReadStarOArgBVArg} +\protected\def\RobustVerb{\FV@Command{}{Verb}} +\FVExtrapdfstringdefDisableCommands{% + \def\RobustVerb{}} +\let\FVC@Verb@FV\FVC@Verb +\def\FVC@Verb{% + \begingroup + \FV@UseInlineKeyValues\FV@UseKeyValues + \ifFV@extra + \expandafter\endgroup\expandafter\FVC@Verb@Extra + \else + \expandafter\endgroup\expandafter\FVC@Verb@FV + \fi} +\def\FVC@Verb@Extra{% + \ifbool{FVExtraRobustCommandExpanded}% + {\@ifnextchar\bgroup + {\FVC@Verb@Extra@i}% + {\PackageError{fvextra}% + {\string\Verb\space delimiters must be paired curly braces in this context}% + {Use curly braces as delimiters}}}% + {\FVC@Verb@Extra@i}} +\def\FVC@Verb@Extra@i{% + \begingroup + \ifbool{FV@vargsingleline}% + {\let\FV@Reader\FVExtraReadVArgSingleLine}% + {\let\FV@Reader\FVExtraReadVArg}% + \FV@Reader{% + \FV@UseInlineKeyValues\FV@UseKeyValues\FV@FormattingPrep + \FVExtraDetokenizeVArg{% + \FVExtraRetokenizeVArg{\FVC@Verb@Extra@ii}{\FV@CatCodes}}}} +\def\FVC@Verb@Extra@ii#1{% + \ifx\FancyVerbBackgroundColor\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\ifbool{FV@breaklines}% + {\FV@InsertBreaks{\FancyVerbFormatInline}{#1}}% + {\mbox{\FancyVerbFormatInline{#1}}}}% + {\setlength{\FV@TmpLength}{\fboxsep}% + \ifx\FancyVerbBackgroundColorPadding\relax + \setlength{\fboxsep}{0pt}% + \else + \setlength{\fboxsep}{\FancyVerbBackgroundColorPadding}% + \fi + \colorbox{\FancyVerbBackgroundColor}{% + \setlength{\fboxsep}{\FV@TmpLength}% + \FancyVerbBackgroundColorVPhantom\FancyVerbFormatInline{#1}}}% + \endgroup} +\let\FVC@SaveVerb@FV\FVC@SaveVerb +\def\FVC@SaveVerb{% + \begingroup + \FV@UseInlineKeyValues\FV@UseKeyValues + \ifFV@extra + \expandafter\endgroup\expandafter\FVC@SaveVerb@Extra + \else + \expandafter\endgroup\expandafter\FVC@SaveVerb@FV + \fi} +\def\FVC@SaveVerb@Extra#1{% + \@namedef{FV@SV@#1}{}% + \@namedef{FV@SVRaw@#1}{}% + \begingroup + \ifbool{FV@vargsingleline}% + {\let\FV@Reader\FVExtraReadVArgSingleLine}% + {\let\FV@Reader\FVExtraReadVArg}% + \FV@Reader{% + \FVC@SaveVerb@Extra@i{#1}}} +\def\FVC@SaveVerb@Extra@i#1#2{% + \FV@UseInlineKeyValues\FV@UseKeyValues\FV@FormattingPrep + \FVExtraDetokenizeVArg{% + \FVExtraRetokenizeVArg{\FVC@SaveVerb@Extra@ii{#1}{#2}}{\FV@CatCodes}}{#2}} +\def\FVC@SaveVerb@Extra@ii#1#2#3{% + \global\let\FV@AfterSave\FancyVerbAfterSave + \endgroup + \@namedef{FV@SV@#1}{#3}% + \@namedef{FV@SVRaw@#1}{#2}% + \FV@AfterSave}% +\newbool{FV@retokenize} +\define@booleankey{FV}{retokenize}% + {\booltrue{FV@retokenize}}{\boolfalse{FV@retokenize}} +\def\UseVerb{% + \FVExtraRobustCommand\RobustUseVerb\FVExtraUseVerbUnexpandedReadStarOArgMArg} +\protected\def\RobustUseVerb{\FV@Command{}{UseVerb}} +\FVExtrapdfstringdefDisableCommands{% + \def\RobustUseVerb{}} +\let\FVC@UseVerb@FV\FVC@UseVerb +\def\FVC@UseVerb{% + \begingroup + \FV@UseInlineKeyValues\FV@UseKeyValues + \ifFV@extra + \expandafter\endgroup\expandafter\FVC@UseVerb@Extra + \else + \expandafter\endgroup\expandafter\FVC@UseVerb@FV + \fi} +\def\FVC@UseVerb@Extra#1{% + \@ifundefined{FV@SV@#1}% + {\FV@Error{Short verbatim text never saved to name `#1'}\FV@eha}% + {\begingroup + \FV@UseInlineKeyValues\FV@UseKeyValues\FV@FormattingPrep + \ifbool{FV@retokenize}% + {\expandafter\let\expandafter\FV@Tmp\csname FV@SVRaw@#1\endcsname + \expandafter\FV@UseVerb@Extra@Retok\expandafter{\FV@Tmp}}% + {\expandafter\let\expandafter\FV@Tmp\csname FV@SV@#1\endcsname + \expandafter\FV@UseVerb@Extra\expandafter{\FV@Tmp}}}} +\def\FV@UseVerb@Extra@Retok#1{% + \FVExtraDetokenizeVArg{% + \FVExtraRetokenizeVArg{\FV@UseVerb@Extra}{\FV@CatCodes}}{#1}} +\let\FV@UseVerb@Extra\FVC@Verb@Extra@ii +\def\EscVerb{% + \FVExtraRobustCommand\RobustEscVerb\FVExtraUnexpandedReadStarOArgBEscVArg} +\protected\def\RobustEscVerb{\FV@Command{}{EscVerb}} +\FVExtrapdfstringdefDisableCommands{% + \def\RobustEscVerb{}} +\def\FVC@EscVerb{% + \@ifnextchar\bgroup + {\FVC@EscVerb@i}% + {\PackageError{fvextra}% + {Invalid argument; argument must be delimited by paired curly braces}% + {Delimit argument with curly braces}}} +\def\FVC@EscVerb@i#1{% + \begingroup + \FV@UseInlineKeyValues\FV@UseKeyValues\FV@FormattingPrep + \FVExtraDetokenizeREscVArg{% + \FVExtraRetokenizeVArg{\FVC@EscVerb@ii}{\FV@CatCodes}}{#1}} +\let\FVC@EscVerb@ii\FVC@Verb@Extra@ii +\def\VerbEnv{% + \ifcsname @currenvir\endcsname + \ifx\@currenvir\@empty + \PackageError{fvextra}{VerbEnv is an environment}{VerbEnv is an environment}% + \else + \ifx\@currenvir\relax + \PackageError{fvextra}{VerbEnv is an environment}{VerbEnv is an environment}% + \fi + \fi + \else + \PackageError{fvextra}{VerbEnv is an environment}{VerbEnv is an environment}% + \fi + \VerbatimEnvironment + \FVExtraReadOArgBeforeVEnv{\expandafter\VerbEnv@i\expandafter{\FV@EnvironName}}} +\def\VerbEnv@i#1#2{% + \begingroup + \let\do\@makeother\FVExtraDoSpecials + \catcode`\ =\active + \catcode`\^^I=\active + \catcode`\^^M=\active + \VerbEnv@ii{#1}{#2}} +\begingroup +\catcode`\!=0 +\catcode`\<=1 +\catcode`\>=2 +!catcode`!\=12 +!catcode`!{=12 +!catcode`!}=12 +!catcode`!^^M=!active% +!gdef!VerbEnv@ii#1#2#3^^M<% + !endgroup% + !def!VerbEnv@CheckLine##1\end{#1}##2!FV@Sentinel<% + !if!relax!detokenize<##2>!relax% + !else% + !PackageError% + !let!VerbEnv@iii!VerbEnv@iii@Error% + !fi>% + !VerbEnv@CheckLine#3\end{#1}!FV@Sentinel% + !VerbEnv@iii<#1><#2><#3>>% +!endgroup% +\def\VerbEnv@iii@Error#1#2#3{} +\def\VerbEnv@iii#1#2#3{% + \begingroup + \let\do\@makeother\FVExtraDoSpecials + \catcode`\ =10\relax + \catcode`\^^M=\active + \VerbEnv@iv{#1}{#2}{#3}} +\begingroup +\catcode`\!=0 +\catcode`\<=1 +\catcode`\>=2 +!catcode`!\=12 +!catcode`!{=12 +!catcode`!}=12 +!catcode`!^^M=!active% +!gdef!VerbEnv@iv#1#2#3#4^^M<% + !endgroup% + !def!VerbEnv@CheckEndDelim##1\end{#1}##2!FV@Sentinel<% + !if!relax!detokenize<##2>!relax% + !PackageError% + !let!VerbEnv@v!VerbEnv@v@Error% + !else% + !VerbEnv@CheckEndLeading##1!FV@Sentinel% + !VerbEnv@CheckEndTrailing##2!FV@Sentinel% + !fi>% + !def!VerbEnv@CheckEndTrailing##1\end{#1}!FV@Sentinel<% + !if!relax!detokenize<##1>!relax% + !else% + !PackageError% + % + % + !let!VerbEnv@v!VerbEnv@v@Error% + !fi>% + !VerbEnv@CheckEndDelim#4\end{#1}!FV@Sentinel% + !VerbEnv@v<#2><#3>>% +!endgroup +\def\VerbEnv@CheckEndLeading{% + \FVExtra@ifnextcharAny\@sptoken% + {\VerbEnv@CheckEndLeading@Continue}% + {\ifx\@let@token\FV@Sentinel + \expandafter\VerbEnv@CheckEndLeading@End + \else + \expandafter\VerbEnv@CheckEndLeading@EndError + \fi}} +\def\VerbEnv@CheckEndLeading@Continue#1{% + \VerbEnv@CheckEndLeading} +\def\VerbEnv@CheckEndLeading@End#1\FV@Sentinel{} +\def\VerbEnv@CheckEndLeading@EndError{% + \PackageError{fvextra}% + {Discarded text before end of environment \FV@EnvironName}% + {Discarded text before end of environment \FV@EnvironName}% + \let\VerbEnv@v\VerbEnv@v@Error} +\def\VerbEnv@v@Error#1#2{} +\def\VerbEnv@v#1#2{% + \Verb[#1]{#2}% + \expandafter\end\expandafter{\FV@EnvironName}} +\def\endVerbEnv{\global\let\FV@EnvironName\relax} +\define@key{FV}{writefilehandle}{% + \FV@SetWrite#1\FV@Sentinel} +\def\FV@SetWrite#1#2\FV@Sentinel{% + \let\FancyVerbWriteFileHandle\relax + \if\relax\detokenize{#2}\relax + \let\FancyVerbWriteFileHandle#1\relax + \fi + \ifx\FancyVerbWriteFileHandle\relax + \PackageError{fvextra}% + {Missing or invalid file handle for write}% + {Need file handle from \string\newwrite}% + \fi} +\let\FancyVerbWriteFileHandle\relax +\define@key{FV}{writer}{% + \let\FV@Writer#1\relax} +\def\FancyVerbDefaultWriter#1{% + \immediate\write\FancyVerbWriteFileHandle{\detokenize{#1}}} +\fvset{writer=\FancyVerbDefaultWriter} +\newcounter{FancyVerbWriteLine} +\def\VerbatimWrite{% + \FV@Environment + {codes=,commandchars=none,commentchar=none,defineactive,% + gobble=0,formatcom=,firstline,lastline}% + {VerbatimWrite}} +\def\FVB@VerbatimWrite{% + \@bsphack + \begingroup + \setcounter{FancyVerbWriteLine}{0}% + \let\c@FancyVerbLine\c@FancyVerbWriteLine + \FV@UseKeyValues + \FV@DefineWhiteSpace + \def\FV@Space{\space}% + \FV@DefineTabOut + \let\FV@ProcessLine\FV@Writer + \let\FV@FontScanPrep\relax + \let\@noligs\relax + \FancyVerbDefineActive + \FancyVerbFormatCom + \FV@Scan} +\def\FVE@VerbatimWrite{% + \endgroup + \@esphack} +\def\endVerbatimWrite{\FVE@VerbatimWrite} +\define@key{FV}{afterbuffer}{% + \def\FV@afterbuffer{#1}} +\fvset{afterbuffer=} +\def\FancyVerbBufferIndex{0} +\define@key{FV}{bufferer}{% + \let\FV@Bufferer=#1\relax} +\def\FancyVerbDefaultBufferer#1{% + \expandafter\xdef\csname\FancyVerbBufferLineName\FancyVerbBufferIndex\endcsname{% + \detokenize{#1}}} +\fvset{bufferer=\FancyVerbDefaultBufferer} +\define@key{FV}{bufferlengthname}{% + \ifcsname#1\endcsname + \else + \expandafter\xdef\csname#1\endcsname{0}% + \fi + \def\FV@bufferlengthname{#1}% + \expandafter\def\expandafter\FV@bufferlengthmacro\expandafter{% + \csname#1\endcsname}} +\fvset{bufferlengthname=FancyVerbBufferLength} +\define@key{FV}{bufferlinename}{% + \def\FancyVerbBufferLineName{#1}} +\fvset{bufferlinename=FancyVerbBufferLine} +\define@key{FV}{buffername}{% + \fvset{bufferlengthname=#1length,bufferlinename=#1line}} +\newbool{FV@globalbuffer} +\define@booleankey{FV}{globalbuffer}% + {\booltrue{FV@globalbuffer}}% + {\boolfalse{FV@globalbuffer}} +\fvset{globalbuffer=false} +\newcounter{FancyVerbBufferLine} +\newbool{FV@globalbuffer@tmp} +\let\FV@oldbufferlength\relax +\let\FV@bufferlengthmacro@tmp\relax +\let\FancyVerbBufferLineName@tmp\relax +\let\FV@afterbuffer@tmp\relax +\def\VerbatimBuffer{% + \FV@Environment + {codes=,commandchars=none,commentchar=none,defineactive,% + gobble=0,formatcom=,firstline,lastline}% + {VerbatimBuffer}} +\def\FVB@VerbatimBuffer{% + \@bsphack + \begingroup + \FV@UseKeyValues + \setcounter{FancyVerbBufferLine}{\FV@bufferlengthmacro}% + \let\c@FancyVerbLine\c@FancyVerbBufferLine + \xdef\FancyVerbBufferIndex{\FV@bufferlengthmacro}% + \ifbool{FV@globalbuffer}% + {\global\booltrue{FV@globalbuffer@tmp}}% + {\global\boolfalse{FV@globalbuffer@tmp}% + \expandafter\global\expandafter\let\expandafter\FV@oldbufferlength\FV@bufferlengthmacro + \global\let\FV@bufferlengthmacro@tmp\FV@bufferlengthmacro + \global\let\FancyVerbBufferLineName@tmp\FancyVerbBufferLineName}% + \global\let\FV@afterbuffer@tmp\FV@afterbuffer + \FV@DefineWhiteSpace + \def\FV@ProcessLine{% + \xdef\FancyVerbBufferIndex{\the\numexpr\FancyVerbBufferIndex+1\relax}% + \FV@Bufferer}% + \let\FV@FontScanPrep\relax + \let\@noligs\relax + \FancyVerbDefineActive + \FancyVerbFormatCom + \FV@Scan} +\def\FVE@VerbatimBuffer{% + \expandafter\xdef\FV@bufferlengthmacro{\FancyVerbBufferIndex}% + \gdef\FancyVerbBufferIndex{0}% + \endgroup + \@esphack + \begingroup + \FV@afterbuffer@tmp + \global\let\FV@afterbuffer@tmp\relax + \endgroup + \ifbool{FV@globalbuffer@tmp}% + {}% + {\loop\unless\ifnum\FV@bufferlengthmacro@tmp=\FV@oldbufferlength\relax + \expandafter\global\expandafter\let\csname + \FancyVerbBufferLineName@tmp\FV@bufferlengthmacro@tmp + \endcsname\FV@Undefined + \expandafter\xdef\FV@bufferlengthmacro@tmp{% + \the\numexpr\FV@bufferlengthmacro@tmp-1\relax}% + \repeat + \global\let\FV@bufferlengthmacro@tmp\relax + \global\let\FancyVerbBufferLineName@tmp\relax}% + \global\let\FV@oldbufferlength\relax} +\def\endVerbatimBuffer{\FVE@VerbatimBuffer} +\define@key{FV}{insertenvname}{% + \def\FV@VerbatimInsertEnvName{#1}} +\fvset{insertenvname=Verbatim} +\def\FV@Environment@InsertBuffer#1#2{% + \def\FV@KeyValues{#1}% + \FV@GetKeyValues{\@nameuse{FVB@#2}}} +\def\FV@Scan@InsertBuffer{% + \FV@CatCodes + \xdef\FV@EnvironName{\FV@VerbatimInsertEnvName}% + \ifnum\FV@bufferlengthmacro=\z@\relax + \PackageError{fvextra}% + {Buffer length macro \expandafter\string\FV@bufferlengthmacro\space is invalid or zero}% + {}% + \let\FV@GetLine\relax + \fi + \FV@BeginScanning}% +\def\VerbatimInsertBuffer@def@FV@Line#1{% + \FVExtraRetokenizeVArg{\def\FV@Line}{}{#1}} +\def\FancyVerbGetLine@VerbatimInsertBuffer{% + \ifnum\FancyVerbBufferIndex>\FV@bufferlengthmacro\relax + \global\let\FV@EnvironName\relax + \let\next\relax + \else + \ifcsname\FancyVerbBufferLineName\FancyVerbBufferIndex\endcsname + \expandafter\let\expandafter\FV@Line@Buffer + \csname\FancyVerbBufferLineName\FancyVerbBufferIndex\endcsname + \expandafter\VerbatimInsertBuffer@def@FV@Line\expandafter{\FV@Line@Buffer}% + \def\next{\FV@PreProcessLine\FV@GetLine}% + \xdef\FancyVerbBufferIndex{\the\numexpr\FancyVerbBufferIndex+1\relax}% + \else + \def\next{% + \PackageError{fvextra}% + {Buffer with line macro named + "\FancyVerbBufferLineName\FancyVerbBufferIndex" does not exist}% + {Check bufferlinename, bufferlengthname, and globalbuffer settings}% + }% + \fi + \fi + \next} +\newcommand{\VerbatimInsertBuffer}[1][]{% + \begingroup + \let\FV@Scan\FV@Scan@InsertBuffer + \let\FV@CheckScan\relax + \let\FV@Environment\FV@Environment@InsertBuffer + \let\FancyVerbGetLine\FancyVerbGetLine@VerbatimInsertBuffer + \gdef\FancyVerbBufferIndex{1}% + \VerbatimInsertBuffer@i{#1}% + \gdef\FancyVerbBufferIndex{0}% + \endgroup + \@doendpe} +\begingroup +\catcode`\^^M=\active +\gdef\VerbatimInsertBuffer@i#1{% + \begingroup% + \fvset{#1}% + \global\let\FV@CurrentVerbatimInsertEnvName\FV@VerbatimInsertEnvName% + \endgroup% + \csname \FV@CurrentVerbatimInsertEnvName\endcsname[#1]^^M% + \csname end\FV@CurrentVerbatimInsertEnvName\endcsname% + \global\let\FV@CurrentVerbatimInsertEnvName\FV@Undefined}% +\endgroup +\newcommand{\VerbatimClearBuffer}[1][]{% + \begingroup + \def\FV@KeyValues{#1}% + \FV@UseKeyValues + \xdef\FancyVerbBufferIndex{\FV@bufferlengthmacro}% + \expandafter\xdef\FV@bufferlengthmacro{0}% + \loop\unless\ifnum\FancyVerbBufferIndex<1\relax + \expandafter\global\expandafter\let + \csname\FancyVerbBufferLineName\FancyVerbBufferIndex\endcsname + \FV@Undefined + \xdef\FancyVerbBufferIndex{\the\numexpr\FancyVerbBufferIndex-1\relax}% + \repeat + \gdef\FancyVerbBufferIndex{0}% + \endgroup} +\def\FV@Command#1#2{% + \FVExtra@ifstarVArg + {\def\FV@KeyValues{#1,showspaces,showtabs}\FV@@Command{#2}}% + {\def\FV@KeyValues{#1}\FV@@Command{#2}}} +\def\FV@@Command#1{% + \FVExtra@ifnextcharVArg[% + {\FV@GetKeyValues{\@nameuse{FVC@#1}}}% + {\@nameuse{FVC@#1}}} +\def\@CustomVerbatimCommand#1#2#3#4{% + \begingroup\fvset{#4}\endgroup + \@ifundefined{FVC@#3}% + {\FV@Error{Command `\string#3' is not a FancyVerb command.}\@eha}% + {\ifcsname Robust#3\endcsname + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\expandafter\let\expandafter\@tempa\csname #3\endcsname + \def\@tempb##1##2##3{% + \expandafter\def\expandafter\@tempc\expandafter{% + \csname Robust\expandafter\@gobble\string#2\endcsname}% + \def\@tempd####1{% + #1{#2}{##1####1##3}}% + \expandafter\@tempd\@tempc + \expandafter\protected\expandafter\def\@tempc{\FV@Command{#4}{#3}}}% + \expandafter\@tempb\@tempa}% + {#1{#2}{\FV@Command{#4}{#3}}}}} +\def\FancyVerbSpace{% + \makebox[0.5em]{% + \kern.07em + \vrule height.3ex + \hrulefill + \vrule height.3ex + \kern.07em}} +\newcounter{FV@TrueTabGroupLevel} +\def\FV@@ObeyTabs#1{% + \let\FV@Space@Orig\FV@Space + \let\FV@Space\FV@Space@ObeyTabs + \edef\FV@TmpCurrentGroupLevel{\the\currentgrouplevel}% + \setcounter{FV@TrueTabGroupLevel}{\FV@TmpCurrentGroupLevel}% + \addtocounter{FV@TrueTabGroupLevel}{1}% + \setbox\FV@TabBox=\hbox{#1}\box\FV@TabBox + \let\FV@Space\FV@Space@Orig} +\def\FV@TrueTab{% + \ifnum\value{FV@TrueTabGroupLevel}=\the\currentgrouplevel\relax + \expandafter\FV@TrueTab@NoGroup + \else + \expandafter\FV@TrueTab@Group + \fi} +\let\FV@TrueTabSaveWidth\relax +\newcounter{FV@TrueTabCounter} +\def\FV@TrueTabSaveWidth@Save{% + \expandafter\xdef\csname FV@TrueTab:Width\arabic{FV@TrueTabCounter}\endcsname{% + \number\@tempdima}% + \stepcounter{FV@TrueTabCounter}} +\def\FV@TrueTab@NoGroup{% + \egroup + \@tempdima=\FV@ObeyTabSize sp\relax + \@tempcnta=\wd\FV@TabBox + \advance\@tempcnta\FV@@ObeyTabSize\relax + \divide\@tempcnta\@tempdima + \multiply\@tempdima\@tempcnta + \advance\@tempdima-\wd\FV@TabBox + \FV@TrueTabSaveWidth + \setbox\FV@TabBox=\hbox\bgroup + \unhbox\FV@TabBox\hbox to\@tempdima{\hss\FV@TabChar}} +\newbool{FV@ObeyTabs@Whitespace@Tab} +\def\FV@TrueTab@Group{% + \booltrue{FV@ObeyTabs@Whitespace@Tab}% + \gdef\FV@TmpWhitespace{\FV@FVTabToken}% + \FV@ObeyTabs@ScanWhitespace} +\def\FV@Space@ObeyTabs{% + \ifnum\value{FV@TrueTabGroupLevel}=\the\currentgrouplevel\relax + \expandafter\FV@Space@ObeyTabs@NoGroup + \else + \expandafter\FV@Space@ObeyTabs@Group + \fi} +\def\FV@Space@ObeyTabs@NoGroup{\FV@Space@Orig} +\def\FV@Space@ObeyTabs@Group{% + \boolfalse{FV@ObeyTabs@Whitespace@Tab}% + \gdef\FV@TmpWhitespace{\FV@FVSpaceToken}% + \FV@ObeyTabs@ScanWhitespace} +\def\FV@ObeyTabs@ScanWhitespace{% + \@ifnextchar\FV@FVSpaceToken% + {\FV@TrueTab@CaptureWhitespace@Space}% + {\ifx\@let@token\FV@FVTabToken + \expandafter\FV@TrueTab@CaptureWhitespace@Tab + \else + \expandafter\FV@ObeyTabs@ResolveWhitespace + \fi}} +\def\FV@TrueTab@CaptureWhitespace@Space#1{% + \g@addto@macro\FV@TmpWhitespace{\FV@FVSpaceToken}% + \FV@ObeyTabs@ScanWhitespace} +\def\FV@TrueTab@CaptureWhitespace@Tab#1{% + \booltrue{FV@ObeyTabs@Whitespace@Tab}% + \g@addto@macro\FV@TmpWhitespace{\FV@FVTabToken}% + \FV@ObeyTabs@ScanWhitespace} +\newbox\FV@TabBox@Group +\def\FV@TrueTab@Group@Expand{% + \egroup + \@tempdima=\FV@ObeyTabSize sp\relax + \@tempcnta=\wd\FV@TabBox@Group + \advance\@tempcnta\FV@@ObeyTabSize\relax + \divide\@tempcnta\@tempdima + \multiply\@tempdima\@tempcnta + \advance\@tempdima-\wd\FV@TabBox@Group + \FV@TrueTabSaveWidth + \setbox\FV@TabBox@Group=\hbox\bgroup + \unhbox\FV@TabBox@Group\hbox to\@tempdima{\hss\FV@TabChar}} +\def\FV@ObeyTabs@ResolveWhitespace{% + \let\FV@Space\FV@Space@Orig + \let\FV@Tab\FV@TrueTab@Group@Expand + \expandafter\FV@ObeyTabs@ResolveWhitespace@i\expandafter{\FV@TmpWhitespace}% + \let\FV@Space\FV@Space@ObeyTabs + \let\FV@Tab\FV@TrueTab} +\def\FV@ObeyTabs@ResolveWhitespace@i#1{% + \ifbool{FV@ObeyTabs@Whitespace@Tab}% + {\setbox\FV@TabBox@Group=\hbox{#1}\box\FV@TabBox@Group}% + {#1}} +\def\FancyVerbMathSpace{ } +\def\FV@SetupMathSpace{% + \everymath\expandafter{\the\everymath\let\FV@Space\FancyVerbMathSpace}} +\g@addto@macro\FV@FormattingPrep@PreHook{\FV@SetupMathSpace} +\begingroup +\catcode`\'=\active +\catcode`\^=7 +\gdef\FV@pr@m@s{% + \ifx'\@let@token + \expandafter\pr@@@s + \else + \ifx^\@let@token + \expandafter\expandafter\expandafter\pr@@@t + \else + \egroup + \fi + \fi} +\endgroup +\def\FV@SetupMathFont{% + \everymath\expandafter{\the\everymath\fontfamily{\familydefault}\selectfont}} +\g@addto@macro\FV@FormattingPrep@PreHook{\FV@SetupMathFont} +\def\FV@SetupMathLigs{% + \everymath\expandafter{% + \the\everymath + \let\pr@m@s\FV@pr@m@s + \begingroup\lccode`\~=`\'\lowercase{\endgroup\def~}{% + \ifmmode\expandafter\active@math@prime\else'\fi}% + \begingroup\lccode`\~=`\`\lowercase{\endgroup\def~}{`}% + \begingroup\lccode`\~=`\<\lowercase{\endgroup\def~}{<}% + \begingroup\lccode`\~=`\>\lowercase{\endgroup\def~}{>}% + \begingroup\lccode`\~=`\,\lowercase{\endgroup\def~}{,}% + \begingroup\lccode`\~=`\-\lowercase{\endgroup\def~}{-}% + }% +} +\g@addto@macro\FV@FormattingPrep@PreHook{\FV@SetupMathLigs} +\def\FV@BeginListFrame@Lines{% + \begingroup + \lineskip\z@skip + \FV@SingleFrameLine{\z@}% + \kern-0.5\baselineskip\relax + \baselineskip\z@skip + \kern\FV@FrameSep\relax + \penalty\@M + \endgroup} +\define@key{FV}{rulecolor}{% + \ifstrempty{#1}% + {\let\FancyVerbRuleColor\relax}% + {\ifstrequal{#1}{none}% + {\let\FancyVerbRuleColor\relax}% + {\def\@tempa{#1}% + \FV@KVProcess@RuleColor#1\FV@Undefined}}} +\def\FV@KVProcess@RuleColor#1#2\FV@Undefined{% + \ifx#1\color + \else + \expandafter\def\expandafter\@tempa\expandafter{% + \expandafter\color\expandafter{\@tempa}}% + \fi + \let\FancyVerbRuleColor\@tempa} +\fvset{rulecolor=none} +\define@key{FV}{fillcolor}{% + \ifstrempty{#1}% + {\let\FancyVerbFillColor\relax}% + {\ifstrequal{#1}{none}% + {\let\FancyVerbFillColor\relax}% + {\def\@tempa{#1}% + \FV@KVProcess@FillColor#1\FV@Undefined}}} +\def\FV@KVProcess@FillColor#1#2\FV@Undefined{% + \ifx#1\color + \else + \expandafter\def\expandafter\@tempa\expandafter{% + \expandafter\color\expandafter{\@tempa}}% + \fi + \let\FancyVerbFillColor\@tempa} +\fvset{fillcolor=none} +\define@booleankey{FV}{linenos}% + {\@nameuse{FV@Numbers@left}}{\@nameuse{FV@Numbers@none}} +\define@key{FV}{tab}{\def\FancyVerbTab{#1}} +\define@key{FV}{tabcolor}% + {\ifstrempty{#1}% + {\let\FV@TabColor\relax}% + {\ifstrequal{#1}{none}% + {\let\FV@TabColor\relax}% + {\def\FV@TabColor{\textcolor{#1}}}}} +\define@booleankey{FV}{showtabs}% + {\def\FV@TabChar{\FV@TabColor{\FancyVerbTab}}}% + {\let\FV@TabChar\relax} +\fvset{tabcolor=none, showtabs=false} +\newbool{FV@showspaces} +\define@booleankey{FV}{showspaces}% + {\booltrue{FV@showspaces}}% + {\boolfalse{FV@showspaces}} +\fvset{showspaces=false} +\define@key{FV}{space}{\def\FancyVerbSpace{#1}} +\define@key{FV}{spacecolor}% + {\ifstrempty{#1}% + {\let\FV@SpaceColor\relax}% + {\ifstrequal{#1}{none}% + {\let\FV@SpaceColor\relax}% + {\def\FV@SpaceColor{\textcolor{#1}}}}} +\fvset{spacecolor=none} +\define@key{FV}{spacebreak}{% + \def\FancyVerbSpaceBreak{#1}} +\fvset{spacebreak=\discretionary{}{}{}} +\newbool{FV@breakcollapsespaces} +\define@booleankey{FV}{breakcollapsespaces}% + {\booltrue{FV@breakcollapsespaces}}% + {\boolfalse{FV@breakcollapsespaces}}% +\fvset{breakcollapsespaces=true} +\def\FV@DefFVSpace{% + \ifbool{FV@showspaces}% + {\ifbool{FV@breaklines}% + {\ifcsname FV@BreakBefore@Token\FV@SpaceCatTen\endcsname + \def\FV@Space{\FV@SpaceColor{\FancyVerbSpace}}% + \else\ifcsname FV@BreakAfter@Token\FV@SpaceCatTen\endcsname + \def\FV@Space{\FV@SpaceColor{\FancyVerbSpace}}% + \else + \def\FV@Space{\FV@SpaceColor{\FancyVerbSpace}\FancyVerbSpaceBreak}% + \fi\fi}% + {\def\FV@Space{\FV@SpaceColor{\FancyVerbSpace}}}}% + {\ifbool{FV@breaklines}% + {\ifcsname FV@BreakBefore@Token\FV@SpaceCatTen\endcsname + \def\FV@Space{\mbox{\FV@SpaceCatTen}}% + \else\ifcsname FV@BreakAfter@Token\FV@SpaceCatTen\endcsname + \def\FV@Space{\mbox{\FV@SpaceCatTen}}% + \else + \ifbool{FV@breakcollapsespaces}% + {\def\FV@Space{\FV@SpaceCatTen}}% + {\def\FV@Space{\mbox{\FV@SpaceCatTen}\FancyVerbSpaceBreak}}% + \fi\fi}% + {\def\FV@Space{\FV@SpaceCatTen}}}}% +\AtEndOfPackage{% + \g@addto@macro\FV@FormattingPrep@PreHook{\FV@DefFVSpace}} +\define@booleankey{FV}{mathescape}% + {\let\FancyVerbMathEscape\FV@MathEscape}% + {\let\FancyVerbMathEscape\relax} +\def\FV@MathEscape{\catcode`\$=3\catcode`\&=4\catcode`\^=7\catcode`\_=8\relax} +\FV@AddToHook\FV@CatCodesHook\FancyVerbMathEscape +\fvset{mathescape=false} +\define@booleankey{FV}{beameroverlays}% + {\let\FancyVerbBeamerOverlays\FV@BeamerOverlays}% + {\let\FancyVerbBeamerOverlays\relax} +\def\FV@BeamerOverlays{% + \expandafter\def\expandafter\@noligs\expandafter{\@noligs + \catcode`\<=12\catcode`\>=12\relax}} +\FV@AddToHook\FV@FormattingPrep@PreHook\FancyVerbBeamerOverlays +\fvset{beameroverlays=false} +\newbool{FV@CurlyQuotes} +\define@booleankey{FV}{curlyquotes}% + {\booltrue{FV@CurlyQuotes}}% + {\boolfalse{FV@CurlyQuotes}} +\def\FancyVerbCurlyQuotes{% + \ifbool{FV@CurlyQuotes}% + {\expandafter\def\expandafter\@noligs\expandafter{\@noligs + \begingroup\lccode`\~=`\`\lowercase{\endgroup\def~}{`}% + \begingroup\lccode`\~=`\'\lowercase{\endgroup\def~}{'}}}% + {}} +\g@addto@macro\FV@FormattingPrep@PreHook{\FancyVerbCurlyQuotes} +\fvset{curlyquotes=false} +\define@key{FV}{fontencoding}% + {\ifstrempty{#1}% + {\let\FV@FontEncoding\relax}% + {\ifstrequal{#1}{none}% + {\let\FV@FontEncoding\relax}% + {\def\FV@FontEncoding{\fontencoding{#1}}}}} +\expandafter\def\expandafter\FV@SetupFont\expandafter{% + \expandafter\FV@FontEncoding\FV@SetupFont} +\fvset{fontencoding=none} +\def\FancyVerbFormatLine#1{#1} +\def\FancyVerbFormatText#1{#1} +\def\FV@ListProcessLine@NoBreak#1{% + \hbox to \hsize{% + \kern\leftmargin + \hbox to \linewidth{% + \FV@LeftListNumber + \FV@LeftListFrame + \FV@BGColor@List{% + \FancyVerbFormatLine{% + \FancyVerbHighlightLine{% + \FV@ObeyTabs{\FancyVerbFormatText{#1}}}}}\hss + \FV@RightListFrame + \FV@RightListNumber}% + \hss}} +\def\FV@BProcessLine#1{% + \hbox{\FancyVerbFormatLine{% + \ifx\FancyVerbBackgroundColor\relax + \else + \expandafter\FancyVerbBackgroundColorVPhantom + \fi + \FancyVerbHighlightLine{% + \FV@ObeyTabs{\FancyVerbFormatText{#1}}}}}} +\newbool{FV@NumberFirstLine} +\define@booleankey{FV}{numberfirstline}% + {\booltrue{FV@NumberFirstLine}}% + {\boolfalse{FV@NumberFirstLine}} +\fvset{numberfirstline=false} +\newbool{FV@StepNumberFromFirst} +\define@booleankey{FV}{stepnumberfromfirst}% + {\booltrue{FV@StepNumberFromFirst}}% + {\boolfalse{FV@StepNumberFromFirst}} +\fvset{stepnumberfromfirst=false} +\newbool{FV@StepNumberOffsetValues} +\define@booleankey{FV}{stepnumberoffsetvalues}% + {\booltrue{FV@StepNumberOffsetValues}}% + {\boolfalse{FV@StepNumberOffsetValues}} +\fvset{stepnumberoffsetvalues=false} +\def\FV@Numbers@left{% + \let\FV@RightListNumber\relax + \def\FV@LeftListNumber{% + \ifx\FancyVerbStartNum\z@ + \let\FancyVerbStartNum\@ne + \fi + \ifbool{FV@StepNumberFromFirst}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FancyVerbStartNum + \advance\@tempcntb\FV@StepNumber + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \advance\@tempcnta\@tempcntb + \advance\@tempcnta-\FancyVerbStartNum + \@tempcntb=\@tempcnta}% + {\ifbool{FV@StepNumberOffsetValues}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FV@CodeLineNo}% + {\@tempcnta=\c@FancyVerbLine + \@tempcntb=\c@FancyVerbLine}}% + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \ifnum\@tempcnta=\@tempcntb + \if@FV@NumberBlankLines + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \else + \ifx\FV@Line\empty + \else + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \fi + \fi + \else + \ifbool{FV@NumberFirstLine}{% + \ifnum\FV@CodeLineNo=\FancyVerbStartNum + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \fi}{}% + \fi}% +} +\def\FV@Numbers@right{% + \let\FV@LeftListNumber\relax + \def\FV@RightListNumber{% + \ifx\FancyVerbStartNum\z@ + \let\FancyVerbStartNum\@ne + \fi + \ifbool{FV@StepNumberFromFirst}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FancyVerbStartNum + \advance\@tempcntb\FV@StepNumber + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \advance\@tempcnta\@tempcntb + \advance\@tempcnta-\FancyVerbStartNum + \@tempcntb=\@tempcnta}% + {\ifbool{FV@StepNumberOffsetValues}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FV@CodeLineNo}% + {\@tempcnta=\c@FancyVerbLine + \@tempcntb=\c@FancyVerbLine}}% + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \ifnum\@tempcnta=\@tempcntb + \if@FV@NumberBlankLines + \hbox to\z@{\kern\FV@NumberSep\theFancyVerbLine\hss}% + \else + \ifx\FV@Line\empty + \else + \hbox to\z@{\kern\FV@NumberSep\theFancyVerbLine\hss}% + \fi + \fi + \else + \ifbool{FV@NumberFirstLine}{% + \ifnum\FV@CodeLineNo=\FancyVerbStartNum + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \fi}{}% + \fi}% +} +\def\FV@Numbers@both{% + \def\FV@LeftListNumber{% + \ifx\FancyVerbStartNum\z@ + \let\FancyVerbStartNum\@ne + \fi + \ifbool{FV@StepNumberFromFirst}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FancyVerbStartNum + \advance\@tempcntb\FV@StepNumber + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \advance\@tempcnta\@tempcntb + \advance\@tempcnta-\FancyVerbStartNum + \@tempcntb=\@tempcnta}% + {\ifbool{FV@StepNumberOffsetValues}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FV@CodeLineNo}% + {\@tempcnta=\c@FancyVerbLine + \@tempcntb=\c@FancyVerbLine}}% + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \ifnum\@tempcnta=\@tempcntb + \if@FV@NumberBlankLines + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \else + \ifx\FV@Line\empty + \else + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \fi + \fi + \else + \ifbool{FV@NumberFirstLine}{% + \ifnum\FV@CodeLineNo=\FancyVerbStartNum + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \fi}{}% + \fi}% + \def\FV@RightListNumber{% + \ifx\FancyVerbStartNum\z@ + \let\FancyVerbStartNum\@ne + \fi + \ifbool{FV@StepNumberFromFirst}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FancyVerbStartNum + \advance\@tempcntb\FV@StepNumber + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \advance\@tempcnta\@tempcntb + \advance\@tempcnta-\FancyVerbStartNum + \@tempcntb=\@tempcnta}% + {\ifbool{FV@StepNumberOffsetValues}% + {\@tempcnta=\FV@CodeLineNo + \@tempcntb=\FV@CodeLineNo}% + {\@tempcnta=\c@FancyVerbLine + \@tempcntb=\c@FancyVerbLine}}% + \divide\@tempcntb\FV@StepNumber + \multiply\@tempcntb\FV@StepNumber + \ifnum\@tempcnta=\@tempcntb + \if@FV@NumberBlankLines + \hbox to\z@{\kern\FV@NumberSep\theFancyVerbLine\hss}% + \else + \ifx\FV@Line\empty + \else + \hbox to\z@{\kern\FV@NumberSep\theFancyVerbLine\hss}% + \fi + \fi + \else + \ifbool{FV@NumberFirstLine}{% + \ifnum\FV@CodeLineNo=\FancyVerbStartNum + \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% + \fi}{}% + \fi}% +} +\define@key{FV}{backgroundcolor}{% + \def\FancyVerbBackgroundColor{#1}% + \ifx\FancyVerbBackgroundColor\FV@None + \let\FancyVerbBackgroundColor\relax + \else\ifx\FancyVerbBackgroundColor\@empty + \let\FancyVerbBackgroundColor\relax + \fi\fi}% +\fvset{backgroundcolor=none} +\define@key{FV}{bgcolor}{% + \fvset{backgroundcolor=#1}} +\define@key{FV}{backgroundcolorvphantom}{% + \def\FancyVerbBackgroundColorVPhantom{#1}% + \ifx\FancyVerbBackgroundColorVPhantom\FV@None + \let\FancyVerbBackgroundColorVPhantom\relax + \else\ifx\FancyVerbBackgroundColorVPhantom\@empty + \let\FancyVerbBackgroundColorVPhantom\relax + \fi\fi} +\fvset{backgroundcolorvphantom=\vphantom{\"Apgjy}} +\define@key{FV}{bgcolorvphantom}{% + \fvset{backgroundcolorvphantom=#1}} +\let\FancyVerbBackgroundColorPadding\relax +\def\FV@backgroundcolorpadding@none@framenotsingle{% + \fvset{frame=none,framerule,rulecolor=none}} +\def\FV@backgroundcolorpadding@dim@framenotsingle{% + \fvset{frame=single,framerule=0pt,rulecolor=\FancyVerbBackgroundColor}} +\define@key{FV}{backgroundcolorpadding}{% + \def\FancyVerbBackgroundColorPadding{#1}% + \ifx\FancyVerbBackgroundColorPadding\FV@None + \let\FancyVerbBackgroundColorPadding\relax + \else\ifx\FancyVerbBackgroundColorPadding\@empty + \let\FancyVerbBackgroundColorPadding\relax + \fi\fi + \let\FV@Next\relax + \ifx\FancyVerbBackgroundColorPadding\relax + \ifx\FV@BeginListFrame\FV@BeginListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@none@framenotsingle + \fi + \ifx\FV@LeftListFrame\FV@LeftListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@none@framenotsingle + \fi + \ifx\FV@RightListFrame\FV@RightListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@none@framenotsingle + \fi + \ifx\FV@EndListFrame\FV@EndListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@none@framenotsingle + \fi + \FV@Next + \fvset{framesep,fillcolor=none}% + \else + \ifx\FV@BeginListFrame\FV@BeginListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@dim@framenotsingle + \fi + \ifx\FV@LeftListFrame\FV@LeftListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@dim@framenotsingle + \fi + \ifx\FV@RightListFrame\FV@RightListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@dim@framenotsingle + \fi + \ifx\FV@EndListFrame\FV@EndListFrame@Single + \else + \let\FV@Next\FV@backgroundcolorpadding@dim@framenotsingle + \fi + \FV@Next + \fvset{framesep=#1,fillcolor=\FancyVerbBackgroundColor}% + \fi} +\define@key{FV}{bgcolorpadding}{\fvset{backgroundcolorpadding=#1}} +\def\FV@BGColor@List#1{% + \ifx\FancyVerbBackgroundColor\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {#1}% + {\setlength{\FV@TmpLength}{\fboxsep}% + \setlength{\fboxsep}{0pt}% + \colorbox{\FancyVerbBackgroundColor}{% + \setlength{\fboxsep}{\FV@TmpLength}% + \rlap{\FancyVerbBackgroundColorVPhantom\strut#1}% + \hspace{\linewidth}% + \ifx\FV@RightListFrame\relax\else + \hspace{-\FV@FrameSep}% + \hspace{-\FV@FrameRule}% + \fi + \ifx\FV@LeftListFrame\relax\else + \hspace{-\FV@FrameSep}% + \hspace{-\FV@FrameRule}% + \fi}% + \hss}} +\let\FV@BVerbatimBegin@NoBGColor\FV@BVerbatimBegin +\let\FV@BVerbatimEnd@NoBGColor\FV@BVerbatimEnd +\def\FV@BVerbatimBegin{% + \begingroup + \FV@UseKeyValues + \FV@FormattingPrep + \let\FV@FormattingPrep\relax + \FV@ObeyTabsInit + \let\FV@ObeyTabsInit\relax + \ifx\FancyVerbBackgroundColor\relax + \expandafter\FV@BVerbatimBegin@NoBGColor + \else + \expandafter\FV@BVerbatimBegin@BGColor + \fi} +\def\FV@BVerbatimEnd{% + \ifx\FancyVerbBackgroundColor\relax + \expandafter\FV@BVerbatimEnd@NoBGColor + \else + \expandafter\FV@BVerbatimEnd@BGColor + \fi + \endgroup} +\def\FV@BVerbatimBegin@BGColor{% + \gdef\FV@TheVerbatim{}% + \ifx\FV@boxwidth\relax + \gdef\FV@boxwidth@tmp{0pt}% + \def\FV@ProcessLine##1{% + \sbox{\FV@LineBox}{\FV@BProcessLine{##1}}% + \ifdim\wd\FV@LineBox>\FV@boxwidth@tmp\relax + \xdef\FV@boxwidth@tmp{\the\wd\FV@LineBox}% + \fi + \expandafter\gdef\expandafter\FV@TheVerbatim\expandafter{% + \FV@TheVerbatim\FV@ProcessLine{##1}}}% + \else + \def\FV@ProcessLine##1{% + \expandafter\gdef\expandafter\FV@TheVerbatim\expandafter{% + \FV@TheVerbatim\FV@ProcessLine{##1}}}% + \fi} +\def\FV@BVerbatimEnd@BGColor{% + \ifx\FV@boxwidth\relax + \let\FV@boxwidth\FV@boxwidth@tmp + \global\let\FV@boxwidth@tmp\FV@Undefined + \fi + \setlength{\FV@TmpLength}{\fboxsep}% + \ifx\FancyVerbBackgroundColorPadding\relax + \setlength{\fboxsep}{0pt}% + \else + \setlength{\fboxsep}{\FancyVerbBackgroundColorPadding}% + \fi + \colorbox{\FancyVerbBackgroundColor}{% + \setlength{\fboxsep}{\FV@TmpLength}% + \FV@BVerbatimBegin@NoBGColor\FV@TheVerbatim\FV@BVerbatimEnd@NoBGColor}% + \gdef\FV@TheVerbatim{}} +\define@key{FV}{highlightlines}{\def\FV@HighlightLinesList{#1}}% +\fvset{highlightlines=} +\define@key{FV}{highlightcolor}{\def\FancyVerbHighlightColor{#1}}% +\let\FancyVerbHighlightColor\@empty +\ifcsname definecolor\endcsname +\ifx\definecolor\relax +\else + \definecolor{FancyVerbHighlightColor}{rgb}{0.878, 1, 1} + \fvset{highlightcolor=FancyVerbHighlightColor} +\fi\fi +\AtBeginDocument{% + \ifx\FancyVerbHighlightColor\@empty + \ifcsname definecolor\endcsname + \ifx\definecolor\relax + \else + \definecolor{FancyVerbHighlightColor}{rgb}{0.878, 1, 1} + \fvset{highlightcolor=FancyVerbHighlightColor} + \fi\fi + \fi} +\def\FancyVerbHighlightLine#1{#1} +\def\FV@HighlightLine#1{% + \@tempcnta=\c@FancyVerbLine + \@tempcntb=\c@FancyVerbLine + \ifcsname FV@HighlightLine:\number\@tempcnta\endcsname + \advance\@tempcntb\m@ne + \ifcsname FV@HighlightLine:\number\@tempcntb\endcsname + \advance\@tempcntb\tw@ + \ifcsname FV@HighlightLine:\number\@tempcntb\endcsname + \let\FV@HighlightLine@Next\FancyVerbHighlightLineMiddle + \else + \let\FV@HighlightLine@Next\FancyVerbHighlightLineLast + \fi + \else + \advance\@tempcntb\tw@ + \ifcsname FV@HighlightLine:\number\@tempcntb\endcsname + \let\FV@HighlightLine@Next\FancyVerbHighlightLineFirst + \else + \let\FV@HighlightLine@Next\FancyVerbHighlightLineSingle + \fi + \fi + \else + \let\FV@HighlightLine@Next\FancyVerbHighlightLineNormal + \fi + \FV@HighlightLine@Next{#1}% +} +\def\FancyVerbHighlightLineNormal#1{#1} +\newlength{\FV@TmpLength} +\def\FancyVerbHighlightLineFirst#1{% + \setlength{\FV@TmpLength}{\fboxsep}% + \setlength{\fboxsep}{0pt}% + \colorbox{\FancyVerbHighlightColor}{% + \setlength{\fboxsep}{\FV@TmpLength}% + \rlap{\strut#1}% + \hspace{\linewidth}% + \ifx\FV@RightListFrame\relax\else + \hspace{-\FV@FrameSep}% + \hspace{-\FV@FrameRule}% + \fi + \ifx\FV@LeftListFrame\relax\else + \hspace{-\FV@FrameSep}% + \hspace{-\FV@FrameRule}% + \fi + }% + \hss +} +\let\FancyVerbHighlightLineMiddle\FancyVerbHighlightLineFirst +\let\FancyVerbHighlightLineLast\FancyVerbHighlightLineFirst +\let\FancyVerbHighlightLineSingle\FancyVerbHighlightLineFirst +\def\FV@HighlightLinesPrep{% + \ifx\FV@HighlightLinesList\@empty + \else + \let\FancyVerbHighlightLine\FV@HighlightLine + \expandafter\FV@HighlightLinesPrep@i + \fi} +\def\FV@HighlightLinesPrep@i{% + \renewcommand{\do}[1]{% + \ifstrempty{##1}{}{\FV@HighlightLinesParse##1-\FV@Undefined}}% + \expandafter\docsvlist\expandafter{\FV@HighlightLinesList}} +\def\FV@HighlightLinesParse#1-#2\FV@Undefined{% + \ifstrempty{#2}% + {\FV@HighlightLinesParse@Single{#1}}% + {\FV@HighlightLinesParse@Range{#1}#2\relax}} +\def\FV@HighlightLinesParse@Single#1{% + \expandafter\let\csname FV@HighlightLine:\detokenize{#1}\endcsname\relax} +\newcounter{FV@HighlightLinesStart} +\newcounter{FV@HighlightLinesStop} +\def\FV@HighlightLinesParse@Range#1#2-{% + \setcounter{FV@HighlightLinesStart}{#1}% + \setcounter{FV@HighlightLinesStop}{#2}% + \stepcounter{FV@HighlightLinesStop}% + \FV@HighlightLinesParse@Range@Loop} +\def\FV@HighlightLinesParse@Range@Loop{% + \ifnum\value{FV@HighlightLinesStart}<\value{FV@HighlightLinesStop}\relax + \expandafter\let\csname FV@HighlightLine:\arabic{FV@HighlightLinesStart}\endcsname\relax + \stepcounter{FV@HighlightLinesStart}% + \expandafter\FV@HighlightLinesParse@Range@Loop + \fi} +\g@addto@macro\FV@FormattingPrep@PreHook{\FV@HighlightLinesPrep} +\def\FV@StepLineNo@Patch@HighlightLine{% + \ifcsname FV@HighlightLine:\number\c@FancyVerbLine\endcsname + \@tempcnta=\c@FancyVerbLine + \advance\@tempcnta\@ne + \ifcsname FV@HighlightLine:\number\@tempcnta\endcsname + \else + \expandafter\let + \csname FV@HighlightLine:\number\c@FancyVerbLine\endcsname\FV@Undefined + \fi + \fi} +\patchcmd{\FV@StepLineNo}% + {\ifx\FV@Line\empty}% + {\ifx\FV@Line\empty\FV@StepLineNo@Patch@HighlightLine}% + {}% + {\PackageError{fvextra}% + {Failed to patch \string\FV@StepLineNo\ to make highlightlines + compatible with numberblanklines}% + {Failed to patch \string\FV@StepLineNo\ to make highlightlines + compatible with numberblanklines}} +\newcount\FV@LoopCount +\newbox\FV@NCharsBox +\def\FV@SetToWidthNChars#1#2{% + \FV@LoopCount=#2\relax + \ifnum\FV@LoopCount>0 + \def\FV@NChars{}% + \loop + \ifnum\FV@LoopCount>0 + \expandafter\def\expandafter\FV@NChars\expandafter{\FV@NChars x}% + \fi + \advance\FV@LoopCount by -1 + \ifnum\FV@LoopCount>0 + \repeat + \setbox\FV@NCharsBox\hbox{\FV@NChars}% + #1=\wd\FV@NCharsBox + \else + #1=0pt\relax + \fi +} +\newbool{FV@breaklines} +\define@booleankey{FV}{breaklines}% + {\booltrue{FV@breaklines}% + \let\FV@ListProcessLine\FV@ListProcessLine@Break}% + {\boolfalse{FV@breaklines}% + \let\FV@ListProcessLine\FV@ListProcessLine@NoBreak} +\AtEndOfPackage{\fvset{breaklines=false}} +\def\FV@BreakLinesLuaTeXHook{% + \expandafter\def\expandafter\@noligs\expandafter{\@noligs + \begingroup\lccode`\~=`\-\lowercase{\endgroup\def~}{\leavevmode\kern\z@\mbox{-}}}} +\ifcsname directlua\endcsname + \ifx\directlua\relax + \else + \FV@AddToHook\FV@FormattingPrep@PreHook\FV@BreakLinesLuaTeXHook + \fi +\fi +\def\FV@BreakLinesIndentationHook{} +\g@addto@macro\FV@FormattingPrep@PostHook{% + \ifFV@breaklines + \FV@BreakLinesIndentationHook + \fi} +\newdimen\FV@BreakIndent +\newcount\FV@BreakIndentNChars +\define@key{FV}{breakindent}{% + \FV@BreakIndent=#1\relax + \FV@BreakIndentNChars=0\relax} +\define@key{FV}{breakindentnchars}{\FV@BreakIndentNChars=#1\relax} +\g@addto@macro\FV@BreakLinesIndentationHook{% + \ifnum\FV@BreakIndentNChars>0 + \FV@SetToWidthNChars{\FV@BreakIndent}{\FV@BreakIndentNChars}% + \fi} +\fvset{breakindentnchars=0} +\newbool{FV@breakautoindent} +\define@booleankey{FV}{breakautoindent}% + {\booltrue{FV@breakautoindent}}{\boolfalse{FV@breakautoindent}} +\fvset{breakautoindent=true} +\define@key{FV}{breaksymbolleft}{\def\FancyVerbBreakSymbolLeft{#1}} +\define@key{FV}{breaksymbol}{\fvset{breaksymbolleft=#1}} +\fvset{breaksymbolleft=\tiny\ensuremath{\hookrightarrow}} +\define@key{FV}{breaksymbolright}{\def\FancyVerbBreakSymbolRight{#1}} +\fvset{breaksymbolright={}} +\newdimen\FV@BreakSymbolSepLeft +\newcount\FV@BreakSymbolSepLeftNChars +\define@key{FV}{breaksymbolsepleft}{% + \FV@BreakSymbolSepLeft=#1\relax + \FV@BreakSymbolSepLeftNChars=0\relax} +\define@key{FV}{breaksymbolsep}{\fvset{breaksymbolsepleft=#1}} +\define@key{FV}{breaksymbolsepleftnchars}{\FV@BreakSymbolSepLeftNChars=#1\relax} +\define@key{FV}{breaksymbolsepnchars}{\fvset{breaksymbolsepleftnchars=#1}} +\g@addto@macro\FV@BreakLinesIndentationHook{% + \ifnum\FV@BreakSymbolSepLeftNChars>0 + \FV@SetToWidthNChars{\FV@BreakSymbolSepLeft}{\FV@BreakSymbolSepLeftNChars}% + \fi} +\fvset{breaksymbolsepleftnchars=2} +\newdimen\FV@BreakSymbolSepRight +\newcount\FV@BreakSymbolSepRightNChars +\define@key{FV}{breaksymbolsepright}{% + \FV@BreakSymbolSepRight=#1\relax + \FV@BreakSymbolSepRightNChars=0\relax} +\define@key{FV}{breaksymbolseprightnchars}{\FV@BreakSymbolSepRightNChars=#1\relax} +\g@addto@macro\FV@BreakLinesIndentationHook{% + \ifnum\FV@BreakSymbolSepRightNChars>0 + \FV@SetToWidthNChars{\FV@BreakSymbolSepRight}{\FV@BreakSymbolSepRightNChars}% + \fi} +\fvset{breaksymbolseprightnchars=2} +\newdimen\FV@BreakSymbolIndentLeft +\newcount\FV@BreakSymbolIndentLeftNChars +\define@key{FV}{breaksymbolindentleft}{% + \FV@BreakSymbolIndentLeft=#1\relax + \FV@BreakSymbolIndentLeftNChars=0\relax} +\define@key{FV}{breaksymbolindent}{\fvset{breaksymbolindentleft=#1}} +\define@key{FV}{breaksymbolindentleftnchars}{\FV@BreakSymbolIndentLeftNChars=#1\relax} +\define@key{FV}{breaksymbolindentnchars}{\fvset{breaksymbolindentleftnchars=#1}} +\g@addto@macro\FV@BreakLinesIndentationHook{% + \ifnum\FV@BreakSymbolIndentLeftNChars>0 + \FV@SetToWidthNChars{\FV@BreakSymbolIndentLeft}{\FV@BreakSymbolIndentLeftNChars}% + \fi} +\fvset{breaksymbolindentleftnchars=4} +\newdimen\FV@BreakSymbolIndentRight +\newcount\FV@BreakSymbolIndentRightNChars +\define@key{FV}{breaksymbolindentright}{% + \FV@BreakSymbolIndentRight=#1\relax + \FV@BreakSymbolIndentRightNChars=0\relax} +\define@key{FV}{breaksymbolindentrightnchars}{\FV@BreakSymbolIndentRightNChars=#1\relax} +\g@addto@macro\FV@BreakLinesIndentationHook{% + \ifnum\FV@BreakSymbolIndentRightNChars>0 + \FV@SetToWidthNChars{\FV@BreakSymbolIndentRight}{\FV@BreakSymbolIndentRightNChars}% + \fi} +\fvset{breaksymbolindentrightnchars=4} +\newcommand{\FancyVerbBreakSymbolLeftLogic}[1]{% + \ifnum\value{linenumber}=1\relax\else{#1}\fi} +\newcounter{FancyVerbLineBreakLast} +\newcommand{\FV@SetLineBreakLast}{% + \setcounter{FancyVerbLineBreakLast}{\value{linenumber}}} +\newcommand{\FancyVerbBreakSymbolRightLogic}[1]{% + \ifnum\value{linenumber}=\value{FancyVerbLineBreakLast}\relax\else{#1}\fi} +\let\FancyVerbBreakStart\relax +\let\FancyVerbBreakStop\relax +\let\FV@Break@DefaultToken\FV@Break@NBToken +\newbool{FV@breakanywhere} +\define@booleankey{FV}{breakanywhere}% + {\booltrue{FV@breakanywhere}% + \let\FancyVerbBreakStart\FV@Break + \let\FancyVerbBreakStop\FV@EndBreak + \let\FV@Break@DefaultToken\FV@Break@AnyToken}% + {\boolfalse{FV@breakanywhere}% + \let\FancyVerbBreakStart\relax + \let\FancyVerbBreakStop\relax + \let\FV@Break@DefaultToken\FV@Break@NBToken} +\fvset{breakanywhere=false} +\define@key{FV}{breakanywhereinlinestretch}{% + \def\FV@breakanywhereinlinestretch{#1}% + \ifx\FV@breakanywhereinlinestretch\FV@None + \let\FV@breakanywhereinlinestretch\relax + \else\ifx\FV@breakanywhereinlinestretch\@empty + \let\FV@breakanywhereinlinestretch\relax + \fi\fi} +\fvset{breakanywhereinlinestretch=none} +\def\FV@ApplyBreakAnywhereInlineStretch{% + \ifx\FV@breakanywhereinlinestretch\relax + \else + \let\FancyVerbBreakAnywhereBreak@Orig\FancyVerbBreakAnywhereBreak + \def\FancyVerbBreakAnywhereBreak{% + \nobreak\hspace{0pt plus \FV@breakanywhereinlinestretch}% + \FancyVerbBreakAnywhereBreak@Orig}% + \fi} +\define@key{FV}{breakbefore}{% + \ifstrempty{#1}% + {\let\FV@BreakBefore\@empty + \let\FancyVerbBreakStart\relax + \let\FancyVerbBreakStop\relax + \let\FV@Break@DefaultToken\FV@Break@NBToken}% + {\def\FV@BreakBefore{#1}% + \let\FancyVerbBreakStart\FV@Break + \let\FancyVerbBreakStop\FV@EndBreak + \let\FV@Break@DefaultToken\FV@Break@BeforeAfterToken}% +} +\fvset{breakbefore={}} +\newbool{FV@breakbeforeinrun} +\define@booleankey{FV}{breakbeforeinrun}% + {\booltrue{FV@breakbeforeinrun}}% + {\boolfalse{FV@breakbeforeinrun}}% +\fvset{breakbeforeinrun=false} +\def\FV@BreakBeforePrep{% + \ifx\FV@BreakBefore\@empty\relax + \else + \gdef\FV@BreakBefore@Def{}% + \begingroup + \def\FV@BreakBefore@Process##1##2\FV@Undefined{% + \expandafter\FV@BreakBefore@Process@i\expandafter{##1}% + \expandafter\ifx\expandafter\relax\detokenize{##2}\relax + \else + \FV@BreakBefore@Process##2\FV@Undefined + \fi + }% + \def\FV@BreakBefore@Process@i##1{% + \g@addto@macro\FV@BreakBefore@Def{% + \@namedef{FV@BreakBefore@Token\detokenize{##1}}{}}% + }% + \FV@EscChars + \expandafter\FV@BreakBefore@Process\FV@BreakBefore\FV@Undefined + \endgroup + \FV@BreakBefore@Def + \FV@BreakBeforePrep@PygmentsHook + \fi +} +\let\FV@BreakBeforePrep@PygmentsHook\relax +\define@key{FV}{breakafter}{% + \ifstrempty{#1}% + {\let\FV@BreakAfter\@empty + \let\FancyVerbBreakStart\relax + \let\FancyVerbBreakStop\relax + \let\FV@Break@DefaultToken\FV@Break@NBToken}% + {\def\FV@BreakAfter{#1}% + \let\FancyVerbBreakStart\FV@Break + \let\FancyVerbBreakStop\FV@EndBreak + \let\FV@Break@DefaultToken\FV@Break@BeforeAfterToken}% +} +\fvset{breakafter={}} +\newbool{FV@breakafterinrun} +\define@booleankey{FV}{breakafterinrun}% + {\booltrue{FV@breakafterinrun}}% + {\boolfalse{FV@breakafterinrun}}% +\fvset{breakafterinrun=false} +\def\FV@BreakAfterPrep{% + \ifx\FV@BreakAfter\@empty\relax + \else + \gdef\FV@BreakAfter@Def{}% + \begingroup + \def\FV@BreakAfter@Process##1##2\FV@Undefined{% + \expandafter\FV@BreakAfter@Process@i\expandafter{##1}% + \expandafter\ifx\expandafter\relax\detokenize{##2}\relax + \else + \FV@BreakAfter@Process##2\FV@Undefined + \fi + }% + \def\FV@BreakAfter@Process@i##1{% + \ifcsname FV@BreakBefore@Token\detokenize{##1}\endcsname + \ifbool{FV@breakbeforeinrun}% + {\ifbool{FV@breakafterinrun}% + {}% + {\PackageError{fvextra}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}}}% + {\ifbool{FV@breakafterinrun}% + {\PackageError{fvextra}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}}% + {}}% + \fi + \g@addto@macro\FV@BreakAfter@Def{% + \@namedef{FV@BreakAfter@Token\detokenize{##1}}{}}% + }% + \FV@EscChars + \expandafter\FV@BreakAfter@Process\FV@BreakAfter\FV@Undefined + \endgroup + \FV@BreakAfter@Def + \FV@BreakAfterPrep@PygmentsHook + \fi +} +\let\FV@BreakAfterPrep@PygmentsHook\relax +\g@addto@macro\FV@FormattingPrep@PreHook{% + \ifFV@pdfTeXinputenc + \ifdefstring{\inputencodingname}{utf8}% + {\let\FV@BreakBeforePrep\FV@BreakBeforePrep@UTF + \let\FV@BreakAfterPrep\FV@BreakAfterPrep@UTF}% + {}% + \fi + \FV@BreakBeforePrep\FV@BreakAfterPrep} +\define@key{FV}{breakanywheresymbolpre}{% + \ifstrempty{#1}% + {\def\FancyVerbBreakAnywhereSymbolPre{}}% + {\def\FancyVerbBreakAnywhereSymbolPre{\hbox{#1}}}} +\fvset{breakanywheresymbolpre={\,\footnotesize\ensuremath{_\rfloor}}} +\define@key{FV}{breakanywheresymbolpost}{% + \ifstrempty{#1}% + {\def\FancyVerbBreakAnywhereSymbolPost{}}% + {\def\FancyVerbBreakAnywhereSymbolPost{\hbox{#1}}}} +\fvset{breakanywheresymbolpost={}} +\define@key{FV}{breakbeforesymbolpre}{% + \ifstrempty{#1}% + {\def\FancyVerbBreakBeforeSymbolPre{}}% + {\def\FancyVerbBreakBeforeSymbolPre{\hbox{#1}}}} +\fvset{breakbeforesymbolpre={\,\footnotesize\ensuremath{_\rfloor}}} +\define@key{FV}{breakbeforesymbolpost}{% + \ifstrempty{#1}% + {\def\FancyVerbBreakBeforeSymbolPost{}}% + {\def\FancyVerbBreakBeforeSymbolPost{\hbox{#1}}}} +\fvset{breakbeforesymbolpost={}} +\define@key{FV}{breakaftersymbolpre}{% + \ifstrempty{#1}% + {\def\FancyVerbBreakAfterSymbolPre{}}% + {\def\FancyVerbBreakAfterSymbolPre{\hbox{#1}}}} +\fvset{breakaftersymbolpre={\,\footnotesize\ensuremath{_\rfloor}}} +\define@key{FV}{breakaftersymbolpost}{% + \ifstrempty{#1}% + {\def\FancyVerbBreakAfterSymbolPost{}}% + {\def\FancyVerbBreakAfterSymbolPost{\hbox{#1}}}} +\fvset{breakaftersymbolpost={}} +\newcommand{\FancyVerbBreakAnywhereBreak}{% + \discretionary{\FancyVerbBreakAnywhereSymbolPre}% + {\FancyVerbBreakAnywhereSymbolPost}{}} +\newcommand{\FancyVerbBreakBeforeBreak}{% + \discretionary{\FancyVerbBreakBeforeSymbolPre}% + {\FancyVerbBreakBeforeSymbolPost}{}} +\newcommand{\FancyVerbBreakAfterBreak}{% + \discretionary{\FancyVerbBreakAfterSymbolPre}% + {\FancyVerbBreakAfterSymbolPost}{}} +\newbool{FV@breaknonspaceingroup} +\define@booleankey{FV}{breaknonspaceingroup}% + {\booltrue{FV@breaknonspaceingroup}}% + {\boolfalse{FV@breaknonspaceingroup}} +\fvset{breaknonspaceingroup=false} +\newbool{FV@breakpreferspaces} +\booltrue{FV@breakpreferspaces} +\define@booleankey{FV}{breakpreferspaces}% + {\booltrue{FV@breakpreferspaces}}% + {\boolfalse{FV@breakpreferspaces}} +\def\FV@BreakHyphenation{% + \finalhyphendemerits=0\relax + \ifbool{FV@breakpreferspaces}{}{\linepenalty=\@M\relax}} +\g@addto@macro\FV@FormattingPrep@PreHook{\FV@BreakHyphenation} +\newsavebox{\FV@LineBox} +\newsavebox{\FV@LineIndentBox} +\let\FV@LineIndentChars\@empty +\def\FV@GetLineIndent{% + \@ifnextchar\FV@Sentinel + {\FV@GetLineIndent@End}% + {\ifx\@let@token\FV@FVSpaceToken + \let\FV@Next\FV@GetLineIndent@Whitespace + \else\ifx\@let@token\FV@FVTabToken + \let\FV@Next\FV@GetLineIndent@Whitespace + \else\ifcsname FV@PYG@Redefed\endcsname + \ifx\@let@token\FV@PYG@Redefed + \let\FV@Next\FV@GetLineIndent@Pygments + \else + \let\FV@Next\FV@GetLineIndent@End + \fi + \else + \let\FV@Next\FV@GetLineIndent@End + \fi\fi\fi + \FV@Next}} +\def\FV@GetLineIndent@End#1\FV@Sentinel{} +\def\FV@GetLineIndent@Whitespace#1{% + \expandafter\def\expandafter\FV@LineIndentChars\expandafter{\FV@LineIndentChars#1}% + \FV@GetLineIndent} +\def\FV@GetLineIndent@Pygments#1#2#3{% + \FV@GetLineIndent#3} +\def\FV@TrueTab@UseWidth{% + \@tempdima=\csname FV@TrueTab:Width\arabic{FV@TrueTabCounter}\endcsname sp\relax + \stepcounter{FV@TrueTabCounter}% + \hbox to\@tempdima{\hss\FV@TabChar}} +\newcounter{FV@BreakBufferDepth} +\def\FV@BreakBuffer@Append#1{% + \expandafter\def\expandafter\FV@BreakBuffer\expandafter{\FV@BreakBuffer#1}} +\def\FV@BreakBufferStart{% + \FV@BreakBufferStart@i} +\def\FV@BreakBufferStart@i#1{% + \ifnum\value{FV@BreakBufferDepth}>0\relax + \expandafter\let\csname FV@BreakBuffer\arabic{FV@BreakBufferDepth}\endcsname + \FV@BreakBuffer + \expandafter\let\csname FV@Break@Token\arabic{FV@BreakBufferDepth}\endcsname + \FV@Break@Token + \fi + \def\FV@BreakBuffer{}% + \let\FV@Break@Token=#1% + \stepcounter{FV@BreakBufferDepth}% + \let\FV@LastToken=\FV@Undefined + \FV@Break@Scan} +\newbool{FV@UserMacroBreaks} +\def\FV@BreakBufferStop{% + \FV@BreakBufferStop@i} +\def\FV@BreakBufferStop@i#1{% + \addtocounter{FV@BreakBufferDepth}{-1}% + \let\FV@LastToken=\FV@Undefined + \ifnum\value{FV@BreakBufferDepth}<0\relax + \PackageError{fvextra}% + {Line break insertion error (extra \string\FancyVerbBreakStop?)}% + {Line break insertion error (extra \string\FancyVerbBreakStop?)}% + \def\FV@BreakBuffer{}% + \fi + \ifnum\value{FV@BreakBufferDepth}>0\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\expandafter\FV@BreakBufferStop@ii\expandafter{\FV@BreakBuffer}{#1}}% + {\ifbool{FV@UserMacroBreaks}% + {\expandafter\let\expandafter\FV@BreakBuffer\expandafter\FV@Undefined\FV@BreakBuffer}% + {}}} +\def\FV@BreakBufferStop@ii#1#2{% + \ifstrempty{#2}% + {\FV@BreakBufferStop@iii{#1}}% + {\expandafter\FV@BreakBufferStop@iii\expandafter{#2{#1}}}} +\def\FV@BreakBufferStop@iii#1{% + \expandafter\let\expandafter\FV@BreakBufferUpLevel + \csname FV@BreakBuffer\arabic{FV@BreakBufferDepth}\endcsname + \expandafter\def\expandafter\FV@BreakBuffer\expandafter{\FV@BreakBufferUpLevel#1}% + \expandafter\let\expandafter\FV@Break@Token + \csname FV@Break@Token\arabic{FV@BreakBufferDepth}\endcsname + \FV@Break@Scan} +\def\FV@InsertBreaks#1#2{% + \ifx\FancyVerbBreakStart\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {#1{#2}}% + {\ifFV@pdfTeXinputenc + \ifdefstring{\inputencodingname}{utf8}% + {\ifx\FV@Break@DefaultToken\FV@Break@AnyToken + \let\FV@Break@DefaultToken\FV@Break@AnyToken@UTF + \else + \ifx\FV@Break@DefaultToken\FV@Break@BeforeAfterToken + \let\FV@Break@DefaultToken\FV@Break@BeforeAfterToken@UTF + \fi + \fi}% + {}% + \fi + \setcounter{FV@BreakBufferDepth}{0}% + \boolfalse{FV@UserMacroBreaks}% + \FancyVerbBreakStart#2\FancyVerbBreakStop + \setcounter{FV@BreakBufferDepth}{0}% + \booltrue{FV@UserMacroBreaks}% + \expandafter\FV@InsertBreaks@i\expandafter{\FV@BreakBuffer}{#1}}} +\def\FV@InsertBreaks@i#1#2{% + \let\FV@BreakBuffer\FV@Undefined + #2{#1}} +\def\FV@Break{% + \FV@BreakBufferStart{\FV@Break@DefaultToken}} +\def\FV@EndBreak{% + \FV@BreakBufferStop{}} +\begingroup +\catcode`\$=3 +\gdef\FV@Break@Scan{% + \@ifnextchar\FancyVerbBreakStart% + {}% + {\ifx\@let@token\FancyVerbBreakStop + \let\FV@Break@Next\relax + \else\ifx\@let@token\FV@BreakBufferStart + \let\FV@Break@Next\relax + \else\ifx\@let@token\FV@BreakBufferStop + \let\FV@Break@Next\relax + \else\ifx\@let@token$ + \let\FV@Break@Next\FV@Break@Math + \else\ifx\@let@token\bgroup + \let\FV@Break@Next\FV@Break@Group + \else + \let\FV@Break@Next\FV@Break@Token + \fi\fi\fi\fi\fi + \FV@Break@Next}} +\endgroup +\begingroup +\catcode`\$=3% +\gdef\FV@Break@Math$#1${% + \FV@BreakBufferStart{\FV@Break@NBToken}#1\FV@BreakBufferStop{\FV@Break@MathTemplate}} +\gdef\FV@Break@MathTemplate#1{$#1$} +\endgroup +\def\FV@Break@Group#1{% + \ifstrempty{#1}% + {\FV@BreakBuffer@Append{{}}% + \FV@Break@Scan}% + {\ifbool{FV@breaknonspaceingroup}% + {\FV@BreakBufferStart{\FV@Break@DefaultToken}% + #1\FV@BreakBufferStop{\FV@Break@GroupTemplate}}% + {\FV@BreakBufferStart{\FV@Break@NBToken}% + #1\FV@BreakBufferStop{\FV@Break@GroupTemplate}}}} +\def\FV@Break@GroupTemplate#1{{#1}} +\def\FV@Break@NBToken#1{% + \FV@BreakBuffer@Append{#1}% + \let\FV@LastToken=\FV@Undefined + \FV@Break@Scan} +\def\FV@Break@AnyToken#1{% + \ifx\FV@FVSpaceToken#1\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\let\FV@LastToken=#1\FV@BreakBuffer@Append{#1}\FV@Break@Scan}% + {\ifx\FV@LastToken\FV@FVSpaceToken + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\let\FV@LastToken=#1% + \FV@BreakBuffer@Append{#1}\FV@Break@Scan}% + {\let\FV@LastToken=#1% + \FV@BreakBuffer@Append{\FancyVerbBreakAnywhereBreak#1}\FV@Break@Scan}}} +\def\FV@Break@BeforeAfterToken#1{% + \ifcsname FV@BreakBefore@Token\detokenize{#1}\endcsname + \let\FV@Break@Next\FV@Break@BeforeTokenBreak + \else + \ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \let\FV@Break@Next\FV@Break@AfterTokenBreak + \else + \let\FV@Break@Next\FV@Break@BeforeAfterTokenNoBreak + \fi + \fi + \FV@Break@Next{#1}% +} +\def\FV@Break@BeforeAfterTokenNoBreak#1{% + \FV@BreakBuffer@Append{#1}% + \let\FV@LastToken=#1% + \FV@Break@Scan} +\def\FV@Break@BeforeTokenBreak#1{% + \ifbool{FV@breakbeforeinrun}% + {\ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \ifx#1\FV@FVSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% + \fi + \let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan + \def\FV@RescanToken{#1}% + \else + \ifx#1\FV@FVSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak#1}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% + \fi + \let\FV@Break@Next\FV@Break@Scan + \let\FV@LastToken=#1% + \fi}% + {\ifx#1\FV@LastToken\relax + \ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan + \def\FV@RescanToken{#1}% + \else + \FV@BreakBuffer@Append{#1}% + \let\FV@Break@Next\FV@Break@Scan + \let\FV@LastToken=#1% + \fi + \else + \ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \ifx#1\FV@FVSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% + \fi + \let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan + \def\FV@RescanToken{#1}% + \else + \ifx#1\FV@FVSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak#1}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% + \fi + \let\FV@Break@Next\FV@Break@Scan + \let\FV@LastToken=#1% + \fi + \fi}% + \FV@Break@Next} +\def\FV@Break@BeforeTokenBreak@AfterRescan{% + \expandafter\FV@Break@AfterTokenBreak\FV@RescanToken} +\def\FV@Break@AfterTokenBreak#1{% + \let\FV@LastToken=#1% + \@ifnextchar\FV@FVSpaceToken% + {\ifx#1\FV@FVSpaceToken + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@Break@AfterTokenBreak@i{#1}}% + {\FV@BreakBuffer@Append{#1}% + \FV@Break@Scan}}% + {\FV@Break@AfterTokenBreak@i{#1}}} +\def\FV@Break@AfterTokenBreak@i#1{% + \ifbool{FV@breakafterinrun}% + {\ifx#1\FV@FVSpaceToken + \FV@BreakBuffer@Append{#1\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{#1\FancyVerbBreakAfterBreak}% + \fi + \let\FV@Break@Next\FV@Break@Scan}% + {\ifx\@let@token#1\relax + \FV@BreakBuffer@Append{#1}% + \let\FV@Break@Next\FV@Break@Scan + \else + \expandafter\ifx\csname @let@token\endcsname\bgroup\relax + \FV@BreakBuffer@Append{#1}% + \let\FV@Break@Next\FV@Break@AfterTokenBreak@Group + \else + \ifx#1\FV@FVSpaceToken + \FV@BreakBuffer@Append{#1\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{#1\FancyVerbBreakAfterBreak}% + \fi + \let\FV@Break@Next\FV@Break@Scan + \fi + \fi}% + \FV@Break@Next +} +\def\FV@Break@AfterTokenBreak@Group#1{% + \ifstrempty{#1}% + {\FV@BreakBuffer@Append{{}}% + \@ifnextchar\FV@LastToken% + {\FV@Break@Scan}% + {\ifx\FV@LastToken\FV@FVSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% + \fi + \FV@Break@Scan}}% + {\ifx\FV@LastToken\FV@FVSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% + \fi + \FV@Break@Group{#1}}} +\ifFV@pdfTeXinputenc +\def\FV@BreakBeforePrep@UTF{% + \ifx\FV@BreakBefore\@empty\relax + \else + \gdef\FV@BreakBefore@Def{}% + \begingroup + \def\FV@BreakBefore@Process##1{% + \ifcsname FV@U8:\detokenize{##1}\endcsname + \expandafter\let\expandafter\FV@Break@Next\csname FV@U8:\detokenize{##1}\endcsname + \let\FV@UTF@octets@after\FV@BreakBefore@Process@ii + \else + \ifx##1\FV@Undefined + \let\FV@Break@Next\@gobble + \else + \let\FV@Break@Next\FV@BreakBefore@Process@i + \fi + \fi + \FV@Break@Next##1% + }% + \def\FV@BreakBefore@Process@i##1{% + \expandafter\FV@BreakBefore@Process@ii\expandafter{##1}}% + \def\FV@BreakBefore@Process@ii##1{% + \g@addto@macro\FV@BreakBefore@Def{% + \@namedef{FV@BreakBefore@Token\detokenize{##1}}{}}% + \FV@BreakBefore@Process + }% + \FV@EscChars + \expandafter\FV@BreakBefore@Process\FV@BreakBefore\FV@Undefined + \endgroup + \FV@BreakBefore@Def + \FV@BreakBeforePrep@PygmentsHook + \fi +} +\def\FV@BreakAfterPrep@UTF{% + \ifx\FV@BreakAfter\@empty\relax + \else + \gdef\FV@BreakAfter@Def{}% + \begingroup + \def\FV@BreakAfter@Process##1{% + \ifcsname FV@U8:\detokenize{##1}\endcsname + \expandafter\let\expandafter\FV@Break@Next\csname FV@U8:\detokenize{##1}\endcsname + \let\FV@UTF@octets@after\FV@BreakAfter@Process@ii + \else + \ifx##1\FV@Undefined + \let\FV@Break@Next\@gobble + \else + \let\FV@Break@Next\FV@BreakAfter@Process@i + \fi + \fi + \FV@Break@Next##1% + }% + \def\FV@BreakAfter@Process@i##1{% + \expandafter\FV@BreakAfter@Process@ii\expandafter{##1}}% + \def\FV@BreakAfter@Process@ii##1{% + \ifcsname FV@BreakBefore@Token\detokenize{##1}\endcsname + \ifbool{FV@breakbeforeinrun}% + {\ifbool{FV@breakafterinrun}% + {}% + {\PackageError{fvextra}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}}}% + {\ifbool{FV@breakafterinrun}% + {\PackageError{fvextra}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}% + {Conflicting breakbeforeinrun and breakafterinrun for "\detokenize{##1}"}}% + {}}% + \fi + \g@addto@macro\FV@BreakAfter@Def{% + \@namedef{FV@BreakAfter@Token\detokenize{##1}}{}}% + \FV@BreakAfter@Process + }% + \FV@EscChars + \expandafter\FV@BreakAfter@Process\FV@BreakAfter\FV@Undefined + \endgroup + \FV@BreakAfter@Def + \FV@BreakAfterPrep@PygmentsHook + \fi +} +\def\FV@Break@AnyToken@UTF#1{% + \ifcsname FV@U8:\detokenize{#1}\endcsname + \expandafter\let\expandafter\FV@Break@Next\csname FV@U8:\detokenize{#1}\endcsname + \let\FV@UTF@octets@after\FV@Break@AnyToken@UTF@i + \else + \let\FV@Break@Next\FV@Break@AnyToken@UTF@i + \fi + \FV@Break@Next{#1}% +} +\def\FV@Break@AnyToken@UTF@i#1{% + \def\FV@CurrentToken{#1}% + \ifx\FV@CurrentToken\FV@ActiveSpaceToken\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\let\FV@LastToken\FV@CurrentToken + \FV@BreakBuffer@Append{#1}\FV@Break@Scan}% + {\ifx\FV@LastToken\FV@ActiveSpaceToken + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\let\FV@LastToken\FV@CurrentToken + \FV@BreakBuffer@Append{#1}\FV@Break@Scan}% + {\let\FV@LastToken\FV@CurrentToken + \FV@BreakBuffer@Append{\FancyVerbBreakAnywhereBreak#1}\FV@Break@Scan}}} +\def\FV@Break@BeforeAfterToken@UTF#1{% + \ifcsname FV@U8:\detokenize{#1}\endcsname + \expandafter\let\expandafter\FV@Break@Next\csname FV@U8:\detokenize{#1}\endcsname + \let\FV@UTF@octets@after\FV@Break@BeforeAfterToken@UTF@i + \else + \let\FV@Break@Next\FV@Break@BeforeAfterToken@UTF@i + \fi + \FV@Break@Next{#1}% +} +\def\FV@Break@BeforeAfterToken@UTF@i#1{% + \ifcsname FV@BreakBefore@Token\detokenize{#1}\endcsname + \let\FV@Break@Next\FV@Break@BeforeTokenBreak@UTF + \else + \ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \let\FV@Break@Next\FV@Break@AfterTokenBreak@UTF + \else + \let\FV@Break@Next\FV@Break@BeforeAfterTokenNoBreak@UTF + \fi + \fi + \FV@Break@Next{#1}% +} +\def\FV@Break@BeforeAfterTokenNoBreak@UTF#1{% + \FV@BreakBuffer@Append{#1}% + \def\FV@LastToken{#1}% + \FV@Break@Scan} +\def\FV@Break@BeforeTokenBreak@UTF#1{% + \def\FV@CurrentToken{#1}% + \ifbool{FV@breakbeforeinrun}% + {\ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \ifx\FV@CurrentToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% + \fi + \let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan@UTF + \def\FV@RescanToken{#1}% + \else + \ifx\FV@CurrentToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak#1}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% + \fi + \let\FV@Break@Next\FV@Break@Scan + \def\FV@LastToken{#1}% + \fi}% + {\ifx\FV@CurrentToken\FV@LastToken\relax + \ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan@UTF + \def\FV@RescanToken{#1}% + \else + \FV@BreakBuffer@Append{#1}% + \let\FV@Break@Next\FV@Break@Scan + \def\FV@LastToken{#1}% + \fi + \else + \ifcsname FV@BreakAfter@Token\detokenize{#1}\endcsname + \ifx\FV@CurrentToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% + \fi + \let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan@UTF + \def\FV@RescanToken{#1}% + \else + \ifx\FV@CurrentToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak#1}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% + \fi + \let\FV@Break@Next\FV@Break@Scan + \def\FV@LastToken{#1}% + \fi + \fi}% + \FV@Break@Next} +\def\FV@Break@BeforeTokenBreak@AfterRescan@UTF{% + \expandafter\FV@Break@AfterTokenBreak@UTF\expandafter{\FV@RescanToken}} +\def\FV@Break@AfterTokenBreak@UTF#1{% + \def\FV@LastToken{#1}% + \@ifnextchar\FV@FVSpaceToken% + {\ifx\FV@LastToken\FV@ActiveSpaceToken + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\FV@Break@AfterTokenBreak@UTF@i{#1}}% + {\FV@BreakBuffer@Append{#1}% + \FV@Break@Scan}}% + {\FV@Break@AfterTokenBreak@UTF@i{#1}}} +\def\FV@Break@AfterTokenBreak@UTF@i#1{% + \ifbool{FV@breakafterinrun}% + {\ifx\FV@LastToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{#1\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{#1\FancyVerbBreakAfterBreak}% + \fi + \let\FV@Break@Next\FV@Break@Scan}% + {\FV@BreakBuffer@Append{#1}% + \expandafter\ifx\csname @let@token\endcsname\bgroup\relax + \let\FV@Break@Next\FV@Break@AfterTokenBreak@Group@UTF + \else + \let\FV@Break@Next\FV@Break@AfterTokenBreak@UTF@ii + \fi}% + \FV@Break@Next} +\def\FV@Break@AfterTokenBreak@UTF@ii#1{% + \ifcsname FV@U8:\detokenize{#1}\endcsname + \expandafter\let\expandafter\FV@Break@Next\csname FV@U8:\detokenize{#1}\endcsname + \let\FV@UTF@octets@after\FV@Break@AfterTokenBreak@UTF@ii + \else + \def\FV@NextToken{#1}% + \ifx\FV@LastToken\FV@NextToken + \else + \ifx\FV@LastToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% + \fi + \fi + \let\FV@Break@Next\FV@Break@Scan + \fi + \FV@Break@Next#1} +\def\FV@Break@AfterTokenBreak@Group@UTF#1{% + \ifstrempty{#1}% + {\FV@BreakBuffer@Append{{}}% + \@ifnextchar\bgroup + {\ifx\FV@LastToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% + \fi + \FV@Break@Group}% + {\FV@Break@AfterTokenBreak@Group@UTF@i}}% + {\ifx\FV@LastToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% + \fi + \FV@Break@Group{#1}}} +\def\FV@Break@AfterTokenBreak@Group@UTF@i#1{% + \ifcsname FV@U8:\detokenize{#1}\endcsname + \expandafter\let\expandafter\FV@Break@Next\csname FV@U8:\detokenize{#1}\endcsname + \let\FV@UTF@octets@after\FV@Break@AfterTokenBreak@Group@UTF@i + \else + \def\FV@NextToken{#1}% + \ifx\FV@LastToken\FV@NextToken + \else + \ifx\FV@LastToken\FV@ActiveSpaceToken + \FV@BreakBuffer@Append{\FancyVerbSpaceBreak}% + \else + \FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% + \fi + \fi + \let\FV@Break@Next\FV@Break@Scan + \fi + \FV@Break@Next#1} +\fi +\def\FV@makeLineNumber{% + \hss + \FancyVerbBreakSymbolLeftLogic{\FancyVerbBreakSymbolLeft}% + \hbox to \FV@BreakSymbolSepLeft{\hfill}% + \rlap{\hskip\linewidth + \hbox to \FV@BreakSymbolSepRight{\hfill}% + \FancyVerbBreakSymbolRightLogic{\FancyVerbBreakSymbolRight}% + \FV@SetLineBreakLast + }% +} +\def\FV@RaggedRight{% + \let\\\@centercr + \@rightskip\@flushglue\rightskip\@rightskip\leftskip\z@skip\parindent\z@} +\newdimen\FV@LineWidth +\def\FV@SaveLineBox#1{% + \savebox{\FV@LineBox}{% + \advance\FV@LineWidth by -\FV@BreakIndent + \hbox to \FV@BreakIndent{\hfill}% + \ifbool{FV@breakautoindent}% + {\let\FV@LineIndentChars\@empty + \FV@GetLineIndent#1\FV@Sentinel + \savebox{\FV@LineIndentBox}{\FV@LineIndentChars}% + \hbox to \wd\FV@LineIndentBox{\hfill}% + \advance\FV@LineWidth by -\wd\FV@LineIndentBox + \setcounter{FV@TrueTabCounter}{0}}% + {}% + \ifdefempty{\FancyVerbBreakSymbolLeft}{}% + {\hbox to \FV@BreakSymbolIndentLeft{\hfill}% + \advance\FV@LineWidth by -\FV@BreakSymbolIndentLeft}% + \ifdefempty{\FancyVerbBreakSymbolRight}{}% + {\advance\FV@LineWidth by -\FV@BreakSymbolIndentRight}% + \parbox[t]{\FV@LineWidth}{% + \FV@RaggedRight + \leftlinenumbers* + \begin{internallinenumbers*}% + \let\makeLineNumber\FV@makeLineNumber + \noindent\hspace*{-\FV@BreakIndent}% + \ifdefempty{\FancyVerbBreakSymbolLeft}{}{% + \hspace*{-\FV@BreakSymbolIndentLeft}}% + \ifbool{FV@breakautoindent}% + {\hspace*{-\wd\FV@LineIndentBox}}% + {}% + \FV@BreakByTokenAnywhereHook + \strut\FV@InsertBreaks{\FancyVerbFormatText}{#1}\nobreak\strut + \end{internallinenumbers*} + }% + \ifdefempty{\FancyVerbBreakSymbolRight}{}% + {\hbox to \FV@BreakSymbolIndentRight{\hfill}}% + }% +} +\let\FV@BreakByTokenAnywhereHook\relax +\def\FV@ListProcessLine@Break#1{% + \hbox to \hsize{% + \kern\leftmargin + \hbox to \linewidth{% + \FV@LineWidth\linewidth + \ifx\FV@RightListFrame\relax\else + \advance\FV@LineWidth by -\FV@FrameSep + \advance\FV@LineWidth by -\FV@FrameRule + \fi + \ifx\FV@LeftListFrame\relax\else + \advance\FV@LineWidth by -\FV@FrameSep + \advance\FV@LineWidth by -\FV@FrameRule + \fi + \ifx\FV@Tab\FV@TrueTab + \let\FV@TrueTabSaveWidth\FV@TrueTabSaveWidth@Save + \setcounter{FV@TrueTabCounter}{0}% + \fi + \sbox{\FV@LineBox}{% + \let\FancyVerbBreakStart\relax + \let\FancyVerbBreakStop\relax + \FancyVerbFormatLine{% + %\FancyVerbHighlightLine %<-- Default definition using \rlap breaks breaking + {\FV@ObeyTabs{\FancyVerbFormatText{#1}}}}}% + \ifx\FV@Tab\FV@TrueTab + \let\FV@TrueTabSaveWidth\relax + \fi + \ifdim\wd\FV@LineBox>\FV@LineWidth + \setcounter{FancyVerbLineBreakLast}{0}% + \ifx\FV@Tab\FV@TrueTab + \let\FV@Tab\FV@TrueTab@UseWidth + \setcounter{FV@TrueTabCounter}{0}% + \fi + \FV@SaveLineBox{#1}% + \ifdefempty{\FancyVerbBreakSymbolRight}{}{% + \let\FV@SetLineBreakLast\relax + \setcounter{FV@TrueTabCounter}{0}% + \FV@SaveLineBox{#1}}% + \FV@LeftListNumber + \FV@LeftListFrame + \FV@BGColor@List{% + \FancyVerbFormatLine{% + \FancyVerbHighlightLine{\usebox{\FV@LineBox}}}}% + \FV@RightListFrame + \FV@RightListNumber + \ifx\FV@Tab\FV@TrueTab@UseWidth + \let\FV@Tab\FV@TrueTab + \fi + \else + \let\FancyVerbBreakStart\relax + \let\FancyVerbBreakStop\relax + \FV@LeftListNumber + \FV@LeftListFrame + \FV@BGColor@List{% + \FancyVerbFormatLine{% + \FancyVerbHighlightLine{% + \parbox[t]{\FV@LineWidth}{% + \noindent\strut\FV@ObeyTabs{\FancyVerbFormatText{#1}}\strut}}}}% + \FV@RightListFrame + \FV@RightListNumber + \fi}% + \hss}\baselineskip\z@\lineskip\z@} +\def\FV@BreakBeforePrep@Pygments#1{% + \ifcsname FV@BreakBefore@Token\@backslashchar\endcsname + \@namedef{FV@BreakBefore@Token#1Zbs }{}% + \fi + \ifcsname FV@BreakBefore@Token\FV@underscorechar\endcsname + \@namedef{FV@BreakBefore@Token#1Zus }{}% + \fi + \ifcsname FV@BreakBefore@Token\@charlb\endcsname + \@namedef{FV@BreakBefore@Token#1Zob }{}% + \fi + \ifcsname FV@BreakBefore@Token\@charrb\endcsname + \@namedef{FV@BreakBefore@Token#1Zcb }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{^}\endcsname + \@namedef{FV@BreakBefore@Token#1Zca }{}% + \fi + \ifcsname FV@BreakBefore@Token\FV@ampchar\endcsname + \@namedef{FV@BreakBefore@Token#1Zam }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{<}\endcsname + \@namedef{FV@BreakBefore@Token#1Zlt }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{>}\endcsname + \@namedef{FV@BreakBefore@Token#1Zgt }{}% + \fi + \ifcsname FV@BreakBefore@Token\FV@hashchar\endcsname + \@namedef{FV@BreakBefore@Token#1Zsh }{}% + \fi + \ifcsname FV@BreakBefore@Token\@percentchar\endcsname + \@namedef{FV@BreakBefore@Token#1Zpc }{}% + \fi + \ifcsname FV@BreakBefore@Token\FV@dollarchar\endcsname + \@namedef{FV@BreakBefore@Token#1Zdl }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{-}\endcsname + \@namedef{FV@BreakBefore@Token#1Zhy }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{'}\endcsname + \@namedef{FV@BreakBefore@Token#1Zsq }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{"}\endcsname + \@namedef{FV@BreakBefore@Token#1Zdq }{}% + \fi + \ifcsname FV@BreakBefore@Token\FV@tildechar\endcsname + \@namedef{FV@BreakBefore@Token#1Zti }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{@}\endcsname + \@namedef{FV@BreakBefore@Token#1Zat }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{[}\endcsname + \@namedef{FV@BreakBefore@Token#1Zlb }{}% + \fi + \ifcsname FV@BreakBefore@Token\detokenize{]}\endcsname + \@namedef{FV@BreakBefore@Token#1Zrb }{}% + \fi +} +\def\FV@BreakAfterPrep@Pygments#1{% + \ifcsname FV@BreakAfter@Token\@backslashchar\endcsname + \@namedef{FV@BreakAfter@Token#1Zbs }{}% + \fi + \ifcsname FV@BreakAfter@Token\FV@underscorechar\endcsname + \@namedef{FV@BreakAfter@Token#1Zus }{}% + \fi + \ifcsname FV@BreakAfter@Token\@charlb\endcsname + \@namedef{FV@BreakAfter@Token#1Zob }{}% + \fi + \ifcsname FV@BreakAfter@Token\@charrb\endcsname + \@namedef{FV@BreakAfter@Token#1Zcb }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{^}\endcsname + \@namedef{FV@BreakAfter@Token#1Zca }{}% + \fi + \ifcsname FV@BreakAfter@Token\FV@ampchar\endcsname + \@namedef{FV@BreakAfter@Token#1Zam }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{<}\endcsname + \@namedef{FV@BreakAfter@Token#1Zlt }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{>}\endcsname + \@namedef{FV@BreakAfter@Token#1Zgt }{}% + \fi + \ifcsname FV@BreakAfter@Token\FV@hashchar\endcsname + \@namedef{FV@BreakAfter@Token#1Zsh }{}% + \fi + \ifcsname FV@BreakAfter@Token\@percentchar\endcsname + \@namedef{FV@BreakAfter@Token#1Zpc }{}% + \fi + \ifcsname FV@BreakAfter@Token\FV@dollarchar\endcsname + \@namedef{FV@BreakAfter@Token#1Zdl }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{-}\endcsname + \@namedef{FV@BreakAfter@Token#1Zhy }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{'}\endcsname + \@namedef{FV@BreakAfter@Token#1Zsq }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{"}\endcsname + \@namedef{FV@BreakAfter@Token#1Zdq }{}% + \fi + \ifcsname FV@BreakAfter@Token\FV@tildechar\endcsname + \@namedef{FV@BreakAfter@Token#1Zti }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{@}\endcsname + \@namedef{FV@BreakAfter@Token#1Zat }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{[}\endcsname + \@namedef{FV@BreakAfter@Token#1Zlb }{}% + \fi + \ifcsname FV@BreakAfter@Token\detokenize{]}\endcsname + \@namedef{FV@BreakAfter@Token#1Zrb }{}% + \fi +} +\newbool{FV@breakbytoken} +\define@booleankey{FV}{breakbytoken}% + {\booltrue{FV@breakbytoken}}% + {\boolfalse{FV@breakbytoken}\boolfalse{FV@breakbytokenanywhere}} +\newbool{FV@breakbytokenanywhere} +\define@booleankey{FV}{breakbytokenanywhere}% + {\booltrue{FV@breakbytokenanywhere}\booltrue{FV@breakbytoken}}% + {\boolfalse{FV@breakbytokenanywhere}\boolfalse{FV@breakbytoken}} +\def\FancyVerbBreakByTokenAnywhereBreak{\allowbreak{}} +\def\VerbatimPygments#1#2{% + \def\FV@PygmentsHook{\FV@VerbatimPygments{#1}{#2}}} +\def\FV@VerbatimPygments#1#2{% + \edef\FV@PYG@Literal{\expandafter\FV@DetokMacro@StripSpace\detokenize{#1}}% + \def\FV@BreakBeforePrep@PygmentsHook{% + \expandafter\FV@BreakBeforePrep@Pygments\expandafter{\FV@PYG@Literal}}% + \def\FV@BreakAfterPrep@PygmentsHook{% + \expandafter\FV@BreakAfterPrep@Pygments\expandafter{\FV@PYG@Literal}}% + \ifx#2\relax + \let\FV@PYG=#1\relax + \else + \let\FV@PYG=#2\relax + \fi + \ifbool{FV@breakbytoken}% + {\ifbool{FV@breakbytokenanywhere}% + {\def\FV@BreakByTokenAnywhereHook{% + \def\FV@BreakByTokenAnywhereBreak{% + \let\FV@BreakByTokenAnywhereBreak\FancyVerbBreakByTokenAnywhereBreak}}% + \def#1##1##2{% + \FV@BreakByTokenAnywhereBreak + \leavevmode\hbox{\FV@PYG{##1}{##2}}}}% + {\def#1##1##2{% + \leavevmode\hbox{\FV@PYG{##1}{##2}}}}}% + {\def#1##1##2{% + \FV@PYG{##1}{\FancyVerbBreakStart##2\FancyVerbBreakStop}}}% + \let\FV@PYG@Redefed=#1\relax +} +\let\FV@BreakByTokenAnywhereBreak\relax +\def\FV@DetokMacro@StripSpace#1 {#1} +%% \Finale +\endinput +%% +%% End of file `fvextra.sty'. diff --git a/mwe.tex b/mwe.tex new file mode 100644 index 0000000..35628ce --- /dev/null +++ b/mwe.tex @@ -0,0 +1,49 @@ +\documentclass{standalone} +\usepackage{tikz,fvextra,minted,luacode} +\usetikzlibrary{positioning} +\directlua{ os.execute "mkdir -p examples" } + +\NewDocumentCommand{\LineCount}{m}{\directlua{ + local n, f = 0, io.open("examples/#1.tex") + for l in f:lines() do n = n + 1 end + tex.print( n - 1 ) +}} + +\newwrite\examplefile + +\NewDocumentEnvironment{ShortExample}{m}{ + \VerbatimEnvironment + \immediate\openout\examplefile=examples/#1.tex\relax + \begin{VerbatimWrite}[writefilehandle=\examplefile] + \documentclass{standalone} + \begin{document} + \end{VerbatimWrite} + \begin{VerbatimWrite}[writefilehandle=\examplefile]}% + {\end{VerbatimWrite} + \begin{VerbatimWrite}[writefilehandle=\examplefile] + \end{document} + \end{VerbatimWrite} + \immediate\closeout\examplefile + \directlua{ os.execute( "cd examples ; latexmk -pdflua ".."#1"..".tex" ) } + \edef\lc{\LineCount{#1}} + \begin{tikzpicture} + \node[anchor=north west, inner sep=1ex, draw] (code) { + \begin{minipage}[t]{0.45\textwidth} + \inputminted[autogobble=true,firstline=3,lastline=\lc]{tex}{examples/#1.tex} + \end{minipage} + }; + \node[anchor=north west, right=2mm of code, draw] (output) { + \begin{minipage}[t]{0.45\textwidth} + \includegraphics[width=\linewidth]{examples/#1.pdf} + \end{minipage} + }; + \end{tikzpicture} +} + +\begin{document} + +\begin{ShortExample}{test} + Test +\end{ShortExample} + +\end{document}