- this solve default margins
- wrapping code correcly
- install pandoc
brew install pandoc
- run command to generate PDF
sh makepdf.sh
%% | |
%% 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-2022 by Geoffrey M. Poore <[email protected]> | |
%% -------------------------------------------------------------------------- | |
%% 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} | |
[2022/11/30 v1.5 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}}{} | |
\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@<Sentinel>} | |
\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 | |
\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}\FV@EOL}% | |
{\endgroup | |
\catcode`\ =\active | |
\catcode`\^^I=\active | |
\FV@ReadVArg@Char{#1}\FV@EOL}} | |
\def\FV@ReadVArg@Group#1#2#3{% | |
\endgroup | |
#1{#3}} | |
\def\FV@ReadVArg@Char#1#2#3{% | |
\expandafter\expandafter\expandafter | |
\if\expandafter\expandafter\expandafter\relax\expandafter\@gobble\detokenize{#3}\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##3#3{% | |
\endgroup | |
##1{##3}}% | |
\FV@ReadVArg@Char@i{#1}\FV@EOL}% | |
\ifFV@pdfTeXinputenc | |
\def\FV@ReadVArg@Char@UTF#1#2#3{% | |
\expandafter\expandafter\expandafter | |
\if\expandafter\expandafter\expandafter\relax\expandafter\@gobble\detokenize{#3}\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{#3}\endcsname | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\def\FV@UTF@octets@after##1{\FV@ReadVArg@Char@UTF@i{#1}{##1}}% | |
\csname FV@U8:\detokenize{#3}\endcsname#3}% | |
{\FV@ReadVArg@Char@UTF@i{#1}{#3}}} | |
\def\FV@ReadVArg@Char@UTF@i#1#2{% | |
\def\FV@ReadVArg@Char@i##1##2##3#2{% | |
\endgroup | |
##1{##3}}% | |
\FV@ReadVArg@Char@i{#1}\FV@EOL}% | |
\fi | |
\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#3{% | |
\FVExtraAlwaysUnexpanded{\FVExtraUnexpandedReadStarOArgMArgBVArg#1{#2}{#3}}} | |
\FVExtrapdfstringdefDisableCommands{% | |
\makeatletter | |
\def\FV@UnexpandedReadStarOArgMArgBVArg@i#1#2#3{% | |
\FVExtraPDFStringVerbatimDetokenize{#3}}% | |
\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@<Sentinel>} | |
\gdef\FV@VDetok@Scan#1 #2\FV@<Sentinel>{% | |
\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@<Sentinel>}}} | |
\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@<Sentinel>}}% | |
%<-catcode 12 space | |
\FV@VDetok@Scan{}#2\FV@<Sentinel>}% | |
\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@<Sentinel>^^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@<Sentinel>#2^^C(% | |
\if\relax\detokenize(#2)\relax | |
\expandafter\@firstofone | |
\else | |
\expandafter\@gobble | |
\fi | |
({\FV@VDetok@Scan#1^^C \FV@<Sentinel>}\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@<Sentinel>}} | |
\gdef\FV@VDetok@ScanToken@i#1 #2\FV@<Sentinel>{% | |
\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@<Sentinel>}} | |
\begingroup | |
\catcode`\ =12% | |
\gdef\FV@VDetok@ScanTokenActiveSpace{ \FV@VDetok@ScanToken}% | |
\endgroup | |
\gdef\FV@VDetok@ScanTokenWithSpace@i#1#2\FV@<Sentinel>{% | |
\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@<Sentinel>} | |
\gdef\FV@PDFStrVDetok@Scan#1 #2\FV@<Sentinel>{% | |
\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@<Sentinel>}}} | |
\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@<Sentinel>}}% | |
%<-catcode 12 space | |
\FV@PDFStrVDetok@Scan{}#2\FV@<Sentinel>}% | |
\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@<Sentinel>^^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@<Sentinel>#2^^C(% | |
\if\relax\detokenize(#2)\relax | |
\expandafter\@firstofone | |
\else | |
\expandafter\@gobble | |
\fi | |
({\FV@PDFStrVDetok@Scan#1^^C \FV@<Sentinel>}\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@<Sentinel>}} | |
\gdef\FV@PDFStrVDetok@ScanToken@i#1 #2\FV@<Sentinel>{% | |
\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@<Sentinel>}} | |
\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@<Sentinel>{% | |
\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@<Sentinel>} | |
\gdef\FV@EscVDetok@Scan#1 #2\FV@<Sentinel>{% | |
\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@<Sentinel>}}} | |
\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@<Sentinel>}}% | |
%<-catcode 12 space | |
\FV@EscVDetok@Scan{}#2\FV@<Sentinel>}% | |
\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@<Sentinel>^^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@<Sentinel>#2^^C(% | |
\if\relax\detokenize(#2)\relax | |
\expandafter\@firstofone | |
\else | |
\expandafter\@gobble | |
\fi | |
({\FV@EscVDetok@Scan#1^^C \FV@<Sentinel>}\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@<Sentinel>}} | |
\gdef\FV@EscVDetok@ScanToken@i#1 #2\FV@<Sentinel>{% | |
\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@<InvalidEscape>\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@<Sentinel>}} | |
\begingroup | |
\catcode`\ =12% | |
\gdef\FV@EscVDetok@ScanTokenActiveSpace{ \FV@EscVDetok@ScanToken}% | |
\endgroup | |
\gdef\FV@EscVDetok@ScanTokenWithSpace@i#1#2\FV@<Sentinel>{% | |
\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@<Sentinel>{% | |
\if\relax\detokenize{#2}\relax | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\FV@EscVDetok@ScanTokenEscSpace{#1}}% | |
{\noexpand\FV@<InvalidEscape>\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@<Sentinel>} | |
\gdef\FV@PDFStrEscVDetok@Scan#1 #2\FV@<Sentinel>{% | |
\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@<Sentinel>}}} | |
\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@<Sentinel>}}% | |
\040%<-space | |
!FV@PDFStrEscVDetok@Scan{}#2!FV@<Sentinel>}% | |
!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@<Sentinel>^^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@<Sentinel>#2^^C(% | |
\if\relax\detokenize(#2)\relax | |
\expandafter\@firstofone | |
\else | |
\expandafter\@gobble | |
\fi | |
({\FV@PDFStrEscVDetok@Scan#1^^C \FV@<Sentinel>}\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@<Sentinel>}} | |
\gdef\FV@PDFStrEscVDetok@ScanToken@i#1 #2\FV@<Sentinel>{% | |
\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@<Sentinel>}} | |
\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@<Sentinel>{% | |
\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@<InvalidEscape>\FV@<Sentinel> | |
\expandafter\FV@DetokenizeVArg@i\expandafter{\FV@Tmp}{#1}} | |
\gdef\FV@DetokenizeREscVArg@InvalidEscapeCheck#1\FV@<InvalidEscape>#2\FV@<Sentinel>{% | |
\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 <char> 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}} | |
\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 | |
\FVExtraReadVArg{% | |
\FV@UseInlineKeyValues\FV@UseKeyValues\FV@FormattingPrep | |
\FVExtraDetokenizeVArg{% | |
\FVExtraRetokenizeVArg{\FVC@Verb@Extra@ii}{\FV@CatCodes}}}} | |
\def\FVC@Verb@Extra@ii#1{% | |
\ifFV@breaklines | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\FV@InsertBreaks{\FancyVerbFormatInline}{#1}}% | |
{\mbox{#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 | |
\FVExtraReadVArg{% | |
\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}} | |
\def\FV@UseVerb@Extra#1{% | |
\ifFV@breaklines | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\FV@InsertBreaks{\FancyVerbFormatInline}{#1}}% | |
{\mbox{#1}}% | |
\endgroup} | |
\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}} | |
\def\FVC@EscVerb@ii#1{% | |
\ifFV@breaklines | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\FV@InsertBreaks{\FancyVerbFormatInline}{#1}}% | |
{\mbox{#1}}% | |
\endgroup} | |
\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<fvextra><Missing environment contents><Missing environment contents>% | |
!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<fvextra><Missing end for environment !FV@EnvironName><Add environment end>% | |
!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<fvextra>% | |
<Discarded text after end of environment !FV@EnvironName>% | |
<Discarded text after end of environment !FV@EnvironName>% | |
!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} | |
\def\FV@Command#1#2{% | |
\FVExtra@ifstarVArg | |
{\def\FV@KeyValues{#1,showspaces}\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{\textvisiblespace} | |
\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} | |
\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}}}}} | |
\define@booleankey{FV}{showspaces}% | |
{\def\FV@Space{\FV@SpaceColor{\FancyVerbSpace}}}% | |
{\def\FV@Space{\ }} | |
\fvset{spacecolor=none, showspaces=false} | |
\define@booleankey{FV}{mathescape}% | |
{\let\FancyVerbMathEscape\FV@MathEscape}% | |
{\let\FancyVerbMathEscape\relax} | |
\def\FV@MathEscape{\catcode`\$=3\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 | |
\FancyVerbFormatLine{% | |
\FancyVerbHighlightLine{% | |
\FV@ObeyTabs{\FancyVerbFormatText{#1}}}}\hss | |
\FV@RightListFrame | |
\FV@RightListNumber}% | |
\hss}} | |
\def\FV@BProcessLine#1{% | |
\hbox{\FancyVerbFormatLine{% | |
\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}{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} | |
\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}{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} | |
\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@Break@LastToken=\FV@Undefined | |
\FV@Break@Scan} | |
\def\FV@Break@AnyToken#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 | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% | |
\let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan | |
\def\FV@RescanToken{#1}% | |
\else | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% | |
\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 | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% | |
\let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan | |
\def\FV@RescanToken{#1}% | |
\else | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% | |
\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% | |
{\FV@BreakBuffer@Append{#1}\FV@Break@Scan}% | |
{\ifbool{FV@breakafterinrun}% | |
{\FV@BreakBuffer@Append{#1\FancyVerbBreakAfterBreak}% | |
\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 | |
\FV@BreakBuffer@Append{#1\FancyVerbBreakAfterBreak}% | |
\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}% | |
{\FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% | |
\FV@Break@Scan}}% | |
{\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{% | |
\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 | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% | |
\let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan@UTF | |
\def\FV@RescanToken{#1}% | |
\else | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% | |
\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 | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak}% | |
\let\FV@Break@Next\FV@Break@BeforeTokenBreak@AfterRescan@UTF | |
\def\FV@RescanToken{#1}% | |
\else | |
\FV@BreakBuffer@Append{\FancyVerbBreakBeforeBreak#1}% | |
\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% | |
{\FV@BreakBuffer@Append{#1}\FV@Break@Scan}% | |
{\ifbool{FV@breakafterinrun}% | |
{\FV@BreakBuffer@Append{#1\FancyVerbBreakAfterBreak}% | |
\let\FV@Break@Next\FV@Break@Scan}% | |
{\FV@BreakBuffer@Append{#1}% | |
\ifx\@let@token\bgroup\relax | |
\let\FV@Break@Next\FV@Break@AfterTokenBreak@Group@UTF | |
\else | |
\let\FV@Break@Next\FV@Break@AfterTokenBreak@UTF@i | |
\fi}% | |
\FV@Break@Next}% | |
} | |
\def\FV@Break@AfterTokenBreak@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@UTF@i | |
\else | |
\def\FV@NextToken{#1}% | |
\ifx\FV@LastToken\FV@NextToken | |
\else | |
\FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% | |
\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 | |
{\FV@Break@Group}% | |
{\FV@Break@AfterTokenBreak@Group@UTF@i}}% | |
{\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 | |
\FV@BreakBuffer@Append{\FancyVerbBreakAfterBreak}% | |
\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 | |
\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 | |
\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'. |
pandoc -s -N --template=template.latex -V geometry:margin=.3in README.md -o output.pdf |
% Options for packages loaded elsewhere | |
\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} | |
\PassOptionsToPackage{hyphens}{url} | |
$if(colorlinks)$ | |
\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor} | |
$endif$ | |
$if(CJKmainfont)$ | |
\PassOptionsToPackage{space}{xeCJK} | |
$endif$ | |
% | |
\documentclass[ | |
$if(fontsize)$ | |
$fontsize$, | |
$endif$ | |
$if(papersize)$ | |
$papersize$paper, | |
$endif$ | |
$if(beamer)$ | |
ignorenonframetext, | |
$if(handout)$ | |
handout, | |
$endif$ | |
$if(aspectratio)$ | |
aspectratio=$aspectratio$, | |
$endif$ | |
$endif$ | |
$for(classoption)$ | |
$classoption$$sep$, | |
$endfor$ | |
]{$documentclass$} | |
$if(beamer)$ | |
$if(background-image)$ | |
\usebackgroundtemplate{% | |
\includegraphics[width=\paperwidth]{$background-image$}% | |
} | |
$endif$ | |
\usepackage{pgfpages} | |
\usepackage{fvextra} | |
\begin{Highlighting}[breaklines,numbers=left,,] | |
\setbeamertemplate{caption}[numbered] | |
\setbeamertemplate{caption label separator}{: } | |
\setbeamercolor{caption name}{fg=normal text.fg} | |
\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ | |
$for(beameroption)$ | |
\setbeameroption{$beameroption$} | |
$endfor$ | |
% Prevent slide breaks in the middle of a paragraph | |
\widowpenalties 1 10000 | |
\raggedbottom | |
$if(section-titles)$ | |
\setbeamertemplate{part page}{ | |
\centering | |
\begin{beamercolorbox}[sep=16pt,center]{part title} | |
\usebeamerfont{part title}\insertpart\par | |
\end{beamercolorbox} | |
} | |
\setbeamertemplate{section page}{ | |
\centering | |
\begin{beamercolorbox}[sep=12pt,center]{part title} | |
\usebeamerfont{section title}\insertsection\par | |
\end{beamercolorbox} | |
} | |
\setbeamertemplate{subsection page}{ | |
\centering | |
\begin{beamercolorbox}[sep=8pt,center]{part title} | |
\usebeamerfont{subsection title}\insertsubsection\par | |
\end{beamercolorbox} | |
} | |
\AtBeginPart{ | |
\frame{\partpage} | |
} | |
\AtBeginSection{ | |
\ifbibliography | |
\else | |
\frame{\sectionpage} | |
\fi | |
} | |
\AtBeginSubsection{ | |
\frame{\subsectionpage} | |
} | |
$endif$ | |
$endif$ | |
$if(beamerarticle)$ | |
\usepackage{beamerarticle} % needs to be loaded first | |
$endif$ | |
\usepackage{amsmath,amssymb} | |
$if(linestretch)$ | |
\usepackage{setspace} | |
$endif$ | |
\usepackage{iftex} | |
\ifPDFTeX | |
\usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} | |
\usepackage[utf8]{inputenc} | |
\usepackage{textcomp} % provide euro and other symbols | |
\else % if luatex or xetex | |
$if(mathspec)$ | |
\ifXeTeX | |
\usepackage{mathspec} % this also loads fontspec | |
\else | |
\usepackage{unicode-math} % this also loads fontspec | |
\fi | |
$else$ | |
\usepackage{unicode-math} % this also loads fontspec | |
$endif$ | |
\defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme | |
\defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} | |
\fi | |
$if(fontfamily)$ | |
$else$ | |
$-- Set default font before Beamer theme so the theme can override it | |
\usepackage{lmodern} | |
$endif$ | |
$-- Set Beamer theme before user font settings so they can override theme | |
$if(beamer)$ | |
$if(theme)$ | |
\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} | |
$endif$ | |
$if(colortheme)$ | |
\usecolortheme{$colortheme$} | |
$endif$ | |
$if(fonttheme)$ | |
\usefonttheme{$fonttheme$} | |
$endif$ | |
$if(mainfont)$ | |
\usefonttheme{serif} % use mainfont rather than sansfont for slide text | |
$endif$ | |
$if(innertheme)$ | |
\useinnertheme{$innertheme$} | |
$endif$ | |
$if(outertheme)$ | |
\useoutertheme{$outertheme$} | |
$endif$ | |
$endif$ | |
$-- User font settings (must come after default font and Beamer theme) | |
$if(fontfamily)$ | |
\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} | |
$endif$ | |
\ifPDFTeX\else | |
% xetex/luatex font selection | |
$if(mainfont)$ | |
\setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$} | |
$endif$ | |
$if(sansfont)$ | |
\setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$} | |
$endif$ | |
$if(monofont)$ | |
\setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$]{$monofont$} | |
$endif$ | |
$for(fontfamilies)$ | |
\newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} | |
$endfor$ | |
$if(mathfont)$ | |
$if(mathspec)$ | |
\ifXeTeX | |
\setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} | |
\else | |
\setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} | |
\fi | |
$else$ | |
\setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} | |
$endif$ | |
$endif$ | |
$if(CJKmainfont)$ | |
\ifXeTeX | |
\usepackage{xeCJK} | |
\setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} | |
$if(CJKsansfont)$ | |
\setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$} | |
$endif$ | |
$if(CJKmonofont)$ | |
\setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$} | |
$endif$ | |
\fi | |
$endif$ | |
$if(luatexjapresetoptions)$ | |
\ifLuaTeX | |
\usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} | |
\fi | |
$endif$ | |
$if(CJKmainfont)$ | |
\ifLuaTeX | |
\usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} | |
\setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} | |
\fi | |
$endif$ | |
\fi | |
$if(zero-width-non-joiner)$ | |
%% Support for zero-width non-joiner characters. | |
\makeatletter | |
\def\zerowidthnonjoiner{% | |
% Prevent ligatures and adjust kerning, but still support hyphenating. | |
\texorpdfstring{% | |
\TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}% | |
\ifvmode\else\nobreak\hskip\z@skip\fi}{}% | |
}{}% | |
} | |
\makeatother | |
\ifPDFTeX | |
\DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} | |
\else | |
\catcode`^^^^200c=\active | |
\protected\def ^^^^200c{\zerowidthnonjoiner} | |
\fi | |
%% End of ZWNJ support | |
$endif$ | |
% Use upquote if available, for straight quotes in verbatim environments | |
\IfFileExists{upquote.sty}{\usepackage{upquote}}{} | |
\IfFileExists{microtype.sty}{% use microtype if available | |
\usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} | |
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts | |
}{} | |
$if(indent)$ | |
$else$ | |
\makeatletter | |
\@ifundefined{KOMAClassName}{% if non-KOMA class | |
\IfFileExists{parskip.sty}{% | |
\usepackage{parskip} | |
}{% else | |
\setlength{\parindent}{0pt} | |
\setlength{\parskip}{6pt plus 2pt minus 1pt}} | |
}{% if KOMA class | |
\KOMAoptions{parskip=half}} | |
\makeatother | |
$endif$ | |
$if(verbatim-in-note)$ | |
\usepackage{fancyvrb} | |
$endif$ | |
\usepackage{xcolor} | |
$if(geometry)$ | |
$if(beamer)$ | |
\geometry{$for(geometry)$$geometry$$sep$,$endfor$} | |
$else$ | |
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} | |
$endif$ | |
$endif$ | |
$if(beamer)$ | |
\newif\ifbibliography | |
$endif$ | |
$if(listings)$ | |
\usepackage{listings} | |
\newcommand{\passthrough}[1]{#1} | |
\lstset{defaultdialect=[5.3]Lua} | |
\lstset{defaultdialect=[x86masm]Assembler} | |
$endif$ | |
$if(lhs)$ | |
\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} | |
$endif$ | |
$if(highlighting-macros)$ | |
$highlighting-macros$ | |
$endif$ | |
$if(tables)$ | |
\usepackage{longtable,booktabs,array} | |
$if(multirow)$ | |
\usepackage{multirow} | |
$endif$ | |
\usepackage{calc} % for calculating minipage widths | |
$if(beamer)$ | |
\usepackage{caption} | |
% Make caption package work with longtable | |
\makeatletter | |
\def\fnum@table{\tablename~\thetable} | |
\makeatother | |
$else$ | |
% Correct order of tables after \paragraph or \subparagraph | |
\usepackage{etoolbox} | |
\makeatletter | |
\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} | |
\makeatother | |
% Allow footnotes in longtable head/foot | |
\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} | |
\makesavenoteenv{longtable} | |
$endif$ | |
$endif$ | |
$if(graphics)$ | |
\usepackage{graphicx} | |
\makeatletter | |
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} | |
\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} | |
\makeatother | |
% Scale images if necessary, so that they will not overflow the page | |
% margins by default, and it is still possible to overwrite the defaults | |
% using explicit options in \includegraphics[width, height, ...]{} | |
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} | |
% Set default figure placement to htbp | |
\makeatletter | |
\def\fps@figure{htbp} | |
\makeatother | |
$endif$ | |
$if(svg)$ | |
\usepackage{svg} | |
$endif$ | |
$if(strikeout)$ | |
$-- also used for underline | |
\usepackage{soul} | |
$endif$ | |
\setlength{\emergencystretch}{3em} % prevent overfull lines | |
\providecommand{\tightlist}{% | |
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} | |
$if(numbersections)$ | |
\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} | |
$else$ | |
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering | |
$endif$ | |
$if(subfigure)$ | |
\usepackage{subcaption} | |
$endif$ | |
$if(beamer)$ | |
$else$ | |
$if(block-headings)$ | |
% Make \paragraph and \subparagraph free-standing | |
\ifx\paragraph\undefined\else | |
\let\oldparagraph\paragraph | |
\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} | |
\fi | |
\ifx\subparagraph\undefined\else | |
\let\oldsubparagraph\subparagraph | |
\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} | |
\fi | |
$endif$ | |
$endif$ | |
$if(pagestyle)$ | |
\pagestyle{$pagestyle$} | |
$endif$ | |
$if(csl-refs)$ | |
\newlength{\cslhangindent} | |
\setlength{\cslhangindent}{1.5em} | |
\newlength{\csllabelwidth} | |
\setlength{\csllabelwidth}{3em} | |
\newlength{\cslentryspacingunit} % times entry-spacing | |
\setlength{\cslentryspacingunit}{\parskip} | |
\newenvironment{CSLReferences}[2] % #1 hanging-ident, #2 entry spacing | |
{% don't indent paragraphs | |
\setlength{\parindent}{0pt} | |
% turn on hanging indent if param 1 is 1 | |
\ifodd #1 | |
\let\oldpar\par | |
\def\par{\hangindent=\cslhangindent\oldpar} | |
\fi | |
% set entry spacing | |
\setlength{\parskip}{#2\cslentryspacingunit} | |
}% | |
{} | |
\usepackage{calc} | |
\newcommand{\CSLBlock}[1]{#1\hfill\break} | |
\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{#1}} | |
\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{#1}\break} | |
\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} | |
$endif$ | |
$if(lang)$ | |
\ifLuaTeX | |
\usepackage[bidi=basic]{babel} | |
\else | |
\usepackage[bidi=default]{babel} | |
\fi | |
$if(babel-lang)$ | |
\babelprovide[main,import]{$babel-lang$} | |
$if(mainfont)$ | |
\ifPDFTeX | |
\else | |
\babelfont[$babel-lang$]{rm}{$mainfont$} | |
\fi | |
$endif$ | |
$endif$ | |
$for(babel-otherlangs)$ | |
\babelprovide[import]{$babel-otherlangs$} | |
$endfor$ | |
% get rid of language-specific shorthands (see #6817): | |
\let\LanguageShortHands\languageshorthands | |
\def\languageshorthands#1{} | |
$endif$ | |
$for(header-includes)$ | |
$header-includes$ | |
$endfor$ | |
\ifLuaTeX | |
\usepackage{selnolig} % disable illegal ligatures | |
\fi | |
$if(dir)$ | |
\ifPDFTeX | |
\TeXXeTstate=1 | |
\newcommand{\RL}[1]{\beginR #1\endR} | |
\newcommand{\LR}[1]{\beginL #1\endL} | |
\newenvironment{RTL}{\beginR}{\endR} | |
\newenvironment{LTR}{\beginL}{\endL} | |
\fi | |
$endif$ | |
$if(natbib)$ | |
\usepackage[$natbiboptions$]{natbib} | |
\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} | |
$endif$ | |
$if(biblatex)$ | |
\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} | |
$for(bibliography)$ | |
\addbibresource{$bibliography$} | |
$endfor$ | |
$endif$ | |
$if(nocite-ids)$ | |
\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} | |
$endif$ | |
$if(csquotes)$ | |
\usepackage{csquotes} | |
$endif$ | |
\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}} | |
\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available | |
\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$} | |
$if(links-as-notes)$ | |
% Make links footnotes instead of hotlinks: | |
\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} | |
$endif$ | |
$if(verbatim-in-note)$ | |
\VerbatimFootnotes % allow verbatim text in footnotes | |
$endif$ | |
\hypersetup{ | |
$if(title-meta)$ | |
pdftitle={$title-meta$}, | |
$endif$ | |
$if(author-meta)$ | |
pdfauthor={$author-meta$}, | |
$endif$ | |
$if(lang)$ | |
pdflang={$lang$}, | |
$endif$ | |
$if(subject)$ | |
pdfsubject={$subject$}, | |
$endif$ | |
$if(keywords)$ | |
pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, | |
$endif$ | |
$if(colorlinks)$ | |
colorlinks=true, | |
linkcolor={$if(linkcolor)$$linkcolor$$else$Maroon$endif$}, | |
filecolor={$if(filecolor)$$filecolor$$else$Maroon$endif$}, | |
citecolor={$if(citecolor)$$citecolor$$else$Blue$endif$}, | |
urlcolor={$if(urlcolor)$$urlcolor$$else$Blue$endif$}, | |
$else$ | |
$if(boxlinks)$ | |
$else$ | |
hidelinks, | |
$endif$ | |
$endif$ | |
pdfcreator={LaTeX via pandoc}} | |
$if(title)$ | |
\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} | |
$endif$ | |
$if(subtitle)$ | |
$if(beamer)$ | |
$else$ | |
\usepackage{etoolbox} | |
\makeatletter | |
\providecommand{\subtitle}[1]{% add subtitle to \maketitle | |
\apptocmd{\@title}{\par {\large #1 \par}}{}{} | |
} | |
\makeatother | |
$endif$ | |
\subtitle{$subtitle$} | |
$endif$ | |
\author{$for(author)$$author$$sep$ \and $endfor$} | |
\date{$date$} | |
$if(beamer)$ | |
$if(institute)$ | |
\institute{$for(institute)$$institute$$sep$ \and $endfor$} | |
$endif$ | |
$if(titlegraphic)$ | |
\titlegraphic{\includegraphics{$titlegraphic$}} | |
$endif$ | |
$if(logo)$ | |
\logo{\includegraphics{$logo$}} | |
$endif$ | |
$endif$ | |
\begin{document} | |
$if(has-frontmatter)$ | |
\frontmatter | |
$endif$ | |
$if(title)$ | |
$if(beamer)$ | |
\frame{\titlepage} | |
$else$ | |
\maketitle | |
$endif$ | |
$if(abstract)$ | |
\begin{abstract} | |
$abstract$ | |
\end{abstract} | |
$endif$ | |
$endif$ | |
$for(include-before)$ | |
$include-before$ | |
$endfor$ | |
$if(toc)$ | |
$if(toc-title)$ | |
\renewcommand*\contentsname{$toc-title$} | |
$endif$ | |
$if(beamer)$ | |
\begin{frame}[allowframebreaks] | |
$if(toc-title)$ | |
\frametitle{$toc-title$} | |
$endif$ | |
\tableofcontents[hideallsubsections] | |
\end{frame} | |
$else$ | |
{ | |
$if(colorlinks)$ | |
\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} | |
$endif$ | |
\setcounter{tocdepth}{$toc-depth$} | |
\tableofcontents | |
} | |
$endif$ | |
$endif$ | |
$if(lof)$ | |
\listoffigures | |
$endif$ | |
$if(lot)$ | |
\listoftables | |
$endif$ | |
$if(linestretch)$ | |
\setstretch{$linestretch$} | |
$endif$ | |
$if(has-frontmatter)$ | |
\mainmatter | |
$endif$ | |
$body$ | |
$if(has-frontmatter)$ | |
\backmatter | |
$endif$ | |
$if(natbib)$ | |
$if(bibliography)$ | |
$if(biblio-title)$ | |
$if(has-chapters)$ | |
\renewcommand\bibname{$biblio-title$} | |
$else$ | |
\renewcommand\refname{$biblio-title$} | |
$endif$ | |
$endif$ | |
$if(beamer)$ | |
\begin{frame}[allowframebreaks]{$biblio-title$} | |
\bibliographytrue | |
$endif$ | |
\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} | |
$if(beamer)$ | |
\end{frame} | |
$endif$ | |
$endif$ | |
$endif$ | |
$if(biblatex)$ | |
$if(beamer)$ | |
\begin{frame}[allowframebreaks]{$biblio-title$} | |
\bibliographytrue | |
\printbibliography[heading=none] | |
\end{frame} | |
$else$ | |
\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ | |
$endif$ | |
$endif$ | |
$for(include-after)$ | |
$include-after$ | |
$endfor$ | |
\end{document} |