% \iffalse meta-comment
% !TEX program = lualatexmk
%
% 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
% ---------------------------------------------------------------------------
%
% \fi
%
% \iffalse
%
%<*internal>
\iffalse
%</internal>
%
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%
%<*internal>
\usedir{tex/latex/mandi}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
%
%<*driver>
\ProvidesFile{mandiexp.dtx}
\DisableCrossrefs         % index descriptions only
\PageIndex                % index refers to page numbers
\CodelineNumbered         % number source lines
\RecordChanges            % record changes
\begin{document}          % main document
  \DocInput{\jobname.dtx} %
  \PrintIndex             %
\end{document}            % end main document
%</driver>
% \fi
%
% \CheckSum{225}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% ^^A DO NOT TRY TO COMPILE THIS DTX FILE BY ITSELF. IT WILL FAIL.
%
% \section{The \mandiexp\ Package}\setplace{sec:mandiexppkg}
%
% \mandi\ comes with an accessory package \mandiexp\  
% which includes commands specific to 
% \emph{Matter \& Interactions}.\footnote{See 
% \href{https://www.wiley.com/en-us/Matter+and+Interactions%2C+4th+Edition-p-9781118875865}
% {\emph{Matter \& Interactions}} and
% \url{https://matterandinteractions.org/} for details.} 
% The commands are primarily for typesetting 
% mathematical expressions used in that text. Note that \mandiexp\
% requires, and loads, \mandi\ but \mandi\ doesn't require, 
% and doesn't load, \mandiexp.
%
% Load \mandiexp\ as you would any package in your preamble. 
% There are no package options.
%
%\iffalse
%<*example>
%\fi
\begin{dispListing*}{sidebyside = false,listing only}
  \usepackage{mandiexp}
\end{dispListing*}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}{mandiexpversion}{}
  Typesets the current version and build date.
\end{docCommand}
\begin{dispExample*}{sidebyside = false}
  The version is \mandiexpversion\ and is a stable build.
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
% \subsection{The Fundamenal Principles}
%
%\iffalse
%<*example>
%\fi
\begin{docCommands}[%
    doc parameter = {},%
  ]%
  {%
    {%
      doc name = lhsmomentumprinciple,%
      doc description = {LHS of delta form, bold vectors},%
    },%
    {%
      doc name = rhsmomentumprinciple,%
      doc description = {RHS of delta form, bold vectors},%
    },%
    {%
      doc name = lhsmomentumprincipleupdate,%
      doc description = {LHS of update form, bold vectors},%
    },%
    {%
      doc name = rhsmomentumprincipleupdate,%
      doc description = {RHS of update form, bold vectors},%
    },%
    {%
      doc name = momentumprinciple,%
      doc description = {delta form, bold vectors},%
    },%
    {%
      doc name = momentumprincipleupdate,%
      doc description = {update form, bold vectors},%
    },%
    {%
      doc name = lhsmomentumprinciple*,%
      doc description = {LHS of delta form, arrow vectors},%
    },%
    {%
      doc name = rhsmomentumprinciple*,%
      doc description = {RHS of delta form, arrow vectors},%
    },%
    {%
      doc name = lhsmomentumprincipleupdate*,%
      doc description = {LHS of update form, arrow vectors},%
    },%
    {%
      doc name = rhsmomentumprincipleupdate*,%
      doc description = {RHS of update form, arrow vectors},%
    },%
    {%
      doc name = momentumprinciple*,%
      doc description = {delta form, arrow vectors},%
    },%
    {%
      doc name = momentumprincipleupdate*,%
      doc description = {update form, arrow vectors},%
    },%
  }%
  Variants of command for typesetting the momentum principle.
  Use starred variants to get arrow notation for vectors.
\end{docCommands}
\begin{dispExample}
  \( \lhsmomentumprinciple \)        \\
  \( \rhsmomentumprinciple \)        \\
  \( \lhsmomentumprincipleupdate \)  \\
  \( \rhsmomentumprincipleupdate \)  \\
  \( \momentumprinciple \)           \\
  \( \momentumprincipleupdate \)     \\
  \( \lhsmomentumprinciple* \)       \\
  \( \rhsmomentumprinciple* \)       \\
  \( \lhsmomentumprincipleupdate* \) \\
  \( \rhsmomentumprincipleupdate* \) \\
  \( \momentumprinciple* \)          \\
  \( \momentumprincipleupdate* \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommands}[%
    doc parameter = {},%
  ]%
  {%
    {%
      doc name = lhsenergyprinciple,%
      doc description = {LHS of delta form},%
    },%
    {%
      doc name = rhsenergyprinciple,%
      doc parameter = \oarg{\(+\)process...},%
      doc description = {RHS of delta form},%
    },%
    {%
      doc name = lhsenergyprincipleupdate,%
      doc description = {LHS of update form},%
    },%
    {%
      doc name = rhsenergyprincipleupdate,%
      doc parameter = \oarg{\(+\)process...},%
      doc description = {RHS of update form},%
    },%
    {%
      doc name = energyprinciple,%
      doc parameter = \oarg{\(+\)process...},%
      doc description = {delta form},%
    },%
    {%
      doc name = energyprincipleupdate,%
      doc parameter = \oarg{\(+\)process...},%
      doc description = {update form},%
    },%
  }%
  Variants of command for typesetting the energy principle.
\end{docCommands}
\begin{dispExample}
  \( \lhsenergyprinciple \)           \\
  \( \rhsenergyprinciple \)           \\
  \( \rhsenergyprinciple[+Q] \)       \\
  \( \energyprinciple \)              \\
  \( \energyprinciple[+Q] \)          \\
  \( \lhsenergyprincipleupdate \)     \\
  \( \rhsenergyprincipleupdate \)     \\
  \( \rhsenergyprincipleupdate[+Q] \) \\
  \( \energyprincipleupdate \)        \\
  \( \energyprincipleupdate[+Q] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommands}[%
    doc parameter = {},%
  ]%
  {%
    {%
      doc name = lhsangularmomentumprinciple,%
      doc description = {LHS of delta form, bold vectors},%
    },%
    {%
      doc name = rhsangularmomentumprinciple,%
      doc description = {RHS of delta form, bold vectors},%
    },%
    {%
      doc name = lhsangularmomentumprincipleupdate,%
      doc description = {LHS of update form, bold vectors},%
    },%
    {%
      doc name = rhsangularmomentumprincipleupdate,%
      doc description = {RHS of update form, bold vectors},%
    },%
    {%
      doc name = angularmomentumprinciple,%
      doc description = {delta form, bold vectors},%
    },%
    {%
      doc name = angularmomentumprincipleupdate,%
      doc description = {update form, bold vectors},%
    },%
    {%
      doc name = lhsangularmomentumprinciple*,%
      doc description = {LHS of delta form, arrow vectors},%
    },%
    {%
      doc name = rhsangularmomentumprinciple*,%
      doc description = {RHS of delta form, arrow vectors},%
    },%
    {%
      doc name = lhsangularmomentumprincipleupdate*,%
      doc description = {LHS of update form, arrow vectors},%
    },%
    {%
      doc name = rhsangularmomentumprincipleupdate*,%
      doc description = {RHS of update form, arrow vectors},%
    },%
    {%
      doc name = angularmomentumprinciple*,%
      doc description = {delta form, arrow vectors},%
    },%
    {%
      doc name = angularmomentumprincipleupdate*,%
      doc description = {update form, arrow vectors},%
    },%
  }%
  Variants of command for typesetting the angular momentum principle.
  Use starred variants to get arrow notation for vectors.
\end{docCommands}
\begin{dispExample}
  \( \lhsangularmomentumprinciple \)        \\
  \( \rhsangularmomentumprinciple \)        \\
  \( \lhsangularmomentumprincipleupdate \)  \\
  \( \rhsangularmomentumprincipleupdate \)  \\
  \( \angularmomentumprinciple \)           \\
  \( \angularmomentumprincipleupdate \)     \\
  \( \lhsangularmomentumprinciple* \)       \\
  \( \rhsangularmomentumprinciple* \)       \\
  \( \lhsangularmomentumprincipleupdate* \) \\
  \( \rhsangularmomentumprincipleupdate* \) \\
  \( \angularmomentumprinciple* \)          \\
  \( \angularmomentumprincipleupdate* \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
% \subsection{Other Expressions}
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{energyof}{\marg{label}\oarg{label}}
    Generic symbol for the energy of some entity.
\end{docCommand}
\begin{dispExample*}{lefthand ratio = 0.6}
  \( \energyof{\symup{electron}} \) \\
  \( \energyof{\symup{electron}}[\symup{final}] \)
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{systemenergy}{\oarg{label}}
    Symbol for system energy.
\end{docCommand}
\begin{dispExample}
  \( \systemenergy \) \\
  \( \systemenergy[\symup{final}] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{particleenergy}{\oarg{label}}
    Symbol for particle energy.
\end{docCommand}
\begin{dispExample}
  \( \particleenergy \) \\
  \( \particleenergy[\symup{final}] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{restenergy}{\oarg{label}}
    Symbol for rest energy.
\end{docCommand}
\begin{dispExample}
  \( \restenergy \) \\
  \( \restenergy[\symup{final}] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{internalenergy}{\oarg{label}}
    Symbol for internal energy.
\end{docCommand}
\begin{dispExample}
  \( \internalenergy \) \\
  \( \internalenergy[\symup{final}] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{chemicalenergy}{\oarg{label}}
    Symbol for chemical energy.
\end{docCommand}
\begin{dispExample}
  \( \chemicalenergy \) \\
  \( \chemicalenergy[\symup{final}] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{thermalenergy}{\oarg{label}}
    Symbol for thermal energy.
\end{docCommand}
\begin{dispExample}
  \( \thermalenergy \) \\
  \( \thermalenergy[\symup{final}] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{photonenergy}{\oarg{label}}
    Symbol for photon energy.
\end{docCommand}
\begin{dispExample}
  \( \photonenergy \) \\
  \( \photonenergy[\symup{final}] \)
\end{dispExample}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommands}[%
  doc new = 2021-02-13,%
  doc parameter = \oarg{label},%
  ]%
  {%
    {%
      doc name = translationalkineticenergy,%
    },%
    {%
      doc name = translationalkineticenergy*,%
    },%
  }%
  Symbol for translational kinetic energy.
  The starred variant gives \(E\) notation.
\end{docCommands}
\begin{dispExample*}{lefthand ratio = 0.6}
  \( \translationalkineticenergy \)                  \\
  \( \translationalkineticenergy[\symup{initial}] \) \\
  \( \translationalkineticenergy* \)                 \\
  \( \translationalkineticenergy*[\symup{initial}] \)
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommands}[%
  doc new = 2021-02-13,%
  doc parameter = \oarg{label},%
  ]%
  {%
    {%
      doc name = rotationalkineticenergy,%
    },%
    {%
      doc name = rotationalkineticenergy*,%
    },%
  }%
  Symbol for rotational kinetic energy.
  The starred variant gives \(E\) notation.
\end{docCommands}
\begin{dispExample*}{lefthand ratio = 0.6}
  \( \rotationalkineticenergy \)                  \\
  \( \rotationalkineticenergy[\symup{initial}] \) \\
  \( \rotationalkineticenergy* \)                 \\
  \( \rotationalkineticenergy*[\symup{initial}] \)
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommands}[%
  doc new = 2021-02-13,%
  doc parameter = \oarg{label},%
  ]%
  {%
    {%
      doc name = vibrationalkineticenergy,%
    },%
    {%
      doc name = vibrationalkineticenergy*,%
    },%
  }%
  Symbol for vibrational kinetic energy.
  The starred variant gives \(E\) notation.
\end{docCommands}
\begin{dispExample*}{lefthand ratio = 0.6}
  \( \vibrationalkineticenergy \)                  \\
  \( \vibrationalkineticenergy[\symup{initial}] \) \\
  \( \vibrationalkineticenergy* \)                 \\
  \( \vibrationalkineticenergy*[\symup{initial}] \)
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{gravitationalpotentialenergy}
  {\oarg{label}}
    Symbol for gravitational potential energy.
\end{docCommand}
\begin{dispExample*}{lefthand ratio = 0.6}
  \( \gravitationalpotentialenergy \) \\
  \( \gravitationalpotentialenergy[\symup{final}] \)
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{electricpotentialenergy}{\oarg{label}}
    Symbol for electric potential energy.
\end{docCommand}
\begin{dispExample*}{lefthand ratio = 0.6}
  \( \electricpotentialenergy \) \\
  \( \electricpotentialenergy[\symup{final}] \)
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
%\iffalse
%<*example>
%\fi
\begin{docCommand}[doc new = 2021-02-13]{springpotentialenergy}{\oarg{label}}
    Symbol for spring potential energy.
\end{docCommand}
\begin{dispExample*}{lefthand ratio = 0.6}
  \( \springpotentialenergy \) \\
  \( \springpotentialenergy[\symup{final}] \)
\end{dispExample*}
%\iffalse
%</example>
%\fi
%
% \StopEventually{}
%
% \newgeometry{left=0.50in,right=0.50in,top=1.00in,bottom=1.00in}
% \subsection{\mandiexp\ Source Code}
%
% \iffalse
%<*package>
% \fi
% Definine the package version and date for global use, exploiting the fact
% that in a \pkg{.sty} file there is now no need for |\makeatletter| and
% |\makeatother|. This simplifies defining internal commands, with |@| 
% in the name, that are not for the user to know about.
%
% \changes{v3.1.0}{2022-01-27}
%   {\linktoplace{sec:mandiexppkg}{mandiexp} Version number works}
% \changes{v3.1.0}{2022-01-27}
%   {\linktoplace{sec:mandiexppkg}{mandiexp} Code formatted for better readability}
%    \begin{macrocode}
\def\mandiexp@version{3.1.0}
\def\mandiexp@date{2022-01-27}
\NeedsTeXFormat{LaTeX2e}[2020-02-02]
\DeclareRelease{v3.1.0}{2022-01-27}{mandiexp.sty}
\DeclareCurrentRelease{v\mandiexp@version}{\mandiexp@date}
\ProvidesPackage{mandiexp}
  [\mandiexp@date\space v\mandiexp@version\space Macros for Matter & Interactions]
%    \end{macrocode}
%
% Define a convenient package version command.
%
%    \begin{macrocode}
\newcommand*{\mandiexpversion}{v\mandiexp@version\space dated \mandiexp@date}
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{mandi}
%    \end{macrocode}
%
% \changes{v3.1.0}{2022-01-27}
%   {\linktoplace{sec:mandiexppkg}{mandiexp} \pkg{xparse} is loaded for older formats}
%    \begin{macrocode}
\IfFormatAtLeastTF {2020-10-01} % load xparse if necessary
  {}%
  {\RequirePackage{xparse}}%
%    \end{macrocode}
%
%    \begin{macrocode}
\typeout{}%
\typeout{mandiexp: You are using mandiexp \mandiexpversion.}
\typeout{mandiexp: This package requires LuaLaTeX.}%
\typeout{}%
%
% Commands specific to Matter & Interactions
% The momentum principle
\NewDocumentCommand{\lhsmomentumprinciple}{ s }%
  {%
    \Delta
    \IfBooleanTF{#1}%
      {%
        \vec*{p}
      }%
      {%
        \vec{p}%
      }%
    \sb{\symup{sys}}%
  }%
\NewDocumentCommand{\rhsmomentumprinciple}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \vec*{F}%
      }%
      {%
        \vec{F}%
      }%
    \sb{\symup{sys,net}}\,\Delta t%
  }%
\NewDocumentCommand{\lhsmomentumprincipleupdate}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \vec*{p}%
      }%
      {%
        \vec{p}%
      }%
    \sb{\symup{sys,final}}%
  }%
\NewDocumentCommand{\rhsmomentumprincipleupdate}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \vec*{p}%
      }%
      {%
        \vec{p}%
      }%
    \sb{\symup{sys,initial}}+%
    \IfBooleanTF{#1}%
      {%
        \vec*{F}%
      }%
      {%
        \vec{F}%
      }%
    \sb{\symup{sys,net}}\,\Delta t%
  }%
\NewDocumentCommand{\momentumprinciple}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \lhsmomentumprinciple* = \rhsmomentumprinciple*%
      }%
      {%
        \lhsmomentumprinciple = \rhsmomentumprinciple%
      }%
  }%
\NewDocumentCommand{\momentumprincipleupdate}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \lhsmomentumprincipleupdate* = \rhsmomentumprincipleupdate*%
      }%
      {%
        \lhsmomentumprincipleupdate = \rhsmomentumprincipleupdate%
      }%
  }%
% The momentum principle
\NewDocumentCommand{\lhsenergyprinciple}{}%
  {%
    \Delta E_{\symup{sys}}%
  }%
\NewDocumentCommand{\rhsenergyprinciple}{ O{} }%
  {%
    W_{\symup{ext}}#1%
  }%
\NewDocumentCommand{\lhsenergyprincipleupdate}{}%
  {%
    E_{\symup{sys,final}}%
  }%
\NewDocumentCommand{\rhsenergyprincipleupdate}{ O{} }%
  {%
    E_{\symup{sys,initial}}+%
    W_{\symup{ext}}#1%
  }%
\NewDocumentCommand{\energyprinciple}{ O{} }%
  {%
    \lhsenergyprinciple = \rhsenergyprinciple[#1]%
  }%
\NewDocumentCommand{\energyprincipleupdate}{ O{} }%
  {%
    \lhsenergyprincipleupdate = \rhsenergyprincipleupdate[#1]%
  }%
% The angular momentum principle
\NewDocumentCommand{\lhsangularmomentumprinciple}{ s }%
  {%
    \Delta%
    \IfBooleanTF{#1}%
      {%
        \vec*{L}%
      }%
      {%
        \vec{L}%
      }%
    \sb{A\symup{,sys,net}}%
  }%
\NewDocumentCommand{\rhsangularmomentumprinciple}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \vec*{\tau}%
      }%
      {%
        \vec{\tau}%
      }%
    \sb{A\symup{,sys,net}}\,\Delta t%
  }%
\NewDocumentCommand{\lhsangularmomentumprincipleupdate}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \vec*{L}%
      }%
      {%
        \vec{L}%
      }%
    \sb{A,\symup{sys,final}}%
  }%
\NewDocumentCommand{\rhsangularmomentumprincipleupdate}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \vec*{L}%
      }%
      {%
        \vec{L}%
      }%
    \sb{A\symup{,sys,initial}}+%
    \IfBooleanTF{#1}%
      {%
        \vec*{\tau}%
      }%
      {%
        \vec{\tau}%
      }%
    \sb{A\symup{,sys,net}}\,\Delta t%
  }%
\NewDocumentCommand{\angularmomentumprinciple}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \lhsangularmomentumprinciple* = \rhsangularmomentumprinciple*%
      }%
      {%
        \lhsangularmomentumprinciple = \rhsangularmomentumprinciple%
      }%
  }%
\NewDocumentCommand{\angularmomentumprincipleupdate}{ s }%
  {%
    \IfBooleanTF{#1}%
      {%
        \lhsangularmomentumprincipleupdate* = \rhsangularmomentumprincipleupdate*%
      }%
      {%
        \lhsangularmomentumprincipleupdate = \rhsangularmomentumprincipleupdate%
      }%
  }%
\NewDocumentCommand{\energyof}{ m o }%
  {%
    E_{#1%
        \IfValueT{#2}%
          {,#2}%
      }%
  }%
\NewDocumentCommand{\systemenergy}{ o }%
  {%
    E_{\symup{sys}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\particleenergy}{ o }%
  {%
    E_{\symup{particle}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\restenergy}{ o }%
  {%
    E_{\symup{rest}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\internalenergy}{ o }%
  {%
    E_{\symup{internal}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\chemicalenergy}{ o }%
  {%
    E_{\symup{chem}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\thermalenergy}{ o }%
  {%
    E_{\symup{therm}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\photonenergy}{ o }%
  {%
    E_{\symup{photon}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\translationalkineticenergy}{ s d[] }%
  {%
    % d[] must be used because of the way consecutive optional
    %  arguments are handled. See xparse docs for details.
    %  See https://tex.stackexchange.com/a/569011/218142
    \IfBooleanTF{#1}%
      {%
        E_\bgroup \symup{K}%
      }%
      {%
        K_\bgroup\symup{trans}%
      }%
            \IfValueT{#2}{,#2}%
          \egroup%
  }%
\NewDocumentCommand{\rotationalkineticenergy}{ s d[] }%
  {%
    % d[] must be used because of the way consecutive optional
    %  arguments are handled. See xparse docs for details.
    %  See https://tex.stackexchange.com/a/569011/218142
    \IfBooleanTF{#1}%
      {%
        E_\bgroup%
      }%
      {%
        K_\bgroup%
      }%
            \symup{rot}\IfValueT{#2}{,#2}%
          \egroup%
  }%
\NewDocumentCommand{\vibrationalkineticenergy}{ s d[] }%
  {%
    % d[] must be used because of the way consecutive optional
    %  arguments are handled. See xparse docs for details.
    %  See https://tex.stackexchange.com/a/569011/218142
    \IfBooleanTF{#1}%
      {%
        E_\bgroup%
      }%
      {%
        K_\bgroup%
      }%
            \symup{vib}\IfValueT{#2}{,#2}%
          \egroup%
  }%
\NewDocumentCommand{\gravitationalpotentialenergy}{ o }%
  {%
    U_{\symup{g}%
        \IfValueT{#1}%
          {,#1}%
    }%
  }%
\NewDocumentCommand{\electricpotentialenergy}{ o }%
  {%
    U_{\symup{e}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
\NewDocumentCommand{\springpotentialenergy}{ o }%
  {%
    U_{\symup{s}%
        \IfValueT{#1}%
          {,#1}%
      }%
  }%
%    \end{macrocode}
%
% \restoregeometry
%
% \iffalse
%</package>
% \fi
%
% \Finale
