%%
%% This is file `mandistudent.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% mandistudent.dtx  (with options: `package')
%% 
%%  Copyright (C) 2021,2022 by Paul J. Heafner <heafnerj@gmail.com>
%%  ---------------------------------------------------------------------------
%%  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.
%% 
%%  This work has the LPPL maintenance status `maintained'.
%% 
%%  The Current Maintainer of this work is Paul J. Heafner.
%% 
%%  This work consists of the files mandi.dtx
%%                                  mandistudent.dtx
%%                                  mandiexp.dtx
%%                                  mandi.ins
%%                                  mandi.pdf
%%                                  README.md
%% 
%%  and includes the derived files  mandi.sty
%%                                  mandistudent.sty
%%                                  mandiexp.sty
%%                                  vdemo.py (not needed)
%%  ---------------------------------------------------------------------------
%% 
\def\mandistudent@version{3.1.0}
\def\mandistudent@date{2022-01-27}
\NeedsTeXFormat{LaTeX2e}[2020-02-02]
\DeclareRelease{v3.1.0}{2022-01-27}{mandistudent.sty}
\DeclareCurrentRelease{v\mandistudent@version}{\mandistudent@date}
\ProvidesPackage{mandistudent}
  [\mandistudent@date\space v\mandistudent@version\space Macros for introductory physics]
\newcommand*{\mandistudentversion}{v\mandistudent@version\space dated \mandistudent@date}
\RequirePackage{amsmath}             % AMS goodness (don't load amssymb or amsfonts)
\RequirePackage[inline]{enumitem}    % needed for physicsproblem environment
\RequirePackage{eso-pic}             % needed for \hilite
\RequirePackage[g]{esvect}           % needed for nice vector arrow, style g
\RequirePackage{pgfopts}             % needed for key-value interface
\RequirePackage{iftex}               % needed for requiring LuaLaTeX
\RequirePackage{makebox}             % needed for consistent \dirvect; \makebox
\RequirePackage{mandi}
\RequirePackage{mathtools}           % needed for paired delimiters; extends amsmath
\RequirePackage{nicematrix}          % needed for column and row vectors
\RequirePackage{qrcode}              % needed for QR codes in webvpythonblock
\qrset{height=1.5cm}                 % set default size of QR code
\RequirePackage[most]{tcolorbox}     % needed for program listings
\RequirePackage{tensor}              % needed for index notation
\RequirePackage{tikz}                % needed for \hilite
\usetikzlibrary{shapes,fit,tikzmark} % needed for \hilite
\RequirePackage{unicode-math}        % needed for Unicode support
\IfFormatAtLeastTF {2020-10-01}      % load xparse if necessary
  {}%
  {\RequirePackage{xparse}}%
\RequirePackage{hyperref}            % load last
\RequireLuaTeX                       % require this engine
\unimathsetup{math-style=ISO}
\unimathsetup{warnings-off={mathtools-colon,mathtools-overbracket}}
\setmathfont[Scale=MatchLowercase]
  {Latin Modern Math}    % default math font; better J
\setmathfont[Scale=MatchLowercase,range={sfit/{latin},bfsfit/{latin}}]
  {TeX Gyre DejaVu Math} % single-storey lowercase g
\setmathfont[Scale=MatchLowercase,range={sfup/{latin},bfsfup/{latin}}]
  {TeX Gyre DejaVu Math} % single-storey lowercase g
\setmathfont[Scale=MatchLowercase,range={\mathscr,\mathbfscr}]{XITS Math}
\setmathfont[Scale=MatchLowercase,range={\mathcal,\mathbfcal},StylisticSet=1]{XITS Math}
\setmathfont[Scale=MatchLowercase,range={"E17C-"E1F6}]{STIX Two Math}
\newfontfamily{\symsfgreek}{STIX Two Math}
\newcommand{\symsfupalpha}      {\text{\symsfgreek{^^^^e196}}}
\newcommand{\symsfupbeta}       {\text{\symsfgreek{^^^^e197}}}
\newcommand{\symsfupgamma}      {\text{\symsfgreek{^^^^e198}}}
\newcommand{\symsfupdelta}      {\text{\symsfgreek{^^^^e199}}}
\newcommand{\symsfupepsilon}    {\text{\symsfgreek{^^^^e1af}}}
\newcommand{\symsfupvarepsilon} {\text{\symsfgreek{^^^^e19a}}}
\newcommand{\symsfupzeta}       {\text{\symsfgreek{^^^^e19b}}}
\newcommand{\symsfupeta}        {\text{\symsfgreek{^^^^e19c}}}
\newcommand{\symsfuptheta}      {\text{\symsfgreek{^^^^e19d}}}
\newcommand{\symsfupvartheta}   {\text{\symsfgreek{^^^^e1b0}}}
\newcommand{\symsfupiota}       {\text{\symsfgreek{^^^^e19e}}}
\newcommand{\symsfupkappa}      {\text{\symsfgreek{^^^^e19f}}}
\newcommand{\symsfuplambda}     {\text{\symsfgreek{^^^^e1a0}}}
\newcommand{\symsfupmu}         {\text{\symsfgreek{^^^^e1a1}}}
\newcommand{\symsfupnu}         {\text{\symsfgreek{^^^^e1a2}}}
\newcommand{\symsfupxi}         {\text{\symsfgreek{^^^^e1a3}}}
\newcommand{\symsfupomicron}    {\text{\symsfgreek{^^^^e1a4}}}
\newcommand{\symsfuppi}         {\text{\symsfgreek{^^^^e1a5}}}
\newcommand{\symsfupvarpi}      {\text{\symsfgreek{^^^^e1b3}}}
\newcommand{\symsfuprho}        {\text{\symsfgreek{^^^^e1a6}}}
\newcommand{\symsfupvarrho}     {\text{\symsfgreek{^^^^e1b2}}}
\newcommand{\symsfupsigma}      {\text{\symsfgreek{^^^^e1a8}}}
\newcommand{\symsfupvarsigma}   {\text{\symsfgreek{^^^^e1a7}}}
\newcommand{\symsfuptau}        {\text{\symsfgreek{^^^^e1a9}}}
\newcommand{\symsfupupsilon}    {\text{\symsfgreek{^^^^e1aa}}}
\newcommand{\symsfupphi}        {\text{\symsfgreek{^^^^e1b1}}}
\newcommand{\symsfupvarphi}     {\text{\symsfgreek{^^^^e1ab}}}
\newcommand{\symsfupchi}        {\text{\symsfgreek{^^^^e1ac}}}
\newcommand{\symsfuppsi}        {\text{\symsfgreek{^^^^e1ad}}}
\newcommand{\symsfupomega}      {\text{\symsfgreek{^^^^e1ae}}}
\newcommand{\symsfupDelta}      {\text{\symsfgreek{^^^^e180}}}
\newcommand{\symsfupGamma}      {\text{\symsfgreek{^^^^e17f}}}
\newcommand{\symsfupTheta}      {\text{\symsfgreek{^^^^e18e}}}
\newcommand{\symsfupLambda}     {\text{\symsfgreek{^^^^e187}}}
\newcommand{\symsfupXi}         {\text{\symsfgreek{^^^^e18a}}}
\newcommand{\symsfupPi}         {\text{\symsfgreek{^^^^e18c}}}
\newcommand{\symsfupSigma}      {\text{\symsfgreek{^^^^e18f}}}
\newcommand{\symsfupUpsilon}    {\text{\symsfgreek{^^^^e191}}}
\newcommand{\symsfupPhi}        {\text{\symsfgreek{^^^^e192}}}
\newcommand{\symsfupPsi}        {\text{\symsfgreek{^^^^e194}}}
\newcommand{\symsfupOmega}      {\text{\symsfgreek{^^^^e195}}}
\newcommand{\symsfitalpha}      {\text{\symsfgreek{^^^^e1d8}}}
\newcommand{\symsfitbeta}       {\text{\symsfgreek{^^^^e1d9}}}
\newcommand{\symsfitgamma}      {\text{\symsfgreek{^^^^e1da}}}
\newcommand{\symsfitdelta}      {\text{\symsfgreek{^^^^e1db}}}
\newcommand{\symsfitepsilon}    {\text{\symsfgreek{^^^^e1f1}}}
\newcommand{\symsfitvarepsilon} {\text{\symsfgreek{^^^^e1dc}}}
\newcommand{\symsfitzeta}       {\text{\symsfgreek{^^^^e1dd}}}
\newcommand{\symsfiteta}        {\text{\symsfgreek{^^^^e1de}}}
\newcommand{\symsfittheta}      {\text{\symsfgreek{^^^^e1df}}}
\newcommand{\symsfitvartheta}   {\text{\symsfgreek{^^^^e1f2}}}
\newcommand{\symsfitiota}       {\text{\symsfgreek{^^^^e1e0}}}
\newcommand{\symsfitkappa}      {\text{\symsfgreek{^^^^e1e1}}}
\newcommand{\symsfitlambda}     {\text{\symsfgreek{^^^^e1e2}}}
\newcommand{\symsfitmu}         {\text{\symsfgreek{^^^^e1e3}}}
\newcommand{\symsfitnu}         {\text{\symsfgreek{^^^^e1e4}}}
\newcommand{\symsfitxi}         {\text{\symsfgreek{^^^^e1e5}}}
\newcommand{\symsfitomicron}    {\text{\symsfgreek{^^^^e1e6}}}
\newcommand{\symsfitpi}         {\text{\symsfgreek{^^^^e1e7}}}
\newcommand{\symsfitvarpi}      {\text{\symsfgreek{^^^^e1f5}}}
\newcommand{\symsfitrho}        {\text{\symsfgreek{^^^^e1e8}}}
\newcommand{\symsfitvarrho}     {\text{\symsfgreek{^^^^e1f4}}}
\newcommand{\symsfitsigma}      {\text{\symsfgreek{^^^^e1ea}}}
\newcommand{\symsfitvarsigma}   {\text{\symsfgreek{^^^^e1e9}}}
\newcommand{\symsfittau}        {\text{\symsfgreek{^^^^e1eb}}}
\newcommand{\symsfitupsilon}    {\text{\symsfgreek{^^^^e1ec}}}
\newcommand{\symsfitphi}        {\text{\symsfgreek{^^^^e1f3}}}
\newcommand{\symsfitvarphi}     {\text{\symsfgreek{^^^^e1ed}}}
\newcommand{\symsfitchi}        {\text{\symsfgreek{^^^^e1ee}}}
\newcommand{\symsfitpsi}        {\text{\symsfgreek{^^^^e1ef}}}
\newcommand{\symsfitomega}      {\text{\symsfgreek{^^^^e1f0}}}
\newcommand{\symsfitDelta}      {\text{\symsfgreek{^^^^e1c2}}}
\newcommand{\symsfitGamma}      {\text{\symsfgreek{^^^^e1c1}}}
\newcommand{\symsfitTheta}      {\text{\symsfgreek{^^^^e1d0}}}
\newcommand{\symsfitLambda}     {\text{\symsfgreek{^^^^e1c9}}}
\newcommand{\symsfitXi}         {\text{\symsfgreek{^^^^e1cc}}}
\newcommand{\symsfitPi}         {\text{\symsfgreek{^^^^e1ce}}}
\newcommand{\symsfitSigma}      {\text{\symsfgreek{^^^^e1d1}}}
\newcommand{\symsfitUpsilon}    {\text{\symsfgreek{^^^^e1d3}}}
\newcommand{\symsfitPhi}        {\text{\symsfgreek{^^^^e1d4}}}
\newcommand{\symsfitPsi}        {\text{\symsfgreek{^^^^e1d6}}}
\newcommand{\symsfitOmega}      {\text{\symsfgreek{^^^^e1d7}}}
\DeclareFontFamily{U}{esvect}{}
\DeclareFontShape{U}{esvect}{m}{n}{%
  <-5.5> vect5
  <5.5-6.5> vect6
  <6.5-7.5> vect7
  <7.5-8.5> vect8
  <8.5-9.5> vect9
  <9.5-> vect10
}{}%
\typeout{}%
\typeout{mandistudent: You are using mandistudent \mandistudentversion.}%
\typeout{mandistudent: This package requires LuaLaTeX.}%
\typeout{mandistudent: This package changes the default math font(s).}%
\typeout{mandistudent: This package redefines the \protect\vec\space command.}%
\typeout{}%
\RenewDocumentCommand{\vec}{ s m e{_^} }%
  {%
    % Note the \, used to make superscript look better.
    \IfBooleanTF{#1}
      {%
        \vv{#2}%      % * gives an arrow
        % Use \sp{} primitive for superscript.
        % Adjust superscript for the arrow.
        \IfValueT{#4}%
          {\sp{\,#4\vphantom{\smash[t]{\big|}}}}
      }%
      {%
        \symbfit{#2}  % no * gives us bold
        % Use \sp{} primitive for superscript.
        % No superscript adjustment needed.
        \IfValueT{#4}%
          {\sp{#4\vphantom{\smash[t]{\big|}}}}
      }%
      % Use \sb{} primitive for subscript.
    \IfValueT{#3}%
      {\sb{#3\vphantom{\smash[b]{|}}}}
  }%
\NewDocumentCommand{\dirvec}{ s m e{_^} }%
  {%
    \widehat%
      {%
        \makebox*{\(w\)}%
          {%
            \ensuremath{%
              \IfBooleanTF {#1}%
                {%
                  #2%
                }%
                {%
                  \symbfit{#2}%
                }%
            }%
          }%
      }%
    \IfValueT{#3}%
      {\sb{#3\vphantom{\smash[b]{|}}}}%
    \IfValueT{#4}%
      {\sp{\,#4\vphantom{\smash[t]{\big|}}}}%
  }%
\NewDocumentCommand{\zerovec}{ s }%
  {%
    \IfBooleanTF {#1}
      {\vv{0}}%
      {\symbfup{0}}%
  }%
\ExplSyntaxOn
\NewDocumentCommand{\colvec}{ O{,} m }
  {
    \__mandi_vectormain:nnnn { p } { \\ } { #1 } { #2 }
  }
\NewDocumentCommand{\rowvec}{ O{,} m }
  {
    \__mandi_vectormain:nnnn { p } { & } { #1 } { #2 }
  }
\seq_new:N \l__mandi_vectorarg_seq
\cs_new_protected:Npn \__mandi_vectormain:nnnn #1#2#3#4
  {
    \seq_set_split:Nnn \l__mandi_vectorarg_seq { #3 } { #4 }
    \begin{#1NiceMatrix}[r]
      \seq_use:Nnnn \l__mandi_vectorarg_seq { #2 } { #2 } { #2 }
    \end{#1NiceMatrix}
  }
\ExplSyntaxOff
\NewDocumentCommand{\changein}{}{\Delta}
\DeclarePairedDelimiterX{\doublebars}[1]{\lVert}{\rVert}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterX{\singlebars}[1]{\lvert}{\rvert}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterX{\anglebrackets}[1]{\langle}{\rangle}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterX{\parentheses}[1]{(}{)}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterX{\squarebrackets}[1]{\lbrack}{\rbrack}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterX{\curlybraces}[1]{\lbrace}{\rbrace}{\ifblank{#1}{\:\cdot\:}{#1}}
\NewDocumentCommand{\magnitude}{}{\doublebars}
\NewDocumentCommand{\norm}{}{\doublebars}
\NewDocumentCommand{\absolutevalue}{}{\singlebars}
\NewDocumentCommand{\parallelto}{}%
  {%
    \mkern3mu\vphantom{\perp}\vrule depth 0pt\mkern2mu\vrule depth 0pt\mkern3mu%
  }%
\NewDocumentCommand{\perpendicularto}{}{\perp}
\NewDocumentEnvironment{physicsproblem}{ m }%
  {%
    \newpage%
    \section*{#1}%
    \newlist{parts}{enumerate}{2}%
    \setlist[parts]{label=\bfseries(\alph*)}%
  }%
  {}%
\NewDocumentEnvironment{physicsproblem*}{ m }%
  {%
    \newpage%
    \section*{#1}%
    \newlist{parts}{enumerate*}{2}%
    \setlist[parts]{label=\bfseries(\alph*)}%
  }%
  {}%
\NewDocumentCommand{\problempart}{}{\item}%
\NewDocumentEnvironment{physicssolution}{ +b }%
  {%
    % Make equation numbering consecutive through the document.
    \begin{align}
      #1
    \end{align}
  }%
  {}%
\NewDocumentEnvironment{physicssolution*}{ +b }%
  {%
    % Make equation numbering consecutive through the document.
    \begin{align*}
      #1
    \end{align*}
  }%
  {}%
\NewDocumentCommand{\reason}{ O{4cm} m }%
  {%
    &&\begin{minipage}{#1}\raggedright\small #2\end{minipage}%
  }%
\newcounter{tikzhighlightnode}
\NewDocumentCommand{\hilite}{ O{magenta!60} m O{rectangle} }%
  {%
    \stepcounter{tikzhighlightnode}%
    \tikzmarknode{highlighted-node-\number\value{tikzhighlightnode}}{#2}%
    \edef\temp{%
      \noexpand\AddToShipoutPictureBG{%
        \noexpand\begin{tikzpicture}[overlay,remember picture]%
        \noexpand\iftikzmarkoncurrentpage{highlighted-node-\number\value{tikzhighlightnode}}%
         \noexpand\node[inner sep=1.0pt,fill=#1,#3,fit=(highlighted-node-\number\value{tikzhighlightnode})]{};%
        \noexpand\fi
        \noexpand\end{tikzpicture}%
      }%
    }%
    \temp%
  }%
\NewDocumentCommand{\image}{ O{scale=1} m m m }%
  {%
    \par
    \begin{figure}[ht!]
      \centering%
      \includegraphics[#1]{#2}%
      \caption{#3}%
      \label{#4}%
    \end{figure}%
    \par
  }%
\NewDocumentCommand{\veccomp}{ s m }%
  {%
    % Consider renaming this to \vectorsym.
    \IfBooleanTF{#1}
      {%
        \symnormal{#2}%
      }%
      {%
        \symbfit{#2}%
      }%
  }%
\NewDocumentCommand{\tencomp}{ s m }%
  {%
    % Consider renaming this to \tensororsym.
    \IfBooleanTF{#1}%
      {%
        \symsfit{#2}%
      }%
      {%
        \symbfsfit{#2}%
      }%
  }%
\NewDocumentCommand{\valence}{ s m m }%
  {%
    \IfBooleanTF{#1}%
      {%
        (#2,#3)%
      }%
      {%
        \binom{#2}{#3}%
      }%
  }%
\NewDocumentCommand{\contraction}{ s m }%
  {%
    \IfBooleanTF{#1}
      {%
        \mathsf{C}%
      }%
      {%
        \symbb{C}%
      }%
    _{#2}
  }%
\NewDocumentCommand{\slot}{ s d[] }%
  {%
    % d[] must be used because of the way consecutive optional
    %  arguments are handled. See xparse docs for details.
    \IfBooleanTF{#1}
    {%
      \IfValueTF{#2}
      {% Insert a vector, but don't show the slot.
        \smash{\makebox[1.5em]{\ensuremath{#2}}}
      }%
      {% No vector, no slot.
        \smash{\makebox[1.5em]{\ensuremath{}}}
      }%
    }%
    {%
      \IfValueTF{#2}
        {% Insert a vector and show the slot.
          \underline{\smash{\makebox[1.5em]{\ensuremath{#2}}}}
        }%
        {% No vector; just show the slot.
          \underline{\smash{\makebox[1.5em]{\ensuremath{}}}}
        }%
    }%
  }%
\NewDocumentCommand{\df}{ s }%
  {%
    \mathop{}\!%
    \IfBooleanTF{#1}%
      {%
        \symbfsfup{d}%
      }%
      {%
        \symsfup{d}%
      }%
  }%
\directlua{%
 luaotfload.add_colorscheme("colordigits",
   {["8000FF"] = {"one","two","three","four","five","six","seven","eight","nine","zero"}})
}%
\newfontfamily\colordigits{DejaVuSansMono}[RawFeature={color=colordigits}]
\newfontfamily{\gsfontfamily}{DejaVuSansMono}    % new font for listings
\definecolor{gsbggray}     {rgb}{0.90,0.90,0.90} % background gray
\definecolor{gsgray}       {rgb}{0.30,0.30,0.30} % gray
\definecolor{gsgreen}      {rgb}{0.00,0.60,0.00} % green
\definecolor{gsorange}     {rgb}{0.80,0.45,0.12} % orange
\definecolor{gspeach}      {rgb}{1.00,0.90,0.71} % peach
\definecolor{gspearl}      {rgb}{0.94,0.92,0.84} % pearl
\definecolor{gsplum}       {rgb}{0.74,0.46,0.70} % plum
\lstdefinestyle{vpython}%
  {%                                            % style for listings
    backgroundcolor=\color{gsbggray},%          % background color
    basicstyle=\colordigits\footnotesize,%      % default style
    breakatwhitespace=true%                     % break at whitespace
    breaklines=true,%                           % break long lines
    captionpos=b,%                              % position caption
    classoffset=1,%                             % STILL DON'T UNDERSTAND THIS
    commentstyle=\color{gsgray},%               % font for comments
    deletekeywords={print},%                    % delete keywords from the given language
    emph={self,cls,@classmethod,@property},%    % words to emphasize
    emphstyle=\color{gsorange}\itshape,%        % font for emphasis
    escapeinside={(*@}{@*)},%                    % add LaTeX within your code
    frame=tb,%                                  % frame style
    framerule=2.0pt,%                           % frame thickness
    framexleftmargin=5pt,%                      % extra frame left margin
    %identifierstyle=\sffamily,%                % style for identifiers
    keywordstyle=\gsfontfamily\color{gsplum},%  % color for keywords
    language=Python,%                           % select language
    linewidth=\linewidth,%                      % width of listings
    morekeywords={%                             % VPython/Web VPython specific keywords
      __future__,abs,acos,align,ambient,angle,append,append_to_caption,%
      append_to_title,arange,arrow,asin,astuple,atan,atan2,attach_arrow,%
      attach_trail,autoscale,axis,background,billboard,bind,black,blue,border,%
      bounding_box,box,bumpaxis,bumpmap,bumpmaps,camera,canvas,caption,capture,%
      ceil,center,clear,clear_trail,click,clone,CoffeeScript,coils,color,combin,%
      comp,compound,cone,convex,cos,cross,curve,cyan,cylinder,data,degrees,del,%
      delete,depth,descender,diff_angle,digits,division,dot,draw_complete,%
      ellipsoid,emissive,end_face_color,equals,explog,extrusion,faces,factorial,%
      False,floor,follow,font,format,forward,fov,frame,gcurve,gdisplay,gdots,%
      get_library,get_selected,ghbars,global,GlowScript,graph,graphs,green,gvbars,%
      hat,headlength,headwidth,height,helix,hsv_to_rgb,index,interval,keydown,%
      keyup,label,length,lights,line,linecolor,linewidth,logx,logy,lower_left,%
      lower_right,mag,mag2,magenta,make_trail,marker_color,markers,material,%
      max,min,mouse,mousedown,mousemove,mouseup,newball,norm,normal,objects,%
      offset,one,opacity,orange,origin,path,pause,pi,pixel_to_world,pixels,plot,%
      points,pos,pow,pps,print,print_function,print_options,proj,purple,pyramid,%
      quad,radians,radius,random,rate,ray,read_local_file,readonly,red,redraw,%
      retain,rgb_to_hsv,ring,rotate,round,scene,scroll,shaftwidth,shape,shapes,%
      shininess,show_end_face,show_start_face,sign,sin,size,size_units,sleep,%
      smooth,space,sphere,sqrt,start,start_face_color,stop,tan,text,textpos,%
      texture,textures,thickness,title,trail_color,trail_object,trail_radius,%
      trail_type,triangle,trigger,True,twist,unbind,up,upper_left,upper_right,%
      userpan,userspin,userzoom,vec,vector,vertex,vertical_spacing,visible,%
      visual,vpython,VPython,waitfor,WebVPython,white,width,world,xtitle,%
      yellow,yoffset,ytitle%
    },%
    morekeywords={print,None,TypeError},%      % additional keywords
    morestring=[b]{"""},%                      % treat triple quotes as strings
    numbers=left,%                             % where to put line numbers
    numbersep=10pt,%                           % how far line numbers are from code
    numberstyle=\bfseries\tiny,%               % set to 'none' for no line numbers
    showstringspaces=false,%                   % show spaces in strings
    showtabs=false,%                           % show tabs within strings
    stringstyle=\gsfontfamily\color{gsgreen},% % color for strings
    upquote=true,%                             % how to typeset quotes
  }%
\AtBeginEnvironment{webvpythonblock}{\catcode`\#=12}
\AtEndEnvironment{webvpythonblock}{\catcode`\#=6}
\NewTCBListing[auto counter,list inside=gsprogs]{webvpythonblock}{ O{} D(){webvpython.org} m }%
  {%
    breakable,%
    center,%
    code = \newpage,%
    %derivpeach,%
    enhanced,%
    hyperurl interior = https://#2,%
    label = {gs:\thetcbcounter},%
    left = 8mm,%
    list entry = \thetcbcounter~~~~~#3,%
    listing only,%
    listing style = vpython,%
    nameref = {#3},%
    title = \begin{minipage}{1.5cm}%
              \protect\qrcode*{https://#2}%
            \end{minipage}\hspace{5mm}%
            \begin{minipage}{0.7\textwidth}%
              \texttt{Web VPython} Program \thetcbcounter: #3%
            \end{minipage},%
    width = 0.9\textwidth,%
    {#1},
  }%
\AtBeginEnvironment{webvpythonblock*}{\catcode`\#=12}
\AtEndEnvironment{webvpythonblock*}{\catcode`\#=6}
\NewTCBListing[use counter from=webvpythonblock,list inside=gsprogs]
  {webvpythonblock*}{ O{} D(){webvpython.org} m }%
    {%
      breakable,%
      center,%
      code = \newpage,%
      %derivpeach,%
      enhanced,%
      hyperurl interior = https://#2,%
      label = {gs:\thetcbcounter},%
      left = 8mm,%
      list entry = \thetcbcounter~~~~~#3,%
      listing only,%
      listing style = vpython,%
      nameref = {#3},%
      title =   \texttt{Web VPython} Program \thetcbcounter: #3,%
      width = 0.9\textwidth,%
      {#1},
    }%
\NewDocumentCommand{\listofwebvpythonprograms}{}%
  {%
    \tcblistof[\section*]{gsprogs}{List of \texttt{Web VPython} Programs}%
  }%
\newcommand*{\vpythonfile}{\catcode`\#=12 \vpythonfile@auxA}
\NewDocumentCommand{\vpythonfile@auxA}{ O{} D(){vpython.org} m m }%
  {%
    \vpythonfile@auxB[#1](#2){#3}{#4}%
    \catcode`\#=6
  }%
\NewTCBInputListing[auto counter,list inside=vpprogs]
  {\vpythonfile@auxB}{ O{} D(){vpython.org} m m }%
    {%
      breakable,%
      center,%
      code = \newpage,%
      %derivgray,%
      enhanced,%
      hyperurl interior = https://#2,%
      label = {vp:\thetcbcounter},%
      left = 8mm,%
      list entry = \thetcbcounter~~~~~#4,%
      listing file = {#3},%
      listing only,%
      listing style = vpython,%
      nameref = {#4},%
      title = \texttt{VPython} Program \thetcbcounter: #4,%
      width = 0.9\textwidth,%
      {#1},%
    }%
\NewDocumentCommand{\listofvpythonprograms}{}%
  {%
    \tcblistof[\section*]{vpprogs}{List of \texttt{VPython} Programs}%
  }%
\DeclareTotalTCBox{\webvpythoninline}{ m }%
  {%
    bottom = 0pt,%
    bottomrule = 0.0mm,%
    boxsep = 1.0mm,%
    colback = gsbggray,%
    colframe = gsbggray,%
    left = 0pt,%
    leftrule = 0.0mm,%
    nobeforeafter,%
    right = 0pt,%
    rightrule = 0.0mm,%
    sharp corners,%
    tcbox raise base,%
    top = 0pt,%
    toprule = 0.0mm,%
  }%
  {\lstinline[style = vpython]{#1}}%
\NewDocumentCommand{\vpythoninline}{}{\webvpythoninline}%
\endinput
%%
%% End of file `mandistudent.sty'.
