texlive[63188] Master: thermodynamics (30apr22)

commits+karl at tug.org commits+karl at tug.org
Sat Apr 30 22:02:45 CEST 2022


Revision: 63188
          http://tug.org/svn/texlive?view=revision&revision=63188
Author:   karl
Date:     2022-04-30 22:02:45 +0200 (Sat, 30 Apr 2022)
Log Message:
-----------
thermodynamics (30apr22)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/thermodynamics/
    trunk/Master/texmf-dist/doc/latex/thermodynamics/README.md
    trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics-examples.tex
    trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics.pdf
    trunk/Master/texmf-dist/source/latex/thermodynamics/
    trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.dtx
    trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.ins
    trunk/Master/texmf-dist/tex/latex/thermodynamics/
    trunk/Master/texmf-dist/tex/latex/thermodynamics/thermodynamics.sty
    trunk/Master/tlpkg/tlpsrc/thermodynamics.tlpsrc

Added: trunk/Master/texmf-dist/doc/latex/thermodynamics/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/thermodynamics/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/thermodynamics/README.md	2022-04-30 20:02:45 UTC (rev 63188)
@@ -0,0 +1,33 @@
+thermodynamics - A package for chemical engineers and others
+=============================================================
+
+Thermodynamics texts (textbooks, articles, and so forth) are typically filled
+with underlined and overlined symbols, partial derivatives surrounded by
+delimiters and containing subscripts, sums over multiple components, and a
+myriad of symbols, including superscript and subscript modifiers. This package
+provides a robust, flexible set of macros to define notation for symbols,
+partial derivatives, sums, and products frequently encountered in mixture
+thermodynamics. Changing one's notes from one textbook to another or from one
+notation style to another can be achieved relatively easily by changing package
+options, without any changes to the user's code (other than perhaps adjusting
+line breaks).
+
+Installation
+------------
+
+The package is suppled in `dtx` format with an accompanying `ins` file to
+install the package. Run `latex thermodynamics.ins` to extract the package;
+instructions for building the documentation are included in the `ins` file.
+
+This package requires the `amstext` package.
+
+Typesetting the documentation requires several other packages:
+ - `geometry`
+ - `fontenc`
+ - `textcomp`
+ - `amsmath`
+ - `pxfonts`
+ - `array`
+ - `booktabs`
+ - `footmisc`
+ - `caption`


Property changes on: trunk/Master/texmf-dist/doc/latex/thermodynamics/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics-examples.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics-examples.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics-examples.tex	2022-04-30 20:02:45 UTC (rev 63188)
@@ -0,0 +1,212 @@
+%%
+%% This is file `thermodynamics-examples.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% thermodynamics.dtx  (with options: `example')
+%% 
+%% This is a generated file.
+%% 
+%% Copyright (C) 2017-2018 by Karl D. Hammond
+%% 
+%% Karl D. Hammond,
+%% Department of Chemical Engineering
+%% University of Missouri
+%% Contact: hammondkd at missouri.edu
+%% 
+%% 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.
+\documentclass{article}
+\usepackage[margin=1in]{geometry}
+\usepackage{amsmath,amssymb}
+\usepackage{thermodynamics}
+\title{Examples to Accompany the \textsf{thermodynamics} Package}
+\author{Karl D. Hammond}
+\date{}
+\begin{document}
+\maketitle\noindent
+The combined laws:
+\begin{align*}
+  d\Et &= d\Ut + d\left(\frac12 m v^2\right) - d(m\phi) \\
+  d\Ut &= \dbar\Qt + \dbar\Wt + \Um d\Nt
+        = \dbar\Qt - P d\Vt + \Hm d\Nt
+    \\ &= \Partial*{\Ut}{\St}{\Vt,\allNs} d\St
+        + \Partial*{\Ut}{\Vt}{\St,\allNs} d\Vt
+        + \sumall_i \Partial*{\Ut}{\Nt_i}{\Vt,\St,\allNsbut{i}} d\Nt_i
+    \\ &= T d\St - P d\Vt + \sumall_i \mu_i d\Nt_i
+\end{align*}
+With surfaces present:
+\begin{gather*}
+   d\Ut = T d\St - P d\Vt  + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Ht = T d\St + \Vt dP  + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Ft = -\St dT - P d\Vt + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Gt = -\St dT + \Vt dP + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Lt = -\St dT - P d\Vt + \sigma d\At - \sumall_i \Nt_i d\mu_i \\
+    \Bt = \Ut + P\Vt - T\St - \sigma\At \\
+   d\Bt = -\St dT + \Vt dP - \At d\sigma + \sumall_i \mu_i d\Nt_i \\
+   \mu_i = \Bpm_i = \Gpm_i + \sigma \Apm_i
+\end{gather*}
+Some Maxwell reciprocity relations:
+\begin{gather*}
+  \Partial*{\Vt}{T}{P,\allNs}
+    = \PartialMixSecond*{\Gt}{T}{P}{\allNs}
+    = \PartialMixSecond*{\Gt}{P}{T}{\allNs}
+    = -\Partial{\St}{P}{T,\allNs}
+\\
+    \Partial*{\Gpm_i}{T}{P,\allXs}
+    = \PartialMixSecond*{\Gt}{T}{\Nt_i}{P,\allNsbut{i}}
+    = \PartialMixSecond*{\Gt}{\Nt_i}{T}{P,\allNsbut{i}}
+    = -\Partial*{\St}{\Nt_i}{T,P,\allNsbut{i}}
+    = -\Spm_i
+\end{gather*}
+The heat capacities:
+\begin{gather*}
+  \cV = T \Partial*{\Sm}{T}{\Vm,\allXs} = \Partial*{\Um}{T}{\Vm,\allXs}
+      = -T\PartialSecond{\Fm}{T}{\Vm,\allXs}
+  \\
+  \cP^\IGM = T \Partial*{\Sm^\IGM}{T}{P,\allYs}
+           = \Partial*{\Hm^\IGM}{T}{P,\allYs}
+    \begin{thermobrackets}
+      = -T\PartialSecond{\Gm^\IGM}{T}{P,\allYs}
+    \end{thermobrackets}
+  \\
+  \cVt = T \Partial*{\St}{T}{\Vt,\allNs} = \Partial*{\Ut}{T}{\Vt,\allNs}
+    \begin{thermobraces}
+       = -T\PartialSecond{\Ft}{T}{\Vm,\allNs}
+    \end{thermobraces}
+  \\
+    \begin{thermobar}
+  \cPt = T \Partial*{\St}{T}{P,\allNs} = \Partial*{\Ht}{T}{P,\allNs}
+       = -T\PartialSecond{\Gt}{T}{P,\allNs}
+    \end{thermobar}
+  \\
+  \cVs = T \Partial*{\Ss}{T}{\Vs,\allWs} = \Partial*{\Us}{T}{\Vs,\allWs}
+    \begin{thermoplain}
+       = -T\PartialSecond{\Fs}{T}{\Vs,\allWs}
+    \end{thermoplain}
+  \\
+  \cPs = T \Partialbigg*{\Ss}{T}{P,\allWs} = \Partialbigg*{\Hs}{T}{P,\allWs}
+       = -T\PartialSecondbigg{\Gs}{T}{P,\allWs}
+  \\
+\begin{split}
+  \cPpm_i &= \Partial*{\cPt}{\Nt_i}{T,P,\allNsbut{i}}
+           = T \PartialMixSecond*{\St}{\Nt_i}{T}{P,\allNsbut{i}}
+           = T \PartialMixSecond*{\St}{T}{\Nt_i}{P,\allNsbut{i}}
+       \\ &= T \Partial*{\Spm_i}{T}{P,\allXs}
+           = \Partial*{\Hpm_i}{T}{P,\allXs}
+           = \PartialMixSecond*{\Ht}{T}{\Nt_i}{P,\allNsbut{i}}
+           = \PartialMixSecond*{\Ht}{\Nt_i}{T}{P,\allNsbut{i}}
+       \\ &= -T\PartialSecond*{\Gpm_i}{T}{P,\allXs}
+           = -T\Partial{{}^3 \Gt}{T^2\partial \Nt_i}{P,\allNsbut{i}}
+\end{split}
+\end{gather*}
+Other measurable quantities:
+\begin{align*}
+  \alphaS &= \frac{1}{\Vm} \Partial{\Vm}{T}{\Sm} &
+  \alphaP &= \frac{1}{\Vm} \Partial{\Vm}{T}{P} \\
+  \kappaS &= -\frac{1}{\Vm} \Partial{\Vm}{P}{\Sm} &
+  \kappaT &= -\frac{1}{\Vm} \Partial{\Vm}{P}{T}
+\end{align*}
+The chemical potential, fugacity, and activity:
+\[ \mu_i = \Gpm_i = \Gm_i^\std + RT \ln a_i
+         = \Gm_i^\std + RT\ln\left(\frac{\fmix_i}{\fstd_i}\right) \]
+Equilibrium in a chemical reaction:
+\[ \sumall_i \nu_i \mu_i = 0
+    \Rightarrow
+    \exp\left(\frac{-\Delta\Gm^\std}{RT}\right) = K = \prodall_i a_i^{\nu_i} \]
+Partial molar quantities:
+\begin{align*}
+  \Hpm{i} &= \Partial*{\Ht}{\Nt_i}{T,P,\allNsbut{i}}
+           = \Hm + \Nt \Partial*{\Hm}{\Nt_i}{T,P,\allNsbut{i}}
+       \\ &= \Hm + \Partial*{\Hm}{x_i}{T,P,\allXsbut{i}}
+                 - \sumallbutlast_j x_j \Partial*{\Hm}{x_j}{T,P,\allXsbut{j}}
+           = \Partial*{\Hm}{x_i}{T,P,\allXsbut{i}} + \Hpm_\ncomponents
+\end{align*}
+\[ \Vpm_i = \Partial{\Vt}{\Nt_i}{T,P,\allNsbut{i}} \]
+Fugacity and related properties:
+\begin{gather*}
+  \Gpm_i = \mu_i
+         = \Gm_i^\std(T) + RT\ln a_i
+         = \Gm_i^\std(T) + RT\ln\left(\frac{\fmix_i}{\fstd_i}\right)
+  \\
+  a_i = \frac{\fmix_i}{\fstd_i}
+      = x_i \gamma_i
+                \exp\left(\frac{1}{RT} \int_{\Pstd}^P \Vm_i(T,p) dp\right)
+      \approx x_i \gamma_i
+  \\
+  \begin{split}
+  \fmix_i &= x_i \phimix_i P
+           = x_i \gamma_i \fpure_i = x_i \gamma_i \phipure_i P
+           = x_i \gammarat_i \Henryrat_i
+           = C_i \gammamol_i \Henrymol_i
+           = x_i \gamma_i \fsat_i
+                 \exp\left(\frac{1}{RT} \int_{\Psat_i}^P \Vm_i(T,p) dp\right)
+       \\ &= x_i \gamma_i \Psat_i \phisat_i
+                \exp\left(\frac{1}{RT} \int_{\Psat_i}^P \Vm_i(T,p) dp\right)
+          \approx x_i \gamma_i \Psat_i
+  \end{split}
+\end{gather*}
+Chemical Equilibria:
+\begin{gather*}
+  \Deltarxn\Hm^\std = \sumall_i \nu_i \Deltaf\Hm_i^\std \\
+  \Deltarxn\Gm^\std = \sumall_i \nu_i \Deltaf\Gm_i^\std
+                    = \sumall_i \nu_i \mu_i^\std \\
+  \Deltarxn\cP^\std = \sumall_i \nu_i \cP_i^\std \\
+  \mu_i = \mu_i^\std + RT\ln a_i \\
+  a_i = \begin{cases}
+\displaystyle
+     \frac{y_i \phimix_i P}{\Pstd} \approx \frac{y_i P}{\Pstd}
+        & \text{(gases)} \\
+\rule{0pt}{5ex}%
+\displaystyle
+     x_i \gamma_i \exp\left(\frac{1}{RT} \int_{\Pstd}^P \Vm_i(T,p)\,dp\right)
+     \approx
+     x_i \gamma_i \exp\left(\frac{\Vm_i(P-\Pstd)}{RT}\right)
+     \approx x_i \gamma_i \approx 1
+        & \text{(solids, solvents)} \\
+\displaystyle
+\rule{0pt}{5ex}%
+     \frac{C_i \gammamol_i}{C_i^\std}
+        \exp\left(\frac{1}{RT}
+        \int_{\Pstd}^P \Vpm_i^\infty(T,p,\allXs)\,dp\right)
+     \approx
+     \frac{C_i \gammamol_i}{C_i^\std} \approx \frac{C_i}{C_i^\std}
+        & \text{(solutes)}
+        \end{cases}
+\end{gather*}
+Phase change properties:
+\begin{gather*}
+  \Deltafus\Sm = \Sm^L - \Sm^S \\
+  \Deltasub\Vm = \Vm^V - \Vm^S \\
+  \Deltavap\Gm = \Gm^V - \Gm^L
+\end{gather*}
+Specific properties:
+\newcommand*{\Btilde}[2][]{\widetilde{B}_{#2}^{#1}}
+\[ \Btilde{j} \equiv \Partial{\Bt}{m_j}{T,\Vs,\allMsbut[i]{j}} \]
+and thus
+\[ \Btilde{i}
+    = \frac{\Bpm{i}}{M_i}
+        + \Biggl(\Vs - \frac{\Vpm_i}{M_i}\Biggr)
+          \Partial*{\Bs}{\Vs}{T,\allMs}
+    = \frac{\Bpm{i}}{M_i}
+        + \Biggl(\Vs - \frac{\Vpm_i}{M_i}\Biggr)
+          \Partial{\Bs}{\Vs}{T,m,\allWs} \]
+and
+\[ \Bs = \sumall_i w_i \Btilde{i}. \]
+Excess and Residual (Departure) Properties:
+\begin{align*}
+  \HR &= \Hm - \Hm^\IG &
+  \FR &= \Fm - \Fm^\IGM \\
+  \SE &= \Sm - \Sm^\IS &
+  \VRpm_k &= \Vpm_k - \Vpm_k^\IGM
+\end{align*}
+\end{document}
+\endinput
+%%
+%% End of file `thermodynamics-examples.tex'.


Property changes on: trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics-examples.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics.pdf	2022-04-30 20:02:01 UTC (rev 63187)
+++ trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics.pdf	2022-04-30 20:02:45 UTC (rev 63188)

Property changes on: trunk/Master/texmf-dist/doc/latex/thermodynamics/thermodynamics.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.dtx	2022-04-30 20:02:45 UTC (rev 63188)
@@ -0,0 +1,3526 @@
+% \iffalse meta-comment
+% File: thermodynamics.dtx Copyright (C) 2021 Karl D. Hammond
+%
+% Karl D. Hammond
+% Chemical Engineering Program
+% University of Missouri
+% Contact: hammondkd at missouri.edu
+%
+% 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 K. D. Hammond.
+%
+% This work consists of the files thermodynamics.dtx and thermodynamics.ins
+% and the derived files thermodynamics.sty, thermodynamics.pdf,
+% thermodynamics-examples.tex, and thermodynamics-examples.pdf.
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{thermodynamics.dtx}
+%</driver>
+%
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{thermodynamics}
+%<*package>
+    [2022/04/29 v1.00 thermodynamics package]
+%</package>
+%
+%<*driver>
+\documentclass[11pt,letterpaper]{ltxdoc}
+\usepackage[margin=1in,left=1.85in]{geometry}
+\usepackage[T1]{fontenc}
+\usepackage[full]{textcomp}
+\usepackage{amsmath}
+\usepackage{pxfonts}
+\usepackage{array}
+\usepackage{booktabs}
+\usepackage{footmisc}
+\usepackage[labelfont=bf,labelsep=period]{caption}
+%\EnableCrossrefs
+%\CodelineIndex
+\PageIndex
+\CodelineNumbered
+\RecordChanges
+%\OnlyDescription
+\begin{document}
+  \DocInput{thermodynamics.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{2286}
+%
+% \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           \~}
+%
+% \changes{v1.00}{2022/04/29}{Initial public release}
+%
+% \GetFileInfo{thermodynamics.dtx}
+%
+% \title{The \textsf{thermodynamics} package\thanks{This document
+%   corresponds to \textsf{thermodynamics}~\fileversion, dated \filedate.}}
+% \author{Karl D. Hammond \\ \texttt{hammondkd at missouri.edu}}
+% \date{\filedate}
+% \maketitle
+%
+% \begin{abstract}
+% A package, \textsf{thermodynamics}, is defined that makes typesetting
+% quantities found in thermodynamics texts relatively simple. The commands are
+% flexible and intended to be relatively intuitive. It handles several sets
+% of notation for total, specific, and molar quantities; allows changes between
+% symbols (e.g., $A$ vs.\ $F$ for Helmholtz free energy); and greatly
+% simplifies the typesetting of symbols and partial derivatives commonly
+% encountered in mixture thermodynamics. Changes of one's notes from one
+% textbook to another can be achieved relatively easily by changing package
+% options.
+% \end{abstract}
+%
+% \newcommand*{\thermounderline}[1]{%
+%   \mkern2mu\underline{\mkern-2mu #1\mkern-3mu}\mkern3mu%
+% }
+% \newcommand*{\thermooverline}[1]{%
+%   \mkern2mu\overline{\mkern-2mu #1\mkern-2mu}\mkern2mu%
+% }
+% \newcommand*{\Partial}[3]{\ensuremath{\left(\frac{\partial #1}{\partial #2}\right)_{#3}}}
+% \newcommand*{\Ut}{\mkern1mu\underline{\mkern-1mu U\mkern-4mu}\mkern4mu}
+% \newcommand*{\Upm}[2][]{\mkern2mu\overline{\mkern-2mu U_{#2}^{#1}\mkern-2mu}\mkern2mu}
+% \newcommand*{\Ht}{\mkern1mu\underline{\mkern-1mu H\mkern-4mu}\mkern4mu}
+% \newcommand*{\Hm}{H}
+% \newcommand*{\Hpm}[2][]{\mkern2mu\overline{\mkern-2mu H_{#2}^{#1}\mkern-1mu}\mkern1mu}
+% \newcommand*{\Ft}{\mkern1mu\underline{\mkern-1mu A\mkern-4mu}\mkern4mu}
+% \newcommand*{\Gt}{\mkern1mu\underline{\mkern-1mu G\mkern-4mu}\mkern4mu}
+% \newcommand*{\Gpm}[2][]{\mkern2mu\overline{\mkern-2mu G_{#2}^{#1}\mkern-1mu}\mkern1mu}
+% \newcommand*{\Spm}[2][]{\mkern2mu\overline{\mkern-2mu S_{#2}^{#1}\mkern-1mu}\mkern1mu}
+% \newcommand*{\Vpm}[2][]{\mkern1mu\overline{\mkern-1mu V_{\mkern-2mu #2}^{#1}\mkern-2mu}\mkern2mu}
+% \newcommand*{\St}{\mkern1mu\underline{\mkern-1mu S\mkern-3mu}\mkern3mu}
+% \newcommand*{\Vt}{\mkern3mu\underline{\mkern-3mu V\mkern-4mu}\mkern4mu}
+% \newcommand*{\Lt}{\mkern1mu\underline{\mkern-1mu \Omega\mkern-4mu}\mkern4mu}
+% \newcommand*{\cPpm}[2][]{\mkern2mu\overline{\mkern-2mu C_{P,#2}^{#1}\mkern-1mu}\mkern1mu}
+% 
+% \newcommand*{\Nt}{n}
+% \newcommand*{\allNs}{\vec\Nt}
+% \newcommand*{\allNsbut}[2][j]{\Nt_{#1\neq #2}}
+% \newcommand*{\allXs}{\vec x}
+%
+% \section{Introduction}
+% The purpose of this package is to simplify the typesetting of equations in
+% thermodynamics, specifically chemical engineering thermodynamics, which are
+% often cumbersome to enter. For example, consider the following equation:
+% \begin{equation}
+%   d\Ut = \Partial{\Ut}{\St}{\Vt,\allNs} \mkern-10mu d\St
+%         + \Partial{\Ut}{\Vt}{\St,\allNs} \mkern-10mu d\Vt
+% + \sum_{i=1}^C \Partial{\Ut}{\Nt_i}{\St,\Vt,\allNsbut{i}}
+% \mkern-10mu d\Nt_i.
+%   \label{eq:chain-rule-U}
+% \end{equation}
+% This equation is pretty basic, and equations like it occur all the time in
+% thermodynamics. Without this package, you might typeset it like this:
+% \begin{verbatim}
+%  d\underline{U} =
+%    \left(\frac{\partial\underline{U}}
+%               {\partial\underline{S}}\right)_{\underline{V},\vec{n}}
+%    d\underline{S}
+%  + \left(\frac{\partial\underline{U}}
+%               {\partial\underline{V}}\right)_{\underline{S},\vec{n}}
+%    d\underline{V}
+%  + \sum_{i=1}^C \left(\frac{\partial\underline{U}}
+%       {\partial n_i}\right)_{\underline{S},\underline{V},n_{j\neq i}}
+%    dn_i.
+%\end{verbatim}
+% This is a lot of code, and even then the output is slightly clunky:
+% \[ d\underline{U} =
+%     \left(\frac{\partial\underline{U}}
+%                {\partial\underline{S}}\right)_{\underline{V},\vec{n}}
+%     d\underline{S}
+%   + \left(\frac{\partial\underline{U}}
+%                {\partial\underline{V}}\right)_{\underline{S},\vec{n}}
+%     d\underline{V}
+%   + \sum_{i=1}^C \left(\frac{\partial\underline{U}}
+%                {\partial n_i}\right)_{\underline{S},\underline{V},n_{j\neq i}}
+%     dn_i.
+% \]
+% It is also frustratingly difficult to change one's notes or handouts from one
+% textbook that uses, say, $n_1$ to denotes moles of component 1 to another
+% textbook that uses $N_1$ for the same quantity, or perhaps denotes the
+% total internal energy as $U$ or $U^t$ rather than $\Ut$.
+% For example, if you wanted it to be
+% \[
+%   dU = \Partial{U}{S}{V,N_1,\dotsc,N_n} \mkern-15mu dS
+%      + \Partial{U}{V}{S,N_1,\dotsc,N_n} \mkern-15mu dV
+% + \sum_{i=1}^n \Partial{U}{N_i}{S,V,N_1,\dotsc,[N_i],\dotsc,N_n}
+% \mkern-20mu dN_i
+% \]
+% without changing any of your code---to update it across all handouts, exams,
+% and homework sets after changing textbooks, say---you would be out of luck
+% (or in for a lot of work).
+%
+% With this package, you could reduce the code to typeset this equation to
+% \begin{verbatim}
+%  \begin{equation}
+%     d\Ut = \Partial*{\Ut}{\St}{\Vt,\allNs} d\St
+%       + \Partial*{\Ut}{\Vt}{\St,\allNs} d\Vt
+%       + \sumall_i \Partial*{\Ut}{\Nt_i}{\St,\Vt,\allNsbut{i}} d\Nt_i
+%  \end{equation}
+%\end{verbatim}
+% and it will render similarly to Equation~\eqref{eq:chain-rule-U}, including
+% the shortened underscores and negative kerning.
+% If you later decide to change the notation such that extensive properties are
+% not underlined, you can do that without changing any of your code (just
+% change a package option). Similarly, if you want $\vec{n}$ replaced by
+% $n_1,\dots,n_C$, you can do that with a package option, too.
+%
+% The package handles second derivatives, too. For example,
+% \begin{verbatim}
+%  \Partial*{\Hm}{T}{P} = T\Partial*{\Sm}{T}{P}
+%                       = -T\PartialSecond*{\Gm}{T}{P} = \cP
+%\end{verbatim}
+% renders (using the default options)
+% \[ \left(\frac{\partial H}{\partial T}\right)_P \mkern-8mu
+%     = T\left(\frac{\partial S}{\partial T}\right)_P \mkern-8mu
+%     = -T\left(\frac{\partial^2 G}{\partial T^2}\right)_P \mkern-8mu
+%     = C_P \]
+% Similarly, macros are defined for mixed second partial derivatives that allow
+% things like
+% \begin{verbatim}
+%  \Partial*{\Gpm_i}{P}{T,\allNs}
+%    = \PartialMixSecond*{\Gt}{P}{\Nt_i}{T,\allNsbut{i}}
+%    = \PartialMixSecond*{\Gt}{\Nt_i}{P}{T,\allNsbut{i}}
+%    = \Partial*{Vt}{\Nt_i}{T,P,\allNsbut{i}} = \Vpm_i
+%\end{verbatim}
+% which renders
+% \[ \left(\frac{\partial \Gpm{i}}{\partial P}\right)_{T,\allNs}
+%   \mkern-15mu%
+%    = \left(\frac{\partial^2 \Gt}{\partial P\partial n_i}\right)_{T,\allNsbut{i}}
+%   \mkern-15mu%
+%    = \left(\frac{\partial^2 \Gt}{\partial n_i\partial P}\right)_{T,\allNsbut{i}}
+%   \mkern-15mu%
+%    = \left(\frac{\partial \Vt}{\partial n_i}\right)_{T,P,\allNsbut{i}}
+%   \mkern-15mu%
+%    = \Vpm{i}
+% \]
+% using the defaults.
+%
+% ^^A-------------------------------------------------------------------------
+%
+% \section{Using the Package} \label{sec:using}
+% There are three categories of macros defined in this package: macros
+% that produce symbols (or groups of them), macros that typeset derivatives,
+% and macros that are used internally that the user need not know about.
+% There are also several environments that allow the user to switch locally
+% between different delimiters on partial derivatives.
+%
+% \subsection{Predefined Symbols}
+% The macros used to produce symbols fall into five categories: extensive
+% properties, molar properties, specific properties (i.e., per unit mass),
+% partial molar properties, and shortcut macros (e.g., macros for the heat
+% capacities, saturation pressure, and so forth). The macros corresponding to
+% extensive, molar, and specific properties are shown in
+% Table~\ref{table:symbols}. Examples using the enthalpy are
+% \DescribeMacro{\Ht}
+% \DescribeMacro{\Hm}
+% \DescribeMacro{\Hs}
+% \DescribeMacro{\Hpm}
+% \begin{verbatim}
+%   \[ \Ht \quad \Hm \quad \Hs \quad \Hpm_i. \]
+%\end{verbatim}
+% Using the default package options, the above renders as
+%   \[ \Ht \quad \Hm \quad \hat H \quad \Hpm{i}. \]
+% In addition, the properties in
+% Table~\ref{table:conveniences} are defined for convenience.
+%
+% \DescribeMacro{\Ut}
+% \DescribeMacro{\Um}
+% How these symbols are rendered can be customized by package options. As long
+% as the user consistently uses \cs{Ut} to render the total internal energy,
+% \cs{Um} to render the molar internal energy, and so forth, switching notation
+% from, say, $\thermounderline{U}$ to $U^t$ for extensive properties is trivial.
+%
+% ^^A \DescribeMacro{\cP}
+% ^^A \DescribeMacro{\cV}
+% \DescribeMacro{\cPt}
+% \DescribeMacro{\cVt}
+% \DescribeMacro{\cPs}
+% \DescribeMacro{\cVs}
+% \DescribeMacro{\cPpm}
+% \DescribeMacro{\cVpm}
+% The heat capacities (see Table~\ref{table:conveniences}) are generally
+% assumed to be molar (e.g., \cs{cP} is interpreted to be the molar heat
+% capacity). To get the specific heat capacities, the macros \cs{cPs} and
+% \cs{cVs} are provided, which by default render as $\hat C_P$ and $\hat C_V$,
+% respectively. There are also extensive versions, so \cs{cPt} and \cs{cVt}
+% will render as $\thermounderline{C}_P$ and $\thermounderline{C}_V,$
+% respectively.  Note that \cs{cP} and friends require you to surround
+% \cs{text} with brackets if the portion with \cs{text} in it is not the last
+% argument.  For example, \verb"\cP_i^\text{A}" will work as expected, but
+% \verb"\cP^\text{A}_i" will not: you need to use \verb"\cP^{\text{A}}_i".
+% Using \verb"\cP^\IG_i" will work as expected.
+%
+% You can also get partial molar heat capacities via \cs{cPpm} and \cs{cVpm},
+% though the latter's mathematical definition is a bit hard to wrap one's head
+% around:
+% \begin{verbatim}
+%   \[ \cVpm_i = \Partial{\cVt}{\Nt_i}{T,P,\allNsbut{i}}
+%              = \frac{\partial}{\partial\Nt_i}
+%                \left[ -T\PartialSecond{\Ft}{T}{\Vt,\allNs}
+%                \right]_{T,P,\allNsbut{i}} \]
+%\end{verbatim}
+% yields
+% \[ \thermooverline{C_{V,i}}
+%   = \left(\frac{\partial\thermounderline{C}_V}
+%                {\partial\Nt_i}\right)_{T,P,\allNsbut{i}}
+%               = \frac{\partial}{\partial\Nt_i}
+%         \left[ -T\left(\frac{\partial^2\Ft}{\partial T^2}\right)_{\Vt,\allNs}
+%         \right]_{T,P,\allNsbut{i}} \]
+%
+% \begin{table}
+%   \caption{Commands defined in this package to represent extensive
+%       thermodynamic quantities and their molar and specific analogs.
+%       These macros should be used even if the symbol the user
+%       wishes to use does not match the command used (e.g., \cs{Ft}
+%       for total Helmholtz free energy even if it ends up being set as
+%       $\thermounderline{A}$)\@.
+%   }
+%   \label{table:symbols}
+%   \SpecialUsageIndex{\Qt}\relax
+%   \SpecialUsageIndex{\Qm}\relax
+%   \SpecialUsageIndex{\Qs}\relax
+%   \SpecialUsageIndex{\Wt}\relax
+%   \SpecialUsageIndex{\Wm}\relax
+%   \SpecialUsageIndex{\Ws}\relax
+%   \SpecialUsageIndex{\Et}\relax
+%   \SpecialUsageIndex{\Em}\relax
+%   \SpecialUsageIndex{\Es}\relax
+%   \SpecialUsageIndex{\Epm}\relax
+%   \SpecialUsageIndex{\Ut}\relax
+%   \SpecialUsageIndex{\Um}\relax
+%   \SpecialUsageIndex{\Us}\relax
+%   \SpecialUsageIndex{\Upm}\relax
+%   \SpecialUsageIndex{\Ht}\relax
+%   \SpecialUsageIndex{\Hm}\relax
+%   \SpecialUsageIndex{\Hs}\relax
+%   \SpecialUsageIndex{\Hpm}\relax
+%   \SpecialUsageIndex{\St}\relax
+%   \SpecialUsageIndex{\Sm}\relax
+%   \SpecialUsageIndex{\Ss}\relax
+%   \SpecialUsageIndex{\Spm}\relax
+%   \SpecialUsageIndex{\Ft}\relax
+%   \SpecialUsageIndex{\Fm}\relax
+%   \SpecialUsageIndex{\Fs}\relax
+%   \SpecialUsageIndex{\Fpm}\relax
+%   \SpecialUsageIndex{\Gt}\relax
+%   \SpecialUsageIndex{\Gm}\relax
+%   \SpecialUsageIndex{\Gs}\relax
+%   \SpecialUsageIndex{\Gpm}\relax
+%   \SpecialUsageIndex{\At}\relax
+%   \SpecialUsageIndex{\Am}\relax
+%   \SpecialUsageIndex{\As}\relax
+%   \SpecialUsageIndex{\Apm}\relax
+%   \SpecialUsageIndex{\Nt}\relax
+%   \SpecialUsageIndex{\Lt}\relax
+%   \SpecialUsageIndex{\Lm}\relax
+%   \SpecialUsageIndex{\Ls}\relax
+%   \SpecialUsageIndex{\Lpm}\relax
+%   \SpecialUsageIndex{\Bt}\relax
+%   \SpecialUsageIndex{\Bm}\relax
+%   \SpecialUsageIndex{\Bs}\relax
+%   \SpecialUsageIndex{\Bpm}\relax
+%   \SpecialUsageIndex{\Mt}\relax
+%   \SpecialUsageIndex{\Mm}\relax
+%   \SpecialUsageIndex{\Ms}\relax
+%   \SpecialUsageIndex{\Mpm}\relax
+%   \centering
+%   \begin{minipage}{4.12in}\renewcommand*{\footnoterule}{\vskip-1ex}%
+%   \centering\small
+%   \begin{tabular}{l l l l l}
+%   \toprule
+%     Property & Total & Molar & Specific & Partial Molar \\
+%   \midrule
+%     Heat            & \cs{Qt} & \cs{Qm} & \cs{Qs} & N/A \\
+%     Work            & \cs{Wt} & \cs{Wm} & \cs{Ws} & N/A \\
+%     Total energy    & \cs{Et} & \cs{Em} & \cs{Es} & \cs{Epm} \\
+%     Internal energy & \cs{Ut} & \cs{Um} & \cs{Us} & \cs{Upm} \\
+%     Enthalpy        & \cs{Ht} & \cs{Hm} & \cs{Hs} & \cs{Hpm} \\
+%     Entropy         & \cs{St} & \cs{Sm} & \cs{Ss} & \cs{Spm} \\
+%     Volume          & \cs{Vt} & \cs{Vm} & \cs{Vs} & \cs{Vpm} \\
+%     Helmholtz free energy & \cs{Ft} & \cs{Fm} & \cs{Fs} & \cs{Fpm} \\
+%     Gibbs free energy & \cs{Gt} & \cs{Gm} & \cs{Gs} & \cs{Gpm} \\
+%     Surface area    & \cs{At} & \cs{Am} & \cs{As} & \cs{Apm} \\
+%     Grand potential\footnote{The grand potential,
+%       $\Lt(T,\Vt,\vec{\mu}\mkern1mu) = \Ut - T\St - \sum_i^C \mu_i \Nt_i,$
+%       is also called the Landau free energy by some authors.}
+%                  & \cs{Lt} & \cs{Lm} & \cs{Ls} & \cs{Lpm} \\
+%     Moles           & \cs{Nt} & N/A & N/A & N/A \\
+%     $B$ (generic property) & \cs{Bt} & \cs{Bm} & \cs{Bs} & \cs{Bpm} \\
+%     $M$ (generic property) & \cs{Mt} & \cs{Mm} & \cs{Ms} & \cs{Mpm} \\
+%   \bottomrule
+%   \end{tabular}
+%   \end{minipage}
+% \end{table}
+%
+% \begin{table}
+%   \caption{Convenience macros and their default symbols.
+%       These are generally ``smart'': for example,
+%       \texttt{\textbackslash cP\_i} renders as $C_{P,i}$, as expected, and
+%       \texttt{\textbackslash cP\_i\^{}\textbackslash circ} renders as
+%       $C_{P,i}^\circ$, also as expected. You can also reverse it:
+%       \texttt{\textbackslash cP\^{}\textbackslash circ\_i} becomes
+%       $C^\circ_{P,i}$.}
+%   \label{table:conveniences}
+%   \SpecialUsageIndex{\cP}\relax
+%   \SpecialUsageIndex{\cV}\relax
+%   \SpecialUsageIndex{\kappaT}\relax
+%   \SpecialUsageIndex{\kappaS}\relax
+%   \SpecialUsageIndex{\alphaP}\relax
+%   \SpecialUsageIndex{\alphaS}\relax
+%   \SpecialUsageIndex{\heatcapacitysymbol}\relax
+%   \SpecialUsageIndex{\compressibilitysymbol}\relax
+%   \SpecialUsageIndex{\expansivitysymbol}\relax
+%   \SpecialUsageIndex{\fpure}\relax
+%   \SpecialUsageIndex{\fmix}\relax
+%   \SpecialUsageIndex{\fsat}\relax
+%   \SpecialUsageIndex{\phipure}\relax
+%   \SpecialUsageIndex{\phimix}\relax
+%   \SpecialUsageIndex{\phisat}\relax
+%   \SpecialUsageIndex{\Psat}\relax
+%   \SpecialUsageIndex{\Pvap}\relax
+%   \SpecialUsageIndex{\sat}\relax
+%   \SpecialUsageIndex{\Henryrat}\relax
+%   \SpecialUsageIndex{\Henrymol}\relax
+%   \SpecialUsageIndex{\gammarat}\relax
+%   \SpecialUsageIndex{\gammamol}\relax
+%   \SpecialUsageIndex{\Deltamix}\relax
+%   \SpecialUsageIndex{\Deltarxn}\relax
+%   \SpecialUsageIndex{\Deltavap}\relax
+%   \SpecialUsageIndex{\Deltasub}\relax
+%   \SpecialUsageIndex{\Deltafus}\relax
+%   \SpecialUsageIndex{\mixing}\relax
+%   \SpecialUsageIndex{\reaction}\relax
+%   \SpecialUsageIndex{\fusion}\relax
+%   \SpecialUsageIndex{\vaporization}\relax
+%   \SpecialUsageIndex{\sublimation}\relax
+%   \begin{minipage}{\linewidth}
+%   \small
+%   \addtolength{\tabcolsep}{-2pt}\relax
+%   \addtolength{\extrarowheight}{0.75ex}\relax
+%   \renewcommand*{\footnoterule}{\vskip-1.5ex}\relax
+%   \begin{tabular}{l l l l l}
+%   \toprule
+%   \\[-1.5\normalbaselineskip]
+%     Name & Macro & Sym. & Definition & Base Symbol Macro \\
+%   \midrule
+%     Isobaric heat capacity & \verb"\cP"\footnote{\relax
+%         Extensive and specific (per-unit-mass) versions are available
+%         as \texttt{\textbackslash cPt} and \texttt{\textbackslash cPs},
+%         respectively, with similar macros for the isochoric heat capacity.
+%         \label{fn:cP}}
+%     & $C_P$ & $\displaystyle T\left(\frac{\partial S}{\partial T}\right)_P$
+%     & \verb"\heatcapacitysymbol" \\[2.0ex]
+%     Isochoric heat capacity & \verb"\cV"\footref{fn:cP} & $C_V$
+%     & $\displaystyle T\left(\frac{\partial S}{\partial T}\right)_V$
+%     & \verb"\heatcapacitysymbol" \\[2.0ex]
+%     Isothermal compressibility & \verb"\kappaT" & $\kappa_T$ &
+% \(\displaystyle -\frac{1}{V} \left(\frac{\partial V}{\partial P}\right)_T \)
+%       & \verb"\compressibilitysymbol" \\[2.0ex]
+%     Isentropic compressibility & \verb"\kappaS" & $\kappa_S$ &
+% \(\displaystyle -\frac{1}{V} \left(\frac{\partial V}{\partial P}\right)_S\)
+%       & \verb"\compressibilitysymbol" \\[2.0ex]
+%     Isobaric expansivity & \verb"\alphaP" & $\alpha_P$ &
+% \(\displaystyle \frac{1}{V} \left(\frac{\partial V}{\partial T}\right)_P\)
+%       & \verb"\expansivitysymbol" \\[2.0ex]
+%     Isentropic expansivity & \verb"\alphaS" & $\alpha_S$ &
+% \(\displaystyle \frac{1}{V} \left(\frac{\partial V}{\partial T}\right)_S\)
+%       & \verb"\expansivitysymbol" \\[2.0ex]
+%     Pure fugacity & \verb"\fpure" & $f$ & $\phi P$ \\
+%     Mixture fugacity & \verb"\fmix" & $\hat f$ & $\hat f_i = x_i\hat\phi_i P$ \\[0.5ex]
+%     Saturation fugacity & \verb"\fsat" & $f^\text{sat}$
+%       & $\phi^\text{sat} P^\text{sat}$ & \cs{sat} \\
+%     Pure fugacity coeff.\ & \verb"\phipure" & $\phi$ &
+%       \multicolumn{2}{l}{\( \phi_i
+%         = \exp\left(\frac{1}{RT}\int_0^P V_i(T,p)
+%               - \frac{RT}{p}\,dp\right) \)} \\
+%     Mixture fugacity coeff.\ & \verb"\phimix" & $\hat\phi$
+%       & \multicolumn{2}{l}{\( \hat\phi_i
+%          = \exp\left(\frac{1}{RT}\int_0^P \Vpm{i}(T,p,\allXs)
+%                - \frac{RT}{p}\,dp\right) \)} \\
+%     Henry's constant (rational) & \verb"\Henryrat" & $h$
+%       & $\gamma_i^\infty f_i$ \\
+%     Henry's constant (molal) & \verb"\Henrymol" & $\mathcal{H}$ 
+%       & $M_s \gamma_i^\infty f_i$ \\
+%     Rational activity coeff.\ & \verb"\gammarat" & $\gamma^\ast$
+%       & $\gamma/\gamma^\infty$ \\
+%     Molal activity coeff.\ & \verb"\gammamol" & $\gamma^\square$
+%       & $x_s \gamma/\gamma^\infty$ \\
+%     Saturation fugacity coeff.\ & \verb"\phisat" & $\phi^\text{sat}$
+%       & $\phi(T,P^\text{sat})$ & \cs{sat} \\
+%     Saturation pressure & \verb"\Psat" & $P^\text{sat}$ && \cs{sat} \\
+%     Vapor pressure & \verb"\Pvap" & \multicolumn{3}{l}{Currently a synonym
+%       for \cs{Psat}\footnote{If you want \cs{Pvap} to produce $P^\text{vap}$
+%       instead of $P^\text{sat}$, you should redefine the \cs{sat} macro.}} \\
+%     Standard state & \verb"\std"\footnote{Typical usage would be
+%       \texttt{\$\cs{mu}\_i = \cs{mu}\textasciicircum\cs{std}\_i
+%         + RT \cs{log} a\_i\$},
+%       yielding $\mu_i = \mu_i^\circ + RT \log a_i$.} & $\circ$ \\
+%     Standard pressure & \verb"\Pstd" & $P^\circ$ & & \cs{std} \\
+%     Standard fugacity & \verb"\fstd" & $f^\circ$ & $f(T,P^\circ)$ & \cs{std}
+%     \\
+%     Change on mixing & \verb"\Deltamix"\footnote{The usual usage would be
+%         something like
+%         \texttt{\$\cs{Deltamix}\cs{Vm}\textasciicircum\cs{IGM} = 0\$}.\relax
+%       \label{fn:Deltausage}}
+%       & $\Delta M$\textsubscript{mix}
+%       & $M - \sum_i x_i M_i$ & \verb"\mixing" \\
+%     Change on reaction & \verb"\Deltarxn"\footref{fn:Deltausage}
+%       & $\Delta M_\text{rxn}$
+%       & $\sum_i \nu_i M_i$ & \verb"\reaction" \\
+%     Change on melting & \verb"\Deltafus"\footref{fn:Deltausage}
+%       & $\Delta M^\text{fus}$ & $M^L - M^S$ & \verb"\fusion" \\
+%     Change on boiling & \verb"\Deltavap"\footref{fn:Deltausage}
+%       & $\Delta M^\text{vap}$ & $M^V - M^L$ & \verb"\vaporization" \\
+%     Change on subliming & \verb"\Deltasub"\footref{fn:Deltausage}
+%       & $\Delta M^\text{sub}$ & $M^V - M^S$ & \verb"\sublimation" \\
+%   \bottomrule
+%   \end{tabular}
+%   \end{minipage}
+% \end{table}
+%
+% \subsection{Partial Molar Properties}
+% \DescribeMacro{\Upm}
+% \DescribeMacro{\Hpm}
+% Partial molar quantities are typically defined with the suffix \verb"pm".
+% For example, \cs{Upm} refers to the partial molar internal energy. There
+% are two options for how to enter partial molar quantities: as commands or
+% as super/subscripts. For example,
+% \begin{verbatim}
+%  \[ \Upm{i} \quad \Upm[\IG]{i} \quad \Hpm_i \quad \Hpm^\IG_i \]
+%\end{verbatim}
+% will typeset as
+%  \[ \Upm{i} \quad \Upm[\text{IG}]{i} \quad \Hpm{i} \quad \Hpm[\text{IG}]{i}\]
+% There are also partial molar heat capacities available via \cs{cPpm} and
+% \cs{cVpm}.
+% \textbf{Important}: The \cs{text} command defined by the \verb"amstext"
+% package is usually robust enough that something like \verb"\Um^\text{L}" will
+% work as expected, without additional braces. This does \emph{not} work for
+% partial molar properties; for example, \verb"\Hpm^\text{L}_i" will produce an
+% error, as will \verb"\Hpm_i^\text{L}". The expression
+% \verb"\Hpm_i^{\text{L}}" will work as expected.
+%
+% \DescribeMacro{\partialmolar}
+% New partial molar properties can be defined for any ``simple'' symbol using
+% the \cs{partialmolar} macro. ``Simple'' means it has no subscripts or
+% superscripts. For example, the macro for the partial molar Gibbs free energy
+% is defined via the macro
+% \DescribeMacro{\Gpm}
+% \begin{verbatim}
+%   \newcommand*{\Gpm}{\partialmolar{\Gibbs at symbol}}
+%\end{verbatim}
+% A list of pre-defined macros for total, molar, specific, and partial molar
+% quantities commonly used in thermodynamics is included in
+% Table~\ref{table:symbols}.
+%
+% \subsection{Other Predefined Symbols and Modifiers}
+% There are a number of predefined symbols and modifiers.
+% While these symbols could be defined or used without these macros, such use
+% is not recommended: changing package options will result in inconsistencies
+% if these macros are not used.
+%
+% \subsubsection{Heat Capacities, Compressibilities, and Expansivities}
+% \DescribeMacro{\cP}
+% \DescribeMacro{\cV}
+% \DescribeMacro{\kappaS}
+% \DescribeMacro{\kappaT}
+% \DescribeMacro{\alphaP}
+% \DescribeMacro{\alphaS}
+% The isobaric and isochoric heat capacities are produced with \cs{cP} and
+% \cs{cV}, respectively. Four other measurable quantities are defined: the
+% isothermal and isentropic compressibilities, \cs{kappaT} and \cs{kappaS},
+% respectively; and the isobaric and isentropic volume expansivities,
+% \cs{alphaP} and \cs{alphaS}, respectively. Some textbooks use $\beta$ instead
+% of $\alpha$ for the volume expansivity to differentiate it from the
+% \emph{linear} expansivity; this can be changed by redefining
+% \cs{expansivitysymbol}, which is done automatically by some of the
+% package options that create notation specific to a particular textbook.
+%
+% \subsubsection{Fugacities and Fugacity Coefficients}
+% \DescribeMacro{\fpure}
+% \DescribeMacro{\fmix}
+% \DescribeMacro{\phipure}
+% \DescribeMacro{\phimix}
+% Different textbooks use different modifications of the symbol $f$ for
+% fugacity, so it is recommended to use the macro \cs{fpure} to denote the
+% pure-component fugacity and \cs{fmix} to denote the mixture fugacity.
+% Similarly, the pure-component fugacity coefficient should be generated with
+% \cs{phipure}, and that in the mixture should be \cs{phimix}.
+%
+% For example, the following markup is an example of a common equation in
+% mixture thermodynamics:
+% \begin{verbatim}
+%   \[ \fmix_j = x_j \phimix_j P = x_j \gamma_j \fpure_j. \]
+%\end{verbatim}
+% With the default package options, this produces
+%   \[ \hat f_j = x_j \hat\phi_j P = x_j \gamma_j f_j. \]
+% With the |Thompson| package option, however, the same markup produces
+%   \[ \hat f_j = x_j \hat\phi_j P = x_j \gamma_j f^\bullet_j. \]
+% Similarly, the |Prausnitz| package option causes it to generate
+%   \[ f_j = x_j \phi_j P = x_j \gamma_j f_{\text{pure},j}, \]
+% and the |Sandler| option causes it to generate
+%   \[ \bar f_j = x_j \bar \phi_j P = x_j \gamma_j f_j. \]
+%
+% \subsubsection{Activity Coefficients and Henry's Constants}
+% \DescribeMacro{\gammarat}
+% \DescribeMacro{\gammamol}
+% \DescribeMacro{\Henryrat}
+% \DescribeMacro{\Henrymol}
+% The activity coefficient can be generated with \cs{gamma}, as usual.
+% The Henry's Law activity coefficients should be produced with \cs{gammarat}
+% (rational basis) and \cs{gammamol} (molal basis).
+% There are also macros to generate the Henry's law constants for both the
+% rational basis (\cs{Henryrat}) and the molal basis (\cs{Henrymol}).
+% These are interrelated:
+% \begin{verbatim}
+% \[ \fmix_i = x_i \gamma_i \fpure_i = x_i \gammarat_i \Henryrat_i
+%            = C_i \gammamol_i \Henrymol_i \]
+%\end{verbatim}
+% produces
+% \[ \hat f_i = x_i \gamma_i f_i = x_i \gamma^*_i h_i
+%             = C_i \gamma^\square_i \mathcal{H}_i \]
+% using the default options.
+%
+% \subsubsection{Saturation Properties}
+% \DescribeMacro{\Psat}
+% \DescribeMacro{\Pvap}
+% \DescribeMacro{\fsat}
+% \DescribeMacro{\phisat}
+% The saturation pressure is generated with \cs{Psat}. The macro \cs{Pvap} is
+% an alias for \cs{Psat}. The fugacity and fugacity coefficient at saturation
+% are accessed via \cs{fsat} and \cs{phisat}, respectively. Package options
+% can be used to change some of these to match the notation of specific
+% textbooks.
+%
+% \DescribeMacro{\sat}
+% The \cs{sat} macro is used ``behind the scenes'' as part of
+% \cs{Psat}, \cs{fsat}, and \cs{phisat}, which produce $P^\text{sat}$,
+% $f^\text{sat}$, and $\phi^\text{sat}$, respectively. If you wanted to
+% redefine them to be $P^\text{vap}$, $f^\text{vap}$, and $\phi^\text{vap}$,
+% you could simply redefine \cs{sat} with
+% \verb"\renewcommand*{\sat}{{\text{vap}}}".
+% This is done automatically using package option |Sandler|.
+%
+% \subsubsection{Standard States}
+% \DescribeMacro{\std}
+% \DescribeMacro{\Pstd}
+% \DescribeMacro{\fstd}
+% The symbol $\circ$ (\cs{circ}) is used by default for standard states.
+% This is intended to be easy to change should the user want to replace
+% $P^\circ$ with $P^\ominus$, say. This is accessed via the \cs{std} macro.
+% The macro \cs{Pstd} is defined as |P^\std| for convenience to denote
+% standard pressures, and \cs{fstd} is defined for standard fugacities so as to
+% ease implementation across textbooks.
+%
+% The usual usage would be something like this:
+% \begin{verbatim}
+% \[ \Deltarxn\Gm = \sumall_i \nu_i \mu_i = \sumall_i \left[ \nu_i \mu^\std_i
+%    + \nu_i RT \log\left(\frac{\fmix_i}{\fstd_i}\right) \right]
+%    = \Deltarxn\Gm^\std + RT \log\left[\prodall_i a_i^{\nu_i} \right] \]
+%\end{verbatim}
+% which produces
+% \[ \Delta G_\text{rxn} = \sum_{i=1}^C \nu_i \mu_i
+%   = \sum_{i=1}^C \left[ \nu_i \mu^\circ_i
+%       + \nu_i RT \log\left(\frac{\hat f_i}{f_i^\circ}\right) \right]
+%   = \Delta G^\circ_\text{rxn}
+%       + RT \log\left[\prod_{i=1}^C a_i^{\nu_i} \right] \]
+% with the default settings.
+%
+% \subsubsection{Changes on Mixing, Reaction, Fusion, Vaporization, and
+%   Sublimation}
+% \DescribeMacro{\Deltamix}
+% Mixing properties are handled via the \cs{Deltamix} macro, and are used as in
+% the following example:
+% \begin{verbatim}
+% \[ \Deltamix\Gm = \Gm - \sumall_i x_i \Gm_i = \Deltamix\Hm - T\Deltamix\Sm \]
+%\end{verbatim}
+% which yields
+% \[ \Delta G_\text{mix} = G - \sum_{i=1}^C x_i G_i
+%     = \Delta H_\text{mix} - T\Delta S_\text{mix}. \]
+% Some textbooks (|Sandler|, |Thompson|) choose to typeset these with the word
+% ``mix'' \emph{before} the symbol, which is handled automatically by this
+% package.
+% \DescribeMacro{\mixing}
+% The macro \cs{mixing} determines how the change in mixing label is rendered;
+% the default is \verb"{\text{mix}}".
+%
+% \DescribeMacro{\Deltafus}
+% \DescribeMacro{\Deltasub}
+% \DescribeMacro{\Deltavap}
+% The commands \cs{Deltafus}, \cs{Deltasub}, and \cs{Deltavap}
+% typeset changes due to fusion (melting), sublimation (subliming), and
+% vaporization (boiling), respectively. Their use is straightforward, viz.,
+% \begin{verbatim}
+%  \[ \Deltasub\Hm = \Hm^V - \Hm^S = \Hm^V - \Hm^L + (\Hm^L - \Hm^S)
+%                  = \Deltafus\Hm + \Deltavap\Hm \]
+%\end{verbatim}
+% yielding
+%  \[ \Delta\Hm^\text{sub} = \Hm^V - \Hm^S = \Hm^V - \Hm^L + (\Hm^L - \Hm^S)
+%                = \Delta\Hm^\text{vap} + \Delta\Hm^\text{fus} \]
+% with the default options. Note that some textbooks (e.g., |Sandler|) typeset
+% these quantities quite differently.
+%
+% \DescribeMacro{\Deltaf}
+% \DescribeMacro{\Deltarxn}
+% The macros \cs{Deltaf} and \cs{Deltarxn} are intended to typeset the enthalpy
+% or free energy of formation and reaction, respectively. For example,
+% \begin{verbatim}
+%  \[ \Deltarxn\Hm^\std = \sumall_i \nu_i \Deltaf\Hm_i^\std \]
+%\end{verbatim}
+% results in
+% \[ \Delta\Hm_\text{rxn}^\circ = \sum_{i=1}^C \nu_i \Delta\Hm_{f,i}^\circ. \]
+% It is not anticipated that this command will be combined with something like
+% a heat capacity, which already has a (potentially double) subscript, but as
+% there is no ``formation'' heat capacity, that should not present a problem.
+%
+% \subsection{Residual and Excess Properties}
+% \DescribeMacro{\UR}
+% \DescribeMacro{\URt}
+% \DescribeMacro{\URs}
+% \DescribeMacro{\URpm}
+% \DescribeMacro{\UE}
+% \DescribeMacro{\UEt}
+% \DescribeMacro{\UEs}
+% \DescribeMacro{\UEpm}
+% Additional macros are defined that make it easy to typeset the residual
+% (also called ``departure'') and excess total, molar, specific, and partial
+% molar properties. These macros follow the same pattern: \cs{UR}, \cs{URt},
+% \cs{URs}, and \cs{URpm} typeset the molar, total, specific, and partial molar
+% residual internal energies, respectively, and by default expand to $U^R,$
+% $\thermounderline{U}^R,$ $\hat U^R, $ and $\smash[t]{\Upm[R]{i}}$ (the last
+% is called as \verb"\URpm{i}" or \verb"\URpm_i"). Similarly, \cs{UE},
+% \cs{UEt}, \cs{UEs}, and \cs{UEpm} typeset the corresponding excess
+% properties. The first character of the macros for other properties follow the
+% same pattern as in Table~\ref{table:symbols}.
+%
+% \DescribeMacro{\excess}
+% \DescribeMacro{\residual}
+% The $R$ and $E$ characters are generated by the macros \cs{residual} and
+% \cs{excess}, respectively. These macros can be redefined; for example, if you
+% want \cs{SE}, which normally produces $S^E$, to give you $S^{EX}$---and let's
+% be honest, who doesn't want that?\footnote{You knew that joke was
+% coming.}---then you can redefine it with
+% \begin{verbatim}
+%   \renewcommand*{\excess}{{EX}}
+%\end{verbatim}
+% or possibly
+% \begin{verbatim}
+%   \renewcommand*{\excess}{{\mathrm{EX}}}
+%\end{verbatim}
+% or even
+% \begin{verbatim}
+%   \renewcommand*{\excess}{\text{EX}}
+%\end{verbatim}
+% which cause \cs{SE} to expand to $S^{EX},$ $S^\mathrm{EX},$ and
+% $S^\text{EX},$ respectively.
+%
+% It is generally not possible to use superscripts with the excess or
+% residual properties; in the event the user needs this, the \cs{excess} and
+% \cs{residual} macros can be used directly, viz.,
+% \begin{verbatim}
+%   \begin{gather*}
+%     \Hm^{\excess,\std} = \HE(T,\Pstd) \\
+%   \renewcommand*{\excess}{EX}
+%     \Hm^{\excess,\std} = \HE(T,\Pstd)
+%   \end{gather*}
+%\end{verbatim}
+% which yields
+% \begin{gather*}
+%   \Hm^{E,\circ} = H^E(T,P^\circ) \\
+%   \Hm^{EX,\circ} = H^{EX}(T,P^\circ)
+% \end{gather*}
+% using the default options.
+% \clearpage
+%
+% \subsection{Partial Derivatives}
+% \DescribeMacro{\Partial}%
+% \DescribeMacro{\Partial*}%
+% Partial derivatives are easily rendered using the \cs{Partial} command.
+% There is a starred form (\cs{Partial*}) that additionally adjusts the
+% spacing after the closing symbol to remove some of the space, anticipating
+% that the following binary operator will overhang the subscripts. Compare
+% the following:
+% \begin{verbatim}
+%   \begin{gather*}
+%     \Partial{\Hm}{T}{P} = \cP \qquad \Partial*{\Hm}{T}{P} = \cP
+%   \end{gather*}
+%\end{verbatim}
+% which yields
+% \begin{gather*}
+%   \left(\frac{\partial\Hm}{\partial T}\right)_{P} = C_P \qquad
+%   \left(\frac{\partial\Hm}{\partial T}\right)_{P} \mkern-8mu = C_P
+% \end{gather*}
+% \DescribeMacro{\PartialSecond}%
+% \DescribeMacro{\PartialSecond*}%
+% \DescribeMacro{\PartialMixSecond}%
+% \DescribeMacro{\PartialMixSecond*}%
+% Second partial derivatives and mixed-second partial derivatives are typeset
+% with the commands \cs{PartialSecond} and \cs{PartialMixSecond}, respectively.
+% Like the first-order variety, these also have starred versions that remove
+% the space immediately following the closing symbols, anticipating that the
+% equals sign or other binary operator following the derivative will overhang
+% the elements held constant. For example,
+% \begin{verbatim}
+%   \[ \Vpm_i = \Partial*{\Vt}{\Nt_i}{T,P,\allNsbut{i}}
+%             = \PartialMixSecond*{\Gt}{\Nt_i}{P}{T,\allNsbut{i}}
+%             = \PartialMixSecond*{\Gt}{P}{\Nt_i}{T,\allNsbut{i}}
+%             = \Partial{\Gpm_i}{P}{T,\allNs} \]
+%\end{verbatim}
+% looks like
+%   \[ \Vpm{i} = \left(\frac{\partial\Vt}
+%                           {\partial\Nt_i}\right)_{T,P,\allNsbut{i}}
+%       \mkern-15mu
+%              = \left(\frac{\partial^2\Gt}
+%                           {\partial\Nt_i\partial P}\right)_{T,\allNsbut{i}}
+%       \mkern-15mu
+%              = \left(\frac{\partial^2\Gt}
+%                           {\partial P\partial\Nt_i}\right)_{T,\allNsbut{i}}
+%       \mkern-15mu
+%              = \left(\frac{\partial\Gpm{i}}{\partial P}\right)_{T,\allNs}. \]
+% \DescribeMacro{\PartialBigg}
+% \SpecialUsageIndex{\PartialBigg*}\relax
+% \DescribeMacro{\PartialSecondBigg}
+% \SpecialUsageIndex{\PartialSecondBigg*}\relax
+% \DescribeMacro{\PartialMixSecondBigg}
+% \SpecialUsageIndex{\PartialMixSecondBigg*}\relax
+% \DescribeMacro{\Partialbigg}
+% \SpecialUsageIndex{\Partialbigg*}\relax
+% \DescribeMacro{\PartialSecondbigg}
+% \SpecialUsageIndex{\PartialSecondbigg*}\relax
+% \DescribeMacro{\PartialMixSecondbigg}
+% \SpecialUsageIndex{\PartialMixSecondbigg*}\relax
+% There are instances (such as the line above) when \cs{Partial} causes
+% parentheses that are slightly
+% too tall but do not need to be---particularly when partial molar properties,
+% specific quantities, or fugacities are involved. The macro \cs{PartialBigg}
+% uses \verb"amsmath"'s \cs{Biggl} and \cs{Biggr} macros in place of \cs{left}
+% and \cs{right} to size the parentheses accordingly; \cs{Partiallbigg} uses
+% \cs{biggl} and \cs{biggr} in a similar fashion. For example, compare the
+% following:
+% \begin{verbatim}
+%  \[ \Vpm_i = \Partial*{\Vt}{\Nt_i}{T,P,\allNsbut{i}}
+%            = \Partial*{\Gpm_i}{P}{T,\allNs}
+%            = \PartialBigg*{\Gpm_i}{P}{T,\allNs}
+%            = RT\Partial*{\log\fmix_i}{P}{T,\allNs}
+%            = RT\,\PartialBigg*{\log\fmix_i}{P}{T,\allNs}
+%            = RT\,\Partialbigg{\log\fmix_i}{P}{T,\allNs} \]
+%\end{verbatim}
+% which typesets as
+% \[ \Vpm{i}
+%      = \left(\frac{\partial\Vt}{\partial \Nt_i}\right)_{T,P,\allNsbut{i}}
+%        \mkern-15mu
+%      = \left(\frac{\partial\Gpm{i}}{\partial P}\right)_{T,\allNs}
+%        \mkern-15mu
+%      = \Biggl(\frac{\partial\Gpm{i}}{\partial P}\Biggr)_{T,\allNs}
+%        \mkern-15mu
+%      = RT\left(\frac{\partial\log\hat f_i}{\partial P}\right)_{T,\allNs}
+%        \mkern-15mu
+%      = RT\,\Biggl(\frac{\partial\log\hat f_i}{\partial P}\Biggr)_{T,\allNs}
+%        \mkern-15mu
+%      = RT\,\biggl(\frac{\partial\log\hat f_i}{\partial P}\biggr)_{T,\allNs} \]
+% Note that a similar effect---possibly with other side effects---can be
+% achieved with \verb"amsmath"'s \cs{smash} command, which has the effect of
+% removing all vertical space associated with a particular character.
+% Observe:
+% \begin{verbatim}
+%  \[ \Vpm_i = \Partial{\Vt}{\Nt_i}{T,P,\allNsbut{i}}
+%            = \Partial{\smash{\Gpm_i}}{P}{T,\allNs} \]
+% \end{verbatim}
+% produces
+% \[ \Vpm{i}
+%      = \left(\frac{\partial\Vt}{\partial \Nt_i}\right)_{T,P,\allNsbut{i}}
+%      = \left(\frac{\partial\smash{\Gpm{i}}}{\partial P}\right)_{T,\allNs}. \]
+% Note that the vertical spacing is not quite as good here as it was above.
+% This can be fixed by using the optional argument to \cs{smash}, viz.,
+% \begin{verbatim}
+%  \[ \Vpm_i = \Partial{\Vt}{\Nt_i}{T,P,\allNsbut{i}}
+%            = \Partial{\smash[t]{\Gpm_i}}{P}{T,\allNs} \]
+%\end{verbatim}
+% \[ \Vpm{i}
+%   = \left(\frac{\partial\Vt}{\partial \Nt_i}\right)_{T,P,\allNsbut{i}}
+%   = \left(\frac{\partial\smash[t]{\Gpm{i}}}{\partial P}\right)_{T,\allNs}. \]
+% It is possible to ``fake'' higher-order derivatives via some trickery.
+% For example,
+% \begin{verbatim}
+% \[ \cPpm_i = T\Partial{\Spm_i}{T}{P,\allXs}
+%            = T\PartialSecond{\St}{T}{\Nt_i}{P,\allNsbut{i}}
+%            = -T\Partial{^3\Gt}{T^2\partial\Nt_i}{P,\allNsbut{i}} \]
+%\end{verbatim}
+% gives
+% \[ \cPpm{i} = T\Partial{\Spm{i}}{T}{P,\allXs}
+%             = T\Partial{^2\St}{T\partial\Nt_i}{P,\allNsbut{i}}
+%             = -T\Partial{^3\Gt}{T^2\partial\Nt_i}{P,\allNsbut{i}}, \]
+% which is probably pretty close to what you wanted. Using this trickery with
+% the package option \verb"nosubscripts" will not work as well, and the use of
+% third- and higher-order derivatives with this package should generally be
+% considered unsupported.
+%
+% \subsection{Holding Constant the Number of Moles of Several Species}
+% \DescribeMacro{\allNs}%
+% \DescribeMacro{\allNsbut}%
+% \DescribeMacro{\allmus}%
+% \DescribeMacro{\allmusbut}%
+% \DescribeMacro{\allXs}%
+% \DescribeMacro{\allXsbut}%
+% \DescribeMacro{\allYs}%
+% \DescribeMacro{\allYsbut}%
+% \DescribeMacro{\allMs}%
+% \DescribeMacro{\allMsbut}%
+% \DescribeMacro{\allWs}%
+% \DescribeMacro{\allWsbut}%
+% It is common in thermodynamics to use notation such as
+% \[ \Vpm{k} = \left(\frac{\partial\Vt}{\partial\Nt_k}\right)_{T,P,\Nt_{j\neq k}} \]
+% or perhaps
+% \[ \Vpm{k} = \left(\frac{\partial\Vt}{\partial\Nt_k}\right)_{T,P,\Nt_1,\dotsc,[\Nt_k],\dots,\Nt_C} \]
+% to mean partial derivatives that hold the number of moles of each species
+% constant \emph{except} the one being changed.
+% Similarly, a property determined with all mole fractions held
+% constant might be written
+% \[ C_P = \left(\frac{\partial\Hm}{\partial T}\right)_{P,\vec{x}} \]
+% or perhaps
+% \[ C_P = \left(\frac{\partial\Hm}{\partial T}\right)_{P,x_1,\dotsc,x_C}. \]
+% There are several macros that standardize such constructs.
+% The \cs{allNs} macro expands to something meaning the number of moles of all
+% species; by default, this is $\vec{n}$ (package option
+% \verb"moles-index"), but can be changed to $n_1,\dotsc,n_C$ using the package
+% option \verb"moles-range". Similarly, the macros \cs{allmus} and
+% \cs{allmusbut} do the same but with $n$ replaced by $\mu$, and \cs{allMsbut}
+% is the same with $m$ instead of $n$. There are analogous macros for mole
+% fractions, namely \cs{allXs} and \cs{allXsbut} for $x$ and \cs{allYs} and
+% \cs{allYsbut} for $y$, as well as \cs{allWs} and \cs{allWsbut} for mass
+% fractions---these implicitly assume that all mole or mass fractions
+% \emph{except} the last are used as variables.  The macros \cs{allNsbut},
+% \cs{allMsbut}, \cs{allmusbut}, \cs{allXsbut}, \cs{allYsbut}, and
+% \cs{allWsbut} take an optional argument; for example,
+% \begin{verbatim}
+%   \Partial{\Ht}{\Nt_1}{T,P,\allNsbut{1}} =
+%   \Partial{\Ht}{\Nt_1}{T,P,\allNsbut[m]{1}} = \Hpm_1
+%\end{verbatim}
+% typesets as
+% \[ \left(\frac{\partial\Ht}{\partial\Nt_1}\right)_{T,P,\Nt_{j\neq 1}}
+%   = \left(\frac{\partial\Ht}{\partial\Nt_1}\right)_{T,P,\Nt_{m\neq 1}}
+%   = \Hpm{1} \]
+% Similarly,
+% \begin{verbatim}
+%   \Partial{\Hm}{x_i}{T,P,\allXsbut{i}} =
+%   \Partial{\Hm}{x_i}{T,P,\allXsbut[m]{i}} = \Hpm_i - \Hpm_\ncomponents
+%\end{verbatim}
+% becomes
+% \[ \left(\frac{\partial\Hm}{\partial x_i}\right)_{T,P,x_{j\neq i,C}}
+%   = \left(\frac{\partial\Hm}{\partial x_i}\right)_{T,P,x_{m\neq i,C}}
+%   = \Hpm{i} - \Hpm{C} \]
+% The user must supply their own redefinition if they wish to hold something
+% other than \cs{ncomponents} constant in addition to the argument.
+% Using the \verb"moles-range" package option, for which \verb"\allXsbut{k}"
+% expands to $x_1,\dotsc,[x_k],\dotsc,x_{C-1}$ rather than $x_{j \neq k,C}$,
+% the optional argument is ignored.
+%
+% \DescribeMacro{\allbut}
+% \DescribeMacro{\allbutlastand}
+% Users can define new ``all but'' macros using the \cs{allbut} and
+% \cs{allbutlastand} commands. For example,
+% \begin{verbatim}
+%   \newcommand*{\allNsbut}[2][j]{\allbut[#1]{#2}{\Nt}}
+%   \newcommand*{\allXsbut}[2][j]{\allbutlastand[#1]{#2}{x}}
+%\end{verbatim}
+% are the definitions of \cs{allNsbut} and \cs{allXsbut}, respectively.
+%
+% \subsection{Sums and Products}
+% \DescribeMacro{\sumall}
+% \DescribeMacro{\sumallbutlast}
+% \DescribeMacro{\prodall}
+% It is common to require sums and products such as
+% \[ \sum_{i=1}^C x_i = 1 \quad \text{or} \quad
+%    x_C = 1 - \sum_{i=1}^{C-1} x_i \quad \text{or} \quad
+%    \Gt = \sum_{j=1}^C \mu_j\Nt_j \quad \text{and} \quad
+%    K = \prod_{k=1}^C a_k^{\nu_k}. \]
+% This package defines shortcuts to typeset such terms thus:
+% \begin{verbatim}
+% \[ \sumall_i x_i = 1 \quad \text{or} \quad
+%    x_\ncomponents = 1 - \sumallbutlast_i x_i \quad \text{or} \quad
+%    \Gt = \sumall_j \mu_j\Nt_j \quad \text{and} \quad
+%    K = \prodall_k a_k^{\nu_k}. \]
+%\end{verbatim}
+% The symbol $C$ can be changed by redefining \cs{ncomponents}. This is done
+% automatically by some package options (e.g., |TesterModell| changes it to
+% $n$; |Sandler| changes it to $\mathcal{C}$; |Thompson| changes it to
+% $c$).
+%
+% \section{Loading the Package} \label{sec:loading}
+% To load the package with the defaults enabled, load it the usual way:
+% \begin{verbatim}
+%   \usepackage{thermodynamics}
+%\end{verbatim}
+% The package options loaded by default are \verb"EUAGHan", \verb"subscripts",
+% \verb"parentheses", \verb"intensive-plain", and \verb"moles-index".
+% These define, respectively, the default symbols to use for total energy,
+% internal energy, Helmholtz free energy, and so forth; the manner of writing
+% partial derivatives; the delimiters around partial derivatives; and the
+% manner of denoting extensive, molar, and specific properties. The default
+% behavior can be altered by options in the following section.
+%
+% \subsection{Package Options}
+% There are three categories of options: options that affect which symbols are
+% used, options that affect how symbols are decorated, and options that affect
+% how partial derivatives are displayed. These are presented in turn.
+%
+% \subsubsection{Options that Change Symbol Sets}
+% There are several options that choose the set of symbols to use for total
+% energy, internal energy, Helmholtz free energy, and so forth. These are
+% summarized in Table~\ref{table:symbol-sets}. The default is \verb"EUAGHan".
+%
+% \begin{table}
+%   \caption{Options controlling which symbols to use by default. The
+%       macros \cs{Et}, \cs{Ut}, \cs{Ft}, \cs{Gt}, \cs{Ht}, \cs{At}, and
+%       \cs{Nt} represent the total energy, internal energy,
+%       Helmholtz free energy, Gibbs free energy, enthalpy, surface area,
+%       and number of moles, respectively. Symbols are shown as they would
+%       appear with the (default) option \texttt{intensive-plain}.
+%   }
+%   \label{table:symbol-sets}
+%   \centering\small
+%   \begin{tabular}{l l l l l l l l l}
+%   \toprule
+%   Option & \verb"\Et" & \verb"\Ut" & \verb"\Ft" & \verb"\Gt" & \verb"\Ht"
+%          & \verb"\At" & \verb"\Nt" \\
+%   \midrule
+%     \verb"EUAGHan" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{A}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{a}$
+%                    & $n$
+%   \\
+%     \verb"EUAGHaN" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{A}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{a}$
+%                    & $N$
+%   \\
+%     \verb"EUHAGan" & \multicolumn{7}{l}{(synonym for \texttt{EUAGHan})} \\
+%     \verb"EUHAGaN" & \multicolumn{7}{l}{(synonym for \texttt{EUAGHaN})} \\
+%     \verb"EUFGHAn" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{A}$
+%                    & $n$
+%   \\
+%     \verb"EUFGHAN" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{A}$
+%                    & $N$
+%   \\
+%     \verb"EEFGHAn" & $\thermounderline{E}$
+%                    & $\thermounderline{E}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{A}$
+%                    & $n$
+%   \\
+%     \verb"EEFGHAn" & $\thermounderline{E}$
+%                    & $\thermounderline{E}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{A}$
+%                    & $N$
+%   \\
+%     \verb"EEFGHan" & $\thermounderline{E}$
+%                    & $\thermounderline{E}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{a}$
+%                    & $n$
+%   \\
+%     \verb"EEFGHaN" & $\thermounderline{E}$
+%                    & $\thermounderline{E}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{a}$
+%                    & $N$
+%   \\
+%     \verb"EEAGHaN" & $\thermounderline{E}$
+%                    & $\thermounderline{E}$
+%                    & $\thermounderline{A}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{a}$
+%                    & $N$
+%   \\
+%     \verb"EUAGHAn" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{A}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{A}$
+%                    & $n$
+%   \\
+%     \verb"EUAGHAN" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{A}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{A}$
+%                    & $N$
+%   \\
+%     \verb"EUFGHan" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{a}$
+%                    & $n$
+%   \\
+%     \verb"EUFGHaN" & $\thermounderline{E}$
+%                    & $\thermounderline{U}$
+%                    & $\thermounderline{F}$
+%                    & $\thermounderline{G}$
+%                    & $\thermounderline{H}$
+%                    & $\thermounderline{a}$
+%                    & $N$
+%   \\
+%   \bottomrule
+%   \end{tabular}
+% \end{table}
+%
+% Using \verb"EUAGHan" (the default), we might use the following markup:
+% \begin{verbatim}
+%   \[ \Ft = \Ut - T\St = -P\Vt + \sum_i \mu_i \Nt_i + \sigma d\At
+%      \qquad \Hm = \Um + P\Vm \qquad \Et = \Ut + \frac12 mv^2 \]
+%\end{verbatim}
+% which would look like
+% \[ \thermounderline{A}
+%    = \thermounderline{U} - T\thermounderline{S}
+%    = -P\thermounderline{V} + \sum_i \mu_i n_i + \sigma d\thermounderline{a}
+%    \qquad H = U + PV
+%    \qquad \thermounderline{E} = \thermounderline{U} + \frac12 mv^2. \]
+% Using the \verb"EUFGHAN" option, the same markup would yield
+% \[ \thermounderline{F}
+%    = \thermounderline{U} - T\thermounderline{S}
+%    = -P\thermounderline{V} + \sum_i \mu_i N_i + \sigma d\thermounderline{A}
+%    \qquad H = U + PV
+%    \qquad \thermounderline{E} = \thermounderline{U} + \frac12 mv^2. \]
+%
+% \subsubsection{Options for Extensive vs.\ Molar Properties}
+% There are four sets of notation that define how extensive properties are
+% represented, as shown in Table~\ref{table:extensive}.
+% The default is \verb"intensive-plain", which (using the volume as an
+% example) represents the total, molar, specific, and partial molar volumes,
+% respectively, as $\thermounderline{V},$ $V,$ $\hat V,$ and $\Vpm{j},$
+% respectively.
+%
+% For example, the definition of the partial molar enthalpy would be different
+% depending on which set of notation is used. The markup
+% \begin{verbatim}
+%   \Hpm_i = \Partial{\Ht}{\Nt_i}{T,P,\allNsbut{i}}
+%          = \Partial{\Nt\Hm}{\Nt_i}{T,P,\allNsbut{i}}
+%\end{verbatim}
+% yields the following, depending on the package option loaded:
+% \begin{align*}
+%   \Hpm{i} &= \left(\frac{\partial\thermounderline{H}}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%            = \left(\frac{\partial nH}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%       && \text{\texttt{intensive-plain}} \\
+%   \Hpm{i} &= \left(\frac{\partial H}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%            = \left(\frac{\partial n\thermounderline{H}}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%       && \text{\texttt{extensive-plain}} \\
+%   \Hpm{i} &= \left(\frac{\partial H^t}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%            = \left(\frac{\partial nH}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%       && \text{\texttt{extensive-superscript}} \\
+%   \Hpm{i} &= \left(\frac{\partial H}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%            = \left(\frac{\partial nh}
+%                         {\partial n_i}\right)_{T,P,n_{j\neq i}}
+%       && \text{\texttt{intensive-lowercase}}
+% \end{align*}
+% The use of \verb"intensive-lowercase" is strongly discouraged.
+%
+% Note that the number of moles can be changed from $n$ to $N$ via the
+% options in the previous section.
+%
+% \begin{table}
+%   \caption{Notation sets that can be set using the options
+%       \texttt{intensive-plain} (the default), \texttt{extensive-plain},
+%       \texttt{extensive-superscript}, and \texttt{intensive-lowercase},
+%       respectively. Note that specific quantities are generally assumed to
+%       look like the molar symbol with a caret on top.}
+%   \label{table:extensive}
+%   \centering\small
+%   \newcommand*{\vpm}[2][]{\mkern1mu\overline{\mkern-1mu v_{\mkern-2mu #2}^{#1}\mkern-2mu}\mkern2mu}
+%   \begin{tabular}{l l l l l l}
+%   \toprule
+%     Option & \verb"\Vt" & \verb"\Vm" & \verb"\Vs" & \verb"\Vpm_i" \\
+%   \midrule
+%     \verb"intensive-plain" & $\thermounderline{V}$ & $V$ & $\hat V$
+%       & $\Vpm{i}$ \\
+%     \verb"extensive-plain" & $V$ & $\thermounderline{V}$ & $\hat V$
+%       & $\Vpm{i}$\rule{0pt}{2.5ex} \\
+%     \verb"extensive-superscript" & $V^t$ & $V$ & $\hat V$
+%       & $\Vpm{i}$\rule{0pt}{2.5ex} \\
+%     \verb"intensive-lowercase" & $V$ & $v$ & $\hat v$
+%       & $\vpm{i}$\rule{0pt}{2.5ex} \\
+%   \bottomrule
+%   \end{tabular}
+% \end{table}
+%
+% \subsubsection{Options Affecting Partial Derivatives}
+% There are several options that change how partial derivatives are rendered.
+% First are the options that affect the delimiters. We will use the following
+% code as an example:
+% \begin{verbatim}
+%   \[ \Partial*{\Vm}{T}{P} = \PartialMixSecond{\Gm}{T}{P}{}
+%                           = \PartialMixSecond{\Gm}{P}{T}{}
+%                           = -\Partial{\Sm}{P}{T}. \]
+%\end{verbatim}
+% Using the \verb"parentheses" option (the default), this gives
+%   \[ \left(\frac{\partial V}{\partial T}\right)_{P} \mkern-8mu
+%       = \left(\frac{\partial^2 G}{\partial T \partial P}\right)
+%       = \left(\frac{\partial^2 G}{\partial P \partial T}\right)
+%       = -\left(\frac{\partial S}{\partial P}\right)_{T}. \]
+% The option \verb"brackets" changes the output to
+%   \[ \left[\frac{\partial V}{\partial T}\right]_{P} \mkern-8mu
+%       = \left[\frac{\partial^2 G}{\partial T \partial P}\right]
+%       = \left[\frac{\partial^2 G}{\partial P \partial T}\right]
+%       = -\left[\frac{\partial S}{\partial P}\right]_{T}. \]
+% The option \verb"bar" changes the output to
+%   \[ \left.\frac{\partial V}{\partial T}\right\rvert_{P} \mkern-8mu
+%       = \left.\frac{\partial^2 G}{\partial T \partial P}\right.
+%       = \left.\frac{\partial^2 G}{\partial P \partial T}\right.
+%       = -\left.\frac{\partial S}{\partial P}\right\rvert_{T}. \]
+% The option \verb"plain-derivatives" eliminates all delimiters; this forces
+% the \verb"nosubscripts" option. The output in this case is
+%   \[ \left.\frac{\partial V(T,P)}{\partial T}\right.
+%       = \left.\frac{\partial^2 G(T,P)}{\partial T \partial P}\right.
+%       = \left.\frac{\partial^2 G(P,T)}{\partial P \partial T}\right.
+%       = -\left.\frac{\partial S(P,T)}{\partial P}\right. \]
+%
+% Accompanying the \verb"plain-derivatives" option is the \verb"nosubscripts"
+% option, which overrides the default option \verb"subscripts". This option
+% makes partial derivatives such as
+% \[ \left(\frac{\partial V}{\partial P}\right)_{T}
+%   \qquad \text{(\texttt{subscripts} option)}, \]
+% and instead renders them
+% \[ \left(\frac{\partial V(P,T)}{\partial P}\right)
+%   \qquad \text{(\texttt{nosubscripts} option)}. \]
+% Combined with \verb"plain-derivatives", this would give
+% \[ \left.\frac{\partial V(P,T)}{\partial P}\right.
+%   \qquad \text{(\texttt{nosubscripts} and \texttt{plain-derivatives}
+%   options)} . \]
+% The order of the variables is determined by the arguments given: it is
+% always written with the variable that is changing first, and the other
+% variables in the order given in the final argument to \cs{Partial} and
+% friends. This will result in things like the following:
+% \begin{verbatim}
+%   \[ \Partial{\Vm}{T}{P} = \PartialMixSecond{\Gm}{T}{P}{}
+%       = \PartialMixSecond{\Gm}{P}{T}{} = -\Partial{\Sm}{P}{T}, \]
+%\end{verbatim}
+% which would produce (using \verb"plain-derivatives")
+% \[ \frac{\partial V(T,P)}{\partial T}
+%      = \frac{\partial^2 G(T,P)}{\partial T\partial P}
+%      = \frac{\partial^2 G(P,T)}{\partial P\partial T}
+%      = - \frac{\partial S(P,T)}{\partial P} \]
+% This is not unclear, but the variables appear in a different order.
+%
+% \DescribeEnv{thermoparentheses}
+% \DescribeEnv{thermobrackets}
+% \DescribeEnv{thermobar}
+% \DescribeEnv{thermoplain}
+% If you want to use parentheses \emph{locally}, even though your overall
+% document uses another delimiter, the |thermoparentheses| environment will do
+% that. Similarly, |thermobrackets| will temporarily switch to brackets,
+% |thermobar| will temporarily switch to a tailing vertical bar, and
+% |thermoplain| will remove delimiters altogether.
+%
+% \DescribeEnv{thermosubscripts}
+% \DescribeEnv{thermoNOsubscripts}
+% The environments |thermosubscripts| and |thermoNOsubscripts| force the
+% use or disuse of subscripts, respectively.
+%
+% \subsubsection{Options Regarding the Number of Moles}
+% \DescribeMacro{\allNs}
+% \DescribeMacro{\allNsbut}
+% The default option \verb"moles-index" defines the macro \cs{allNs} to expand
+% to $\vec{n}$ and the macro \verb"\allNsbut{i}" to expand to $n_{j\neq i}$.
+% You can change the dummy index: \verb"\allNsbut[k]{i}" expands to
+% $n_{k\neq i}$ by default. This is typically not necessary, however: if you
+% type \verb"\allNsbut{j}", the package will figure out that you want
+% $\Nt_{k\neq j}$ rather than $\Nt_{j\neq j}$. The time to use the optional
+% argument is in situations such as
+% \[ \Partial{\mu_j}{\Nt_k}{\Nt_{i\neq k}}, \]
+% which is incorrect if the dummy index $j$ is used in place of the $i$.
+%
+% You can change these to expand to ranges using the \verb"moles-range"
+% option, which renders \cs{allNs} as $n_1,\dotsc,n_C$ and \verb"\allNsbut{i}"
+% as $n_1,\dotsc,[n_i],\dotsc,n_C$. The optional argument is ignored in this
+% set of notation. Examples of these options are shown in
+% Table~\ref{table:allNs}.
+%
+% \DescribeMacro{\ncomponents}
+% You can change the symbol for the number of components (default: $C$) by
+% redefining the macro \cs{ncomponents}.
+%
+% \begin{table}
+%   \caption{Illustration of the \texttt{moles-index} and \texttt{moles-range}
+%       options and their effects on \cs{allNs} and \cs{allNsbut}.}
+%   \label{table:allNs}
+%   \SpecialUsageIndex{\allNs}\relax
+%   \SpecialUsageIndex{\allNsbut}\relax
+%   \SpecialUsageIndex{\allXs}\relax
+%   \SpecialUsageIndex{\allXsbut}\relax
+%   \centering
+%   \begin{minipage}{4.49in}\renewcommand*{\footnoterule}{\vskip-1.5ex}%
+%   \small
+%     \begin{tabular}{l l l}
+%     \toprule
+%       Macro\footnote{You may use $C$ directly instead of \cs{ncomponents}
+%         here, but then it will not change $C-1$ to $C-2$ (or, say, $M-1$ to
+%         $M-2$) if you want to redefine \cs{ncomponents} later.}
+%       & \verb"moles-index" & \verb"moles-range" \\
+%     \midrule
+%       \verb"\allNs" & $\vec{n}$ & $n_1,\dotsc,n_C$ \\
+%       \verb"\allNsbut{1}" & $n_{j\neq 1}$ & $n_2,\dotsc,n_C$ \\
+%       \verb"\allNsbut{i}" & $n_{j\neq i}$ & $n_1,\dotsc,[n_i],\dotsc,n_C$ \\
+%       \verb"\allNsbut{j}" & $n_{k\neq j}$ & $n_1,\dotsc,[n_j],\dotsc,n_C$ \\
+%       \verb"\allNsbut{\ncomponents}" & $n_{j\neq C}$ & $n_1,\dotsc,n_{C-1}$ \\
+%       \verb"\allNsbut[k]{i}" & $n_{k\neq i}$ & $n_1,\dotsc,[n_i],\dotsc,n_C$ \\
+%       \verb"\allXs" & $\vec{x}$ & $x_1,\dotsc,x_{C}$ \\
+%       \verb"\allXsbut{1}" & $x_{j\neq 1,C}$ & $x_2,\dotsc,x_{C-1}$ \\
+%       \verb"\allXsbut{i}" & $x_{j\neq i,C}$ & $x_1,\dotsc,[x_i],\dotsc,x_{C-1}$ \\
+%       \verb"\allXsbut{j}" & $x_{k\neq j,C}$ & $x_1,\dotsc,[x_j],\dotsc,x_{C-1}$ \\
+%       \verb"\allXsbut{\ncomponents-1}" & $x_{j\neq C-1,C}$ & $x_1,\dotsc,x_{C-2}$ \\
+%       \verb"\allXsbut[k]{\ncomponents-1}" & $x_{k\neq C-1,C}$ & $x_1,\dotsc,x_{C-2}$ \\
+%       \verb"\allXsbut{\ncomponents}"\footnote{This would typically be used
+%           to denote something like $\Gt(T,P,n,x_1,\dotsc,x_{C-1})$ rather
+%           than in a subscript, but it looks silly if we don't handle this
+%           case this way.}
+%           & $x_{j\neq C}$ & $x_1,\dotsc,x_{C-1}$ \\
+%     \bottomrule
+%     \end{tabular}
+%   \end{minipage}
+% \end{table}
+%
+% \subsubsection{Other Options}
+% \DescribeMacro{\dbar}
+% \newcommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-10mu d}}\relax
+% The default for path-dependent one-forms (often called ``inexact
+% differentials'') is \cs{dbar}, which looks like $\dbar$. This can be changed,
+% if desired, to a delta ($\delta$) with the \verb"delta" option to the
+% package.
+%
+% It should be noted that the \cs{dbar} macro is not very stable: changing
+% the typeface to something not supported will probably ruin it, as the kerning
+% is very font-specific. This package currently supports Computer Modern,
+% Times, Palatino, Bitstream Charter, Garamond, and Utopia, but other typefaces
+% may require a manual redefinition.
+%
+% \subsubsection{Options for Specific Textbooks}
+% There are several options that load package options and/or redefine
+% particular commands to match the notation in a particular textbook. So far
+% the following textbooks are supported:
+% \begin{description}
+%   \item[Bejan] Notation used by Bejan, \emph{Advanced Engineering
+%     Thermodynamics}, Third Edition. Wiley: Hoboken, 2006. Loads non-default
+%     package options \verb"EUFGHAN", \verb"intensive-lowercase", and
+%     \verb"delta". Also swaps the definitions of \verb"\@specific" and
+%     \verb"\@intensive" and redefines \cs{cV}, \cs{cVs}, \cs{cVt},
+%     \cs{expansivitysymbol}, and \cs{ncomponents} to match his notation.
+%   \item[CBK] Notation used by \c Cengel, Boles, and Kano\u glu,
+%     \emph{Thermodynamics: An Engineering Approach}, Ninth Edition.
+%     McGraw Hill: Singapore, 2020. Loads the non-default package options
+%     \verb"EUAGHAN" and \verb"intensive-lowercase"; also redefines
+%     partial molar, specific, and molar properties' notation to fit theirs,
+%     and redefines \cs{pressure at symbol}, \cs{Deltarxn},
+%     \cs{compressibilitysymbol}, and \cs{expansivitysymbol} to fit their
+%     usage. Their prodigal symbols for specific and total volume are not
+%     supported.
+%   \item[ElliottLira] Notation used by Elliott and Lira, \emph{Introductory
+%     Chemical Engineering Thermodynamics}, Second Edition. Prentice Hall:
+%     Upper Saddle River, 2012. Loads the default package options and
+%     redefines \cs{allcomponents} and \cs{Deltarxn} to fit their notation.
+%   \item[Koretsky] Notation used by Koretsky, \emph{Engineering and Chemical
+%     Thermodynamics}, Second Edition, Wiley: New Caledonia, 2013.
+%     Loads the non-default package options \verb"EUAGHAn", \verb"brackets",
+%     \verb"intensive-lowercase", and \verb"delta"; modifies the
+%     \verb"intensive-lowercase" defaults to make uppercase partial molar
+%     properties to match Koretsky's notation and redefines
+%     \cs{expansivitysymbol}, \cs{IS}, \cs{residual}, \cs{IG}, \cs{IGM},
+%     \cs{Deltafus}, \cs{Deltasub}, \cs{Deltavap}, \cs{Henryrat},
+%     \cs{gammarat}, \cs{Deltafus}, \cs{Deltavap}, and \cs{Deltasub} to match
+%     his use. Also redefines the fugacity coefficients to use $\varphi$
+%     instead of $\phi$.
+%   \item[MSBB] Notation used by Moran, Shapiro, Boettner, and Bailey,
+%     \emph{Fundamentals of Engineering Thermodynamics}, Eighth Edition.
+%     Wiley: Kendallville, 2014. Loads the non-default package options
+%     \verb"EUFGHAn", \verb"intensive-lowercase", and \verb"delta"; removes the
+%     left parenthesis in partial derivatives and redefines \cs{IGM}, \cs{IG},
+%     \cs{expansitivitysymbol}, \cs{allcomponents}, \cs{allbut}, \cs{Ft},
+%     \cs{Helmholtz at symbol}, \cs{@intensive}, \cs{@specific}, \cs{fmix},
+%     \cs{phimix}, and \cs{pressure at symbol} to fit their somewhat ill-advised
+%     notation. Also resets \cs{partialmolar} to match their use.
+%   \item[Prausnitz] Notation used by Prausnitz, Lichtenthaler, and de Azevedo,
+%     \emph{Molecular Thermodynamics of Fluid-Phase Equilibria}, Third Edition,
+%     Pearson, 1998. Loads the non-default package option
+%     \verb"intensive-lowercase" and redefines \cs{fmix}, \cs{phimix},
+%     \cs{fpure}, \cs{phipure}, \cs{residual}, \cs{allcomponents}, and
+%     \cs{allbut} to fit their notation.
+%   \item[Sandler] Notation used by Sandler, \emph{Chemical, Biochemical, and
+%     Engineering Thermodynamics}, Fifth Edition. Wiley: Hoboken, 2017.
+%     Loads non-default package options \verb"EUAGHaN" and
+%     \verb"extensive-plain"; also redefines \cs{sat}, \cs{excess},
+%     \cs{residual}, \cs{ncomponents}, \cs{fmix}, \cs{fstd}, \cs{phimix},
+%     \cs{allcomponents}, \cs{IS}, \cs{Deltamix}, \cs{Deltarxn}, \cs{Deltasub},
+%     \cs{Deltafus}, \cs{Deltavap}, and \cs{Henryrat}. Also redefines \cs{cV},
+%     \cs{cP}, \cs{cVt}, and \cs{cPt}.
+%   \item[SVNAS] Notation used by Smith, Van Ness, Abbott, and Swihart,
+%     \emph{Introduction to Chemical Engineering Thermodynamics}, Ninth
+%     Edition. McGraw-Hill: Boston, 2021. Loads the non-default package option
+%     \verb"extensive-superscript" and redefines \cs{allcomponents},
+%     \cs{allbut}, \cs{IG}, \cs{IGM}, \cs{IS}, \cs{expansivitysymbol}, and
+%     \cs{Deltarxn} to fit their notation.  The extensive heat capacities are
+%     also redefined, as they do not use such an entity.
+%   \item[TesterModell] Notation used by Tester and Modell,
+%     \emph{Thermodynamics and Its Applications}, Third Edition, Prentice Hall:
+%     Upper Saddle River, 1997. Loads the non-default package options
+%     \verb"EUAGHaN" and \verb"delta"; also redefines \cs{ncomponents} to be
+%     $n$ and redefines \cs{allcomponents}, \cs{allbut}, and \cs{allbutlastand}
+%     to fit their (somewhat inconsistent) notation. Also redefines \cs{IG},
+%     \cs{IGM}, \cs{IS}, \cs{excess}, \cs{reaction}, \cs{Henryrat},
+%     \cs{Henrymol}, \cs{gammarat}, and \cs{gammamol} to fit their style.
+%   \item[Thompson] Notation used by Thompson, \emph{A Unified Introduction to
+%     Chemical Engineering Thermodynamics}, Stillwater Press: Orono, 2000.
+%     Loads the non-default package options \verb"EUAGHAn" and \verb"delta";
+%     also redefines \cs{excess}, \cs{residual}, \cs{allcomponents},
+%     \cs{ncomponents}, \cs{IS}, \cs{IG}, \cs{IGM}, \cs{fpure}, \cs{phipure},
+%     \cs{mix}, \cs{Deltamix}, \cs{Deltarxn}, \cs{@intensive}, and \cs{allbut}
+%     to match his notation.  Note that he uses $c$, $n_C$, and $\mathrm{n}$
+%     for the number of components in various places in the book; I chose $c$
+%     for the definition of \cs{ncomponents}, but it is impossible to be
+%     completely consistent with his notation.
+% \end{description}
+% There may well be some inconsistencies between the notation in these books
+% and the symbols used here. I will fix such inconsistencies as I become aware
+% of them.
+%
+% \StopEventually{\PrintChanges\PrintIndex}
+%
+% ^^A--------------------------------------------------------------------------
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Implementation}
+% This package requires the \verb"amstext" package, as \cs{text} is used to
+% handle \cs{sat}, \cs{IS}, \cs{IG}, \cs{IGM}, \cs{Henrymol}, \cs{fusion},
+% \cs{reaction}, \cs{vaporization}, and \cs{sublimation} by default, as well
+% as several other macros defined by package options.
+%    \begin{macrocode}
+\RequirePackage{amstext}
+%    \end{macrocode}
+%
+% \subsection{Symbols Controlled by Package Options}
+% We set some symbols prior to declaring the package options. The default
+% symbols follow package option |EUAGHan|, even though the macros follow
+% the option |EUFGHAN|.
+%
+% \begin{macro}{\dbar}
+% The way \cs{dbar} is defined depends on the typeface you are using.
+% We try to determine, at \verb"\begin{document}", which typeface you chose
+% based on the packages that are loaded and some of their internal definitions.
+% The \textsf{thermodynamics} package currently supports
+% Computer Modern (the default or through \verb"lmodern"),
+% Palatino (through \verb"pxfonts" or \verb"newpxmath"),
+% Times (through \verb"txfonts", \verb"mathptmx", or \verb"newtxmath"),
+% Utopia (through \verb"mathdesign"),
+% Bitstream Charter (through \verb"mathdesign"), and
+% Garamond (through \verb"mathdesign").
+% Definitions of \cs{dbar} (with \cs{newcommand*} or \cs{providecommand*})
+% in the preamble will override the ones here.
+%    \begin{macrocode}
+\AtBeginDocument{
+    \@ifpackageloaded{pxfonts}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-10mu d}}%
+    }{}
+    \@ifpackageloaded{newpxmath}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-10mu d}}%
+    }{}
+    \@ifpackageloaded{txfonts}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-11mu d}}%
+    }{}
+    \@ifpackageloaded{mathptmx}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-10mu d}}%
+    }{}
+    \@ifpackageloaded{newtxmath}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-12mu d}}%
+    }{}
+    \@ifpackageloaded{mathdesign}{%
+        \def\@charter{mdbch}%
+        \def\@utopia{mdput}%
+        \def\@garamond{mdugm}%
+        \ifx\MD at default@family\@utopia
+            \providecommand*{\dbar}{{\mkern8mu\mathchar'26\mkern-20mu d}}%
+        \fi
+        \ifx\MD at default@family\@charter
+            \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-15mu d}}%
+        \fi
+        \ifx\MD at default@family\@garamond
+            \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-17mu d}}%
+        \fi
+    }{}
+    % Defaults to Computer Modern
+    \providecommand*{\dbar}{{\mkern3mu\mathchar'26\mkern-12mu d}}
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% Symbols are defined for the total energy, internal energy, Helmholtz free
+% energy, Gibbs free energy, enthalpy, entropy, surface area, volume, number
+% of moles, heat, and work; these are $E$, $U$, $A$, $G$, $H$, $S$, $a$,
+% $V$, $n$, $Q$, and $W$, respectively. These commands should not be used on
+% their own, but rather accessed through the macros \cs{Ut}, \cs{Um}, and
+% \cs{Us} (using the internal energy as an example).
+%
+% \begin{macro}{\totalenergy at symbol}
+% \begin{macro}{\internalenergy at symbol}
+% \begin{macro}{\Helmholtz at symbol}
+% \begin{macro}{\Gibbs at symbol}
+% \begin{macro}{\Landau at symbol}
+% \begin{macro}{\enthalpy at symbol}
+% \begin{macro}{\entropy at symbol}
+% \begin{macro}{\area at symbol}
+% \begin{macro}{\volume at symbol}
+% \begin{macro}{\mole at symbol}
+% \begin{macro}{\heat at symbol}
+% \begin{macro}{\work at symbol}
+% \begin{macro}{\temperature at symbol}
+% \begin{macro}{\pressure at symbol}
+% The default symbols are not intended to be easy to change---the intended
+% mechanism is through package options. If you want to use a non-standard
+% symbol that is not available through one of the package options, you can
+% redefine these macros inside
+% \cs{makeatletter}\dots\cs{makeatother}. For example,
+% \begin{verbatim}
+%    \makeatletter
+%       \renewcommand*{\Helmholtz at symbol}{H}
+%       \renewcommand*{\enthalpy at symbol}{h}
+%    \makeatother
+%\end{verbatim}
+% would define the ill-advised notation that I have nonetheless heard of
+% that uses $H$ for Helmholtz free energy and $h$ for enthalpy.
+% Note that the macros for temperature and pressure are only used inside
+% the definitions of the compressibilities, expansivitites, and heat
+% capacities; there is no user-level macro for the temperature or the pressure,
+% so it is up to the user to use consistent symbols for those properties.
+%    \begin{macrocode}
+\newcommand*{\totalenergy at symbol}{E}
+\newcommand*{\internalenergy at symbol}{U}
+\newcommand*{\Helmholtz at symbol}{A}
+\newcommand*{\Gibbs at symbol}{G}
+\newcommand*{\Landau at symbol}{\Omega}
+\newcommand*{\enthalpy at symbol}{H}
+\newcommand*{\entropy at symbol}{S}
+\newcommand*{\area at symbol}{a}
+\newcommand*{\volume at symbol}{V}
+\newcommand*{\mole at symbol}{n}
+\newcommand*{\heat at symbol}{Q}
+\newcommand*{\work at symbol}{W}
+\newcommand*{\temperature at symbol}{T}
+\newcommand*{\pressure at symbol}{P}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\thermo at underline}
+% \begin{macro}{\thermo at overline}
+% We then define two macros and several lengths that we shall use when
+% drawing rules above or below a symbol. The default is to use underlined
+% symbols for extensive quantities, plain symbols for molar quantities, and
+% carets for specific quantities, but this can be changed using package
+% options.
+% ^^A TODO these would work better as kern 0.1*width, symbol, kern 0.2*width
+%    \begin{macrocode}
+\newcommand*{\thermo at underline}[1]{%
+  \mkern1mu\underline{\mkern-1mu #1\mkern-4mu}\mkern4mu%
+}
+\newcommand*{\thermo at overline}[1]{%
+  \mkern2mu\overline{\mkern-2mu #1\mkern-1mu}\mkern1mu%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PartialOpen}
+% \begin{macro}{\PartialClose}
+% \begin{macro}{\PartialEmptyClose}
+% We define three commands to use to denote the beginning and end of partial
+% derivatives. These symbols can be customized by package options. Default
+% is \verb"parentheses", meaning that \verb"\[ \Partial{f}{x}{y} \]" renders as
+% \[ \left(\frac{\partial f}{\partial x}\right)_y \]
+% with the defaults. The macro \cs{PartialEmptyClose} is used when the last
+% argument to \cs{Partial} is empty, which is important for the \verb"bar"
+% option to the document class or inside the \verb"thermobar" environment.
+%    \begin{macrocode}
+\newcommand*{\PartialOpen}{(}
+\newcommand*{\PartialClose}{)}
+\newcommand*{\PartialEmptyClose}{)}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Package Options}
+% We declare a bunch of options for which sets of symbols to use.
+% These are summarized in Table~\ref{table:symbol-sets}.
+%    \begin{macrocode}
+\DeclareOption{EUAGHan}{}% the default
+\DeclareOption{EUAGHaN}{\renewcommand*{\mole at symbol}{N}}%
+\DeclareOption{EUHAGan}{\ExecuteOptions{EUAGHan}}
+\DeclareOption{EUHAGaN}{\ExecuteOptions{EUAGHaN}}
+\DeclareOption{EUFGHAn}{% this is my favorite set of symbols
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+}
+\DeclareOption{EUFGHAN}{% this is my second favorite set of symbols
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EEFGHAn}{% this treats all energy the same way(?)
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+}
+\DeclareOption{EEFGHAN}{% this treats all energy the same way(?)
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EEFGHan}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}
+}
+\DeclareOption{EEFGHaN}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EEAGHan}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+}
+\DeclareOption{EEAGHaN}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EUAGHAn}{% Helmholtz free energy and area look the same here
+  \renewcommand*{\area at symbol}{A}%
+}
+\DeclareOption{EUAGHAN}{% Helmholtz free energy and area look the same here
+  \renewcommand*{\area at symbol}{A}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EUFGHan}{%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+}
+\DeclareOption{EUFGHaN}{%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+%    \end{macrocode}
+% The \verb"delta" option redefines \cs{dbar} to produce the symbol $\delta$.
+% The default is to use a $d$ with a slash through it ($\dbar$) for inexact
+% differentials unless the user overrides it with this option. The macro could
+% also be redefined manually, of course.
+%    \begin{macrocode}
+\DeclareOption{delta}{\let\dbar\delta}
+%    \end{macrocode}
+%
+% \begin{macro}{\@extensive}
+% \begin{macro}{\@intensive}
+% \begin{macro}{\@specific}
+% Next, we define options for the set of notation. The default is
+% \verb"intensive-plain", which produces things like $V$ for molar volume,
+% $\Vt$ for total volume, and $\hat V$ for specific volume.
+% These are defined via the internal macros \verb"\@extensive",
+% \verb"\@intensive", and \verb"\@specific".
+%    \begin{macrocode}
+\let\@extensive\relax
+\let\@intensive\relax
+\let\@specific\hat
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%    \begin{macrocode}
+\DeclareOption{extensive-plain}{%
+    \let\@extensive\relax
+    \let\@intensive\thermo at underline
+}
+\DeclareOption{intensive-plain}{% the default
+    \let\@extensive\thermo at underline
+    \let\@intensive\relax
+}
+\DeclareOption{intensive-lowercase}{% PLEASE don't use this!
+    \let\@extensive\MakeUppercase
+    \let\@intensive\MakeLowercase
+    \def\@specific#1{\MakeLowercase{\hat #1}}
+    \AtEndOfPackage{
+        \renewcommand*{\partialmolar}[1]{%
+            \gdef\pm at symbol{\MakeLowercase #1}\generic at pm}
+        \renewcommand*{\heatcapacitysymbol}{c}
+    }
+}
+\DeclareOption{extensive-superscript}{%
+    \gdef\@extensive#1{{#1}^t}%
+    \let\@intensive\relax%
+    \AtEndOfPackage{%
+      \renewcommand*{\URt}{\internalenergy at symbol^{\residual,t}}
+      \renewcommand*{\HRt}{\enthalpy at symbol^{\residual,t}}
+      \renewcommand*{\FRt}{\Helmholtz at symbol^{\residual,t}}
+      \renewcommand*{\GRt}{\Gibbs at symbol^{\residual,t}}
+      \renewcommand*{\VRt}{\volume at symbol^{\residual,t}}
+      \renewcommand*{\SRt}{\entropy at symbol^{\residual,t}}
+      \renewcommand*{\UEt}{\internalenergy at symbol^{\excess,t}}
+      \renewcommand*{\HEt}{\enthalpy at symbol^{\excess,t}}
+      \renewcommand*{\FEt}{\Helmholtz at symbol^{\excess,t}}
+      \renewcommand*{\GEt}{\Gibbs at symbol^{\excess,t}}
+      \renewcommand*{\VEt}{\volume at symbol^{\excess,t}}
+      \renewcommand*{\SEt}{\entropy at symbol^{\excess,t}}
+    }
+}
+%    \end{macrocode}
+%
+% The next two options choose whether variables held constant are subscripted
+% (the default) or placed next to the function. The \verb"nosubscripts"
+% option currently requires that the variable being changed is the first one
+% in the argument list. The difference is
+% \[ \left(\frac{\partial U}{\partial S}\right)_V \quad\text{versus}\quad
+%    \left(\frac{\partial U(S,V)}{\partial S}\right) \]
+% for \verb"subscripts" and \verb"nosubscripts", respectively.
+%    \begin{macrocode}
+\newif\if at subscripted
+\@subscriptedtrue
+\DeclareOption{subscripts}{\@subscriptedtrue}
+\DeclareOption{nosubscripts}{\@subscriptedfalse}
+%    \end{macrocode}
+% These options change how \cs{Partial} and friends render derivatives.
+% The default is parentheses, but other options include brackets, braces,
+% a vertical bar on the right side, or plain (undecorated) derivatives.
+%    \begin{macrocode}
+\DeclareOption{parentheses}{}
+\DeclareOption{brackets}{%
+  \renewcommand*{\PartialOpen}{[}%
+  \renewcommand*{\PartialClose}{]}%
+  \renewcommand*{\PartialEmptyClose}{]}%
+}
+\DeclareOption{braces}{%
+  \renewcommand*{\PartialOpen}{\{}%
+  \renewcommand*{\PartialClose}{\}}%
+  \renewcommand*{\PartialEmptyClose}{\}}%
+}
+\DeclareOption{bar}{%
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{\rvert}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+}
+\DeclareOption{plain-derivatives}{% This implies dU(S,V,N)/dS notation
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{.}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+  \ExecuteOptions{nosubscripts}%
+}
+%    \end{macrocode}
+% \subsection{The Number of Moles Macros}
+% \begin{macro}{\ncomponents}
+% We define the number of components, default $C$, for use in the ``all moles''
+% and related macros.
+%    \begin{macrocode}
+\newcommand*{\ncomponents}{C}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\allNs}
+% \begin{macro}{\allNsbut}
+% \begin{macro}{\allMs}
+% \begin{macro}{\allmus}
+% \begin{macro}{\allMsbut}
+% \begin{macro}{\allmusbut}
+% Several macros define a shorthand for ``moles of all species'' (\cs{allNs})
+% and ``moles of all species except'' (\cs{allNsbut}), as well as similar
+% quantities for masses (\cs{allMs}, \cs{allMsbut}) and chemical potentials
+% (\cs{allmus}, \cs{allmusbut}), which occur frequently in mixture
+% thermodynamics. The default is for \cs{allNs} to become $\vec{n}$ and
+% \verb"allNsbut{i}" to become $n_{j\neq i}$. The optional argument changes
+% which index (default: $j$) to use in the left side of the inequality.\relax
+% \footnote{The index \!$j$ is automatically replaced with $k$ if the user
+%   issues \texttt{\textbackslash allNsbut\{j\}}.}
+% Essentially identical commands are defined for chemical potentials and
+% masses: \cs{allmus} and \cs{allmusbut} and \cs{allMs} and \cs{allMsbut},
+% respectively.
+%    \begin{macrocode}
+\newcommand*{\allNs}{\allcomponents{\Nt}}
+\newcommand*{\allXs}{\allcomponents{x}}
+\newcommand*{\allYs}{\allcomponents{y}}
+\newcommand*{\allmus}{\allcomponents{\mu}}
+\newcommand*{\allMs}{\allcomponents{m}}
+\newcommand*{\allWs}{\allcomponents{w}}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\allXs}
+% \begin{macro}{\allYs}
+% \begin{macro}{\allWs}
+% \begin{macro}{\allWsbut}
+% \begin{macro}{\allXsbut}
+% \begin{macro}{\allYsbut}
+% Similar commands are defined for mole fractions (\cs{allXs}, \cs{allYs},
+% etc.), but these assume the last mole fraction is \emph{not} one of the
+% variables---that is, \cs{allXsbut} and \cs{allYsbut} assume the argument
+% \emph{and} \cs{ncomponents} are held constant. For example,
+% \begin{verbatim}
+%   \[ \Partial{\Gm}{T}{P,\allXs} = -\Sm \qquad
+%      \Partial{\Gm}{x_i}{T,P,\allXsbut{i}} \neq \Gpm_i \]
+%\end{verbatim}
+% yields
+% \[ \Partial{G}{T}{P,\allXs} = -S \qquad
+%    \Partial{G}{x_i}{T,P,x_{j\neq i,C}} \neq \Gpm{i}. \]
+%    \begin{macrocode}
+\newcommand*{\allNsbut}[2][j]{\allbut[#1]{#2}{\Nt}}
+\newcommand*{\allXsbut}[2][j]{\allbutlastand[#1]{#2}{x}}
+\newcommand*{\allYsbut}[2][j]{\allbutlastand[#1]{#2}{y}}
+\newcommand*{\allmusbut}[2][j]{\allbut[#1]{#2}{\mu}}
+\newcommand*{\allMsbut}[2][j]{\allbut[#1]{#2}{m}}
+\newcommand*{\allWsbut}[2][j]{\allbutlastand[#1]{#2}{w}}%
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\allbutlastand}
+% \begin{macro}{\allbut}
+% \begin{macro}{\allcomponents}
+% The \cs{allcomponents}, \cs{allbut}, and \cs{allbutlastand} macros can be
+% used to define new entities; say, if you want to use $z_i$ as a mole
+% fraction, then use
+% \begin{verbatim}
+%   \newcommand*{\allZsbut}[2][j]{\allbutlastand[#1]{#2}{z}}
+%\end{verbatim}
+% Similarly, something meaning the concentrations of every species could be
+% defined via
+% \begin{verbatim}
+%   \newcommand*{\allCs}{\allcomponents{C}}
+%\end{verbatim}
+%    \begin{macrocode}
+\newcommand*{\allcomponents}[1]{\vec{#1}}
+\newcommand*{\allbut}[3][j]{%
+  \def\tmp at arg{#2}%
+  \def\tmp@@arg{#1}%
+  \ifx\tmp at arg\tmp@@arg
+    {#3}_{k\neq #2}%
+  \else
+    {#3}_{#1\neq #2}%
+  \fi
+}
+\newcommand*{\allbutlastand}[3][j]{%
+  \edef\tmp at arg{#1}%
+  \edef\tmp@@arg{#2}%
+  \ifx\tmp@@arg\ncomponents
+    {#3}_{#1 \neq #2}%
+  \else
+    \ifx\tmp at arg\tmp@@arg
+      {#3}_{k \neq #2,\ncomponents}%
+    \else
+      {#3}_{#1 \neq #2,\ncomponents}%
+    \fi
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% We then define two package options that change how to render \cs{allNs} and
+% friends.
+%    \begin{macrocode}
+\DeclareOption{moles-index}{}
+\DeclareOption{moles-range}{%
+  \renewcommand*{\allcomponents}[1]{{#1}_1,\dots,{#1}_{\ncomponents}}
+  \renewcommand*{\allbut}[3][j]{%
+    \def\@one{1}%
+    \edef\tmp at arg{#2}%
+    \ifx\tmp at arg\@one
+      {#3}_2,\dots,{#3}_{\ncomponents}%
+    \else
+      \ifx\tmp at arg\ncomponents
+        {#3}_1,\dots,{#3}_{\ncomponents-1}%
+      \else
+        {#3}_1,\dots,[{#3}_{#2}],\dots,{#3}_{\ncomponents}%
+      \fi
+    \fi
+  }
+  \renewcommand*{\allbutlastand}[3][j]{%
+    \def\@one{1}%
+    \edef\tmp at arg{#2}%
+    \edef\@ncminusone{\ncomponents-1}%
+    \ifx\tmp at arg\@one
+      {#3}_2,\dots,{#3}_{\ncomponents-1}%
+    \else
+      \ifx\tmp at arg\@ncminusone
+        {#3}_1,\dots,{#3}_{\ncomponents-2}%
+      \else
+        \ifx\tmp at arg\ncomponents
+          {#3}_1,\dots,{#3}_{\ncomponents-1}%
+      \else
+          {#3}_1,\dots,[{#3}_{#2}],\dots,{#3}_{\ncomponents}%
+        \fi
+      \fi
+    \fi
+  }
+}
+%    \end{macrocode}
+% The remaining options define textbook-specific notation.
+%    \begin{macrocode}
+\DeclareOption{Bejan}{
+  \ExecuteOptions{EUFGHAN,intensive-lowercase,delta}
+  \let\@specific\MakeLowercase
+  \def\@intensive#1{\MakeLowercase{\bar #1}}
+  \AtEndOfPackage{
+    \DeclareSubscrSymbol{cV}{\bar\heatcapacitysymbol}{v}
+    \DeclareSubscrSymbol{cVs}{\heatcapacitysymbol}{v}
+    \DeclareSubscrSymbol{cVt}{\Nt\heatcapacitysymbol}{v}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\ncomponents}{n}
+  }
+}
+\DeclareOption{CBK}{
+  \ExecuteOptions{EUAGHAN,intensive-lowercase}
+  \AtEndOfPackage{
+    \let\thermo at overline\widetilde
+    \let\@specific\MakeLowercase
+    \renewcommand*{\@intensive}[1]{\MakeLowercase{\bar{#1}}}
+    \renewcommand*{\pressure at symbol}{p}
+    \renewcommand*{\Deltarxn}[1]{#1_R}
+    \renewcommand*{\compressibilitysymbol}{\beta}
+    \renewcommand*{\expansivitysymbol}{\alpha}
+  }
+}
+\DeclareOption{ElliottLira}{
+  \AtEndOfPackage{
+    \renewcommand*{\allcomponents}[1]{#1}
+    \renewcommand*{\Deltarxn}[1]{\Delta #1}
+  }
+}
+\DeclareOption{Koretsky}{
+  \ExecuteOptions{EUAGHAn,brackets,intensive-lowercase,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\partialmolar}[1]{\gdef\pm at symbol{#1}\generic at pm}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\IS}{{\text{ideal}}}
+    \renewcommand*{\residual}{{\text{dep}}}
+    \renewcommand*{\IG}{{\text{ideal}}}
+    \renewcommand*{\IGM}{{\text{ideal}}}
+    \renewcommand*{\Deltafus}[1]{\Delta{#1}_\fusion}
+    \renewcommand*{\Deltasub}[1]{\Delta{#1}_\sublimation}
+    \renewcommand*{\Deltavap}[1]{\Delta{#1}_\vaporization}
+    \renewcommand*{\Henryrat}{{\mathcal{H}}}
+    \renewcommand*{\gammarat}{\gamma^\text{Henry's}}
+    \let\phipure\varphi
+    \renewcommand*{\phimix}{\hat\varphi}
+    \renewcommand*{\phisat}{\varphi^\sat}
+    \let\Delta at fus@sym\relax
+    \DeclareSubscrSymbol{@Deltafus}{\Delta at fus@sym}{\fusion}
+    \renewcommand*{\Deltafus}[1]{\def\Delta at fus@sym{\Delta #1}\@Deltafus}
+    \let\Delta at vap@sym\relax
+    \DeclareSubscrSymbol{@Deltavap}{\Delta at vap@sym}{\vaporization}
+    \renewcommand*{\Deltasub}[1]{\def\Delta at sub@sym{\Delta #1}\@Deltasub}
+    \let\Delta at sub@sym\relax
+    \DeclareSubscrSymbol{@Deltasub}{\Delta at sub@sym}{\sublimation}
+    \renewcommand*{\Deltasub}[1]{\def\Delta at sub@sym{\Delta #1}\@Deltasub}
+  }
+}
+\DeclareOption{MSBB}{
+  \ExecuteOptions{EUFGHAn,intensive-lowercase,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\IGM}{\ast}
+    \renewcommand*{\IG}{\ast}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\allcomponents}[1]{#1}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}%
+      \else
+        {#3}_{#1}%
+      \fi
+    }
+    \let\Helmholtz at symbol\psi
+    \renewcommand*{\Ft}{\Psi}
+    \def\@intensive#1{\MakeLowercase{\thermo at overline #1}}
+    \let\@specific\MakeLowercase
+    \renewcommand*{\partialmolar}[1]{\gdef\pm at symbol{#1}\generic at pm}
+    \renewcommand*{\fmix}{\bar f}
+    \renewcommand*{\phimix}{\bar\phi}
+    \renewcommand*{\pressure at symbol}{p}
+  }
+}
+\DeclareOption{Prausnitz}{
+  \ExecuteOptions{intensive-lowercase}
+  \AtEndOfPackage{
+    \renewcommand*{\fmix}{f}
+    \let\phimix\phi
+    \renewcommand*{\fsat}{\fpure^\sat}
+    \DeclareSubscrSymbol{fpure}{f}{{\text{pure}}}
+    \DeclareSubscrSymbol{phipure}{\phi}{{\text{pure}}}
+    \renewcommand*{\residual}{{{\mathcal{R}}}}
+    \renewcommand*{\allcomponents}[1]{{#1}_i}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}%
+      \else
+        {#3}_{#1}%
+      \fi
+    }
+  }
+}
+\DeclareOption{Sandler}{
+  \ExecuteOptions{EUAGHaN,extensive-plain}
+  \AtEndOfPackage{
+    \renewcommand*{\sat}{{\text{vap}}}
+    \renewcommand*{\excess}{{\text{{ex}}}}
+    \renewcommand*{\residual}{{\text{r}}}
+    \renewcommand*{\ncomponents}{\mathcal{C}}
+    \renewcommand*{\fmix}{\bar f}
+    \renewcommand*{\fstd}{\bar f^\circ}
+    \renewcommand*{\phimix}{\bar\phi}
+    \renewcommand*{\allcomponents}[1]{\thermo at underline{#1}}
+    \renewcommand*{\IG}{{\text{IG}}}
+    \renewcommand*{\IGM}{{\text{IGM}}}
+    \renewcommand*{\IS}{{\text{IM}}}
+    \renewcommand*{\Deltamix}[1]{\Delta_\mixing #1}
+    \renewcommand*{\Deltarxn}[1]{\Delta_\reaction #1}
+    \renewcommand*{\Deltasub}[1]{\Delta_\sublimation #1}
+    \renewcommand*{\Deltafus}[1]{\Delta_\fusion #1}
+    \renewcommand*{\Deltavap}[1]{\Delta_\vaporization #1}
+    \renewcommand*{\Henryrat}{H}
+    \DeclareSubscrSymbol{cV}{\heatcapacitysymbol}{\volume at symbol}
+    \DeclareSubscrSymbol{cP}{\heatcapacitysymbol}{\pressure at symbol}
+    \DeclareSubscrSymbol{cVt}{\Nt\heatcapacitysymbol}{\volume at symbol}
+    \DeclareSubscrSymbol{cPt}{\Nt\heatcapacitysymbol}{\pressure at symbol}
+  }
+}
+\DeclareOption{SVNAS}{
+  \ExecuteOptions{extensive-superscript}
+  \AtEndOfPackage{
+    \renewcommand*{\allcomponents}[1]{#1}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}%
+      \else
+        {#3}_{#1}%
+      \fi
+    }
+    \renewcommand*{\IG}{{ig}}
+    \renewcommand*{\IGM}{{ig}}
+    \renewcommand*{\IS}{{id}}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\Deltarxn}[1]{\Delta #1}
+    \DeclareSubscrSymbol{cVt}{\Nt\heatcapacitysymbol}{\volume at symbol}
+    \DeclareSubscrSymbol{cPt}{\Nt\heatcapacitysymbol}{\pressure at symbol}
+  }
+}
+\DeclareOption{TesterModell}{
+  \ExecuteOptions{EUAGHaN,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\ncomponents}{n}
+    \renewcommand*{\allcomponents}[1]{{#1}_i}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_k\relax[#2]
+      \else
+        {#3}_{#1}\relax[#2]
+      \fi
+    }
+    \renewcommand*{\allbutlastand}[3][j]{%
+      \edef\tmp at arg{#1}%
+      \edef\tmp@@arg{#2}%
+      \ifx\tmp@@arg\ncomponents
+        {#3}_{#1}\relax[#2]%
+      \else
+        \ifx\tmp at arg\tmp@@arg
+          {#3}\relax[#2,\ncomponents]%
+        \else
+          {#3}\relax[#2,\ncomponents]%
+        \fi
+      \fi
+    }
+    \renewcommand*{\IG}{{ig}}
+% Tester & Modell never use "igm" anywhere, and I only found ig once
+    \renewcommand*{\IGM}{{igm}}
+    \renewcommand*{\IS}{{ID}}
+    \renewcommand*{\excess}{{EX}}%
+    \renewcommand*{\reaction}{{rx}}
+    \renewcommand*{\Henryrat}{f^{\ast\ast}}
+    \renewcommand*{\Henrymol}{f^\ast}
+    \renewcommand*{\gammarat}{\gamma^{\ast\ast}}
+    \renewcommand*{\gammamol}{\gamma^\ast}
+  }
+}
+\DeclareOption{Thompson}{
+  \ExecuteOptions{EUAGHAn,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\excess}{{EX}}
+    \renewcommand*{\residual}{{R}}
+    \renewcommand*{\allcomponents}[1]{{#1}_j}
+    \renewcommand*{\ncomponents}{c}
+    \renewcommand*{\IS}{{IS}}
+    \renewcommand*{\IG}{{IG}}
+    \let\IGM\IG
+    \def\@fpure_#1{f_{#1}\@ifnextchar^{}{^\bullet}}
+    \renewcommand*{\fpure}{\@ifnextchar_{\@fpure}{f}}
+    \def\@phi at pure_#1{\phi_{#1}\@ifnextchar^{}{^\bullet}}
+    \renewcommand*{\phipure}{\@ifnextchar_{\@phi at pure}{\phi}}
+    \renewcommand*{\mixing}{{MIX}}
+    \renewcommand*{\Deltamix}[1]{\Delta_\mixing #1}
+    \renewcommand*{\Deltarxn}[1]{\Delta #1}
+    \def\@@intensive_#1{_{#1}\@ifnextchar^{}{^\bullet}}
+    \newcommand*{\@intensive}[1]{#1\@ifnextchar_{\@@intensive}{}}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}\neq{#3}_{#2}%
+      \else
+        {#3}_{#1}\neq{#3}_{#2}%
+      \fi
+    }
+  }
+}
+%    \end{macrocode}
+% We execute the default options below.
+%    \begin{macrocode}
+\ExecuteOptions{EUAGHan,subscripts,parentheses,intensive-plain,moles-index}
+\ProcessOptions
+%    \end{macrocode}
+%
+% \subsection{Commands for Partial Derivatives}
+% The \cs{Partial} command and its second-order siblings are defined as below.
+% They typeset partial derivatives of the first argument with respect to
+% the second (and third, in the case of mixed second partial derivatives)
+% arguments, holding the last argument constant.
+%
+% The starred forms adjust the spacing after the partial derivative so the
+% trailing binary operator (assumed to be the same width as an equals sign)
+% overhangs the variables held constant.
+% We thus set \verb"operator at width" to be \emph{just} greater than the width of
+% an equals sign.
+%^^A 3/1/2022: changed adjust at width to 2pt (up from 1pt)
+%^^A 4/21/2022: changed adjust at width to 0.1\operator at width (from 2pt)
+%    \begin{macrocode}
+\newlength{\Partial at const@width}
+\newlength{\operator at width}
+\settowidth{\operator at width}{=}
+\newlength{\adjust at width}
+\setlength{\adjust at width}{0.1\operator at width}
+\addtolength{\operator at width}{\adjust at width}
+%    \end{macrocode}
+% \begin{macro}{\Partial*}
+% \begin{macro}{\Partial}
+% The command \cs{Partial} and its friends drastically simplify the creation
+% of partial derivatives. The command \cs{Partial*} is the same as
+% \cs{Partial} except that it adjusts the spacing so the (presumably) binary
+% operator that follows it slightly overlaps the subscripts.
+%    \begin{macrocode}
+\def\Partial at start{\left\PartialOpen}
+\def\Partial at end{\right\PartialClose}
+\def\Partial at empty@end{\right\PartialEmptyClose}
+\def\Partial{\@ifstar\Partial at star\Partial at nostar}
+%^^A Several ifs to use later (breaks it if these definitions are inside)
+\newif\iftwo at has@Nt
+\two at has@Ntfalse
+\newif\iftwo at has@xory
+\two at has@xoryfalse
+\newif\ifthree at has@Nt
+\three at has@Ntfalse
+\newif\ifthree at has@xory
+\three at has@xoryfalse
+\AtEndOfPackage{%
+  \edef\thermo at Nt{\Nt}%
+  \edef\thermo at x{x}%
+  \edef\thermo at y{y}%
+}
+\def\thermo at parse@two#1\relax{%
+  \@tfor\@i:=#1\do{%
+    \edef\@@i{\@i}%
+    \ifx\@@i\thermo at Nt
+      \two at has@Nttrue
+      \@break at tfor
+    \fi
+    \ifx\@@i\thermo at x
+      \two at has@xorytrue
+      \@break at tfor
+    \fi
+    \ifx\@@i\thermo at y
+      \two at has@xorytrue
+      \@break at tfor
+    \fi
+  }
+}
+\newcommand*{\Partial at nostar}[3]{%
+  \def\tmp at arg{#3}%
+  \if at subscripted
+    % Handles situation of empty variables held constant
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial #1}
+                                     {\partial #2}\Partial at empty@end}%
+    \else
+      \ensuremath{\Partial at start\frac{\partial #1}
+                                     {\partial #2}\Partial at end_{#3}}%
+    \fi
+  \else
+    % If not subscripted, we put the arguments (if any) in the derivative
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial #1}
+                                     {\partial #2}\Partial at empty@end}%
+    \else
+      % Check for whether #3 contains \allNsbut{i}/etc. and #2 is \Nt_i/etc.
+      \thermo at parse@two#2\relax
+      \iftwo at has@Nt
+        \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+        \ensuremath{\Partial at start\frac{\partial #1(#3)}
+                                       {\partial #2}\Partial at end}%
+      \else
+        \iftwo at has@xory
+          \renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+          \ensuremath{\Partial at start\frac{\partial #1(#3)}
+                                         {\partial #2}\Partial at end}%
+        \else
+          \ensuremath{\Partial at start\frac{\partial #1(#2,#3)}
+                                         {\partial #2}\Partial at end}%
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\newcommand*{\Partial at star}[3]{%
+  \settowidth{\Partial at const@width}{\ensuremath{#3}}%
+  \addtolength{\Partial at const@width}{-0.15\Partial at const@width}%
+  \Partial at nostar{#1}{#2}{#3}%
+  \if at subscripted
+    \ifdim\operator at width<\Partial at const@width
+      \kern -\operator at width
+    \else
+      \kern -\Partial at const@width
+    \fi
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PartialBigg}
+% \begin{macro}{\PartialBigg*}
+% The \cs{PartialBigg} macro (and its starred form) replace the \cs{left}
+% and \cs{right} commands in \cs{Partial} with \verb"amsmath"'s \cs{Biggl}
+% and \cs{Biggr} variants. The starred form is inherited from \cs{Partial}
+% without modification.
+%    \begin{macrocode}
+\def\PartialBigg{%
+  \def\Partial at start{\Biggl\PartialOpen}%
+  \def\Partial at end{\Biggr\PartialClose}%
+  \def\Partial at empty@end{\Biggr\PartialClose}%
+  \Partial%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\Partialbigg}
+% \begin{macro}{\Partialbigg*}
+% The \cs{Partialbigg} macro does the same thing as \cs{PartialBigg}, except
+% using \verb"amsmath"'s \cs{biggl}/\cs{biggr} variants.
+%    \begin{macrocode}
+\def\Partialbigg{%
+  \def\Partial at start{\biggl\PartialOpen}%
+  \def\Partial at end{\biggr\PartialClose}%
+  \def\Partial at empty@end{\biggr\PartialClose}%
+  \Partial%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PartialSecond}
+% \begin{macro}{\PartialSecond*}
+% The second partial derivatives are defined similarly to \cs{Partial}.
+%    \begin{macrocode}
+\def\PartialSecond{\@ifstar\PartialSecond at star\PartialSecond at nostar}
+\newcommand*{\PartialSecond at nostar}[3]{%
+  \def\tmp at arg{#3}%
+  \if at subscripted
+  % Handles situation of empty variables held constant
+    \ifx\tmp at arg\@empty
+        \ensuremath{\Partial at start\frac{\partial^2 #1}
+                                       {\partial #2^2}\Partial at empty@end}%
+    \else
+        \ensuremath{\Partial at start\frac{\partial^2 #1}
+                                       {\partial #2^2}\Partial at end_{#3}}%
+    \fi
+  \else
+    \ifx\tmp at arg\@empty
+        \ensuremath{\Partial at start\frac{\partial^2 #1}
+                                       {\partial #2^2}\Partial at empty@end}%
+    \else
+      % Check for whether #3 contains \allNsbut{i}/etc. and #2 is \Nt_i/etc.
+      \thermo at parse@two#2\relax
+      \iftwo at has@Nt
+        \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+        \ensuremath{\Partial at start\frac{\partial^2 #1(#3)}
+                                       {\partial #2^2}\Partial at end}%
+      \else
+        \iftwo at has@xory
+          \renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+          \ensuremath{\Partial at start\frac{\partial^2 #1(#3)}
+                                         {\partial #2^2}\Partial at end}%
+        \else
+          \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#3)}
+                                         {\partial {#2}^2}\Partial at end}%
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\newcommand*{\PartialSecond at star}[3]{%
+    \settowidth{\Partial at const@width}{\ensuremath{#3}}%
+    \addtolength{\Partial at const@width}{-0.15\Partial at const@width}%
+    \PartialSecond at nostar{#1}{#2}{#3}%
+    \if at subscripted
+      \ifdim\operator at width<\Partial at const@width
+        \kern -\operator at width
+      \else
+        \kern -\Partial at const@width
+      \fi
+    \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\PartialSecondBigg}
+% \begin{macro}{\PartialSecondBigg*}
+% The \cs{PartialSecondBigg} macro and its starred variant replace \cs{left}
+% and \cs{right} with \verb"amsmath"'s \cs{Biggl} and \cs{Biggr}.
+%    \begin{macrocode}
+\def\PartialSecondBigg{%
+  \def\Partial at start{\expandafter\Biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\Biggr\PartialClose}%
+  \PartialSecond%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\PartialSecondbigg}
+% \begin{macro}{\PartialSecondbigg*}
+% The \cs{PartialSecondbigg} macro and its starred variant replace \cs{left}
+% and \cs{right} with \verb"amsmath"'s \cs{biggl} and \cs{biggr}.
+%    \begin{macrocode}
+\def\PartialSecondbigg{%
+  \def\Partial at start{\expandafter\biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\biggr\PartialClose}%
+  \PartialSecond%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PartialMixSecond}
+% \begin{macro}{\PartialMixSecond*}
+% The macro \cs{PartialMixSecond} takes an extra argument, but is otherwise
+% the same as its same-variable cousin.
+%    \begin{macrocode}
+\def\PartialMixSecond{\@ifstar\PartialMixSecond at star\PartialMixSecond at nostar}
+\newcommand*{\PartialMixSecond at nostar}[4]{%
+  \def\tmp at arg{#4}%
+  \if at subscripted
+  % Handles situation of empty variables held constant
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial^2 #1}
+                           {\partial #2\partial#3}\Partial at empty@end}%
+    \else
+      \ensuremath{\Partial at start\frac{\partial^2 #1}
+                           {\partial #2\partial#3}\Partial at end_{#4}}%
+    \fi
+  \else
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#3)}
+                           {\partial #2\partial#3}\Partial at empty@end}%
+    \else
+      % This time, we check whether #2 OR #3 are \Nt_i/etc.
+      \thermo at parse@two#3\relax
+      \iftwo at has@Nt\three at has@Nttrue\fi
+      \iftwo at has@xory\three at has@xorytrue\fi
+      \two at has@Ntfalse
+      \two at has@xoryfalse
+      \thermo at parse@two#2\relax
+      \iftwo at has@Nt
+        \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+        \ensuremath{\Partial at start\frac{\partial^2 #1(#3,#4)}
+                                       {\partial #2\partial#3}\Partial at end}%
+      \else
+        \iftwo at has@xory
+          \renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+          \ensuremath{\Partial at start\frac{\partial^2 #1(#3,#4)}
+                                         {\partial #2\partial#3}\Partial at end}%
+        \else
+          \ifthree at has@Nt
+            \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+            \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#4)}
+                                      {\partial #2\partial#3}\Partial at end}%
+          \else
+            \ifthree at has@xory
+              \PackageWarning{thermodynamics}{GOT HERE}
+              %\renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+              \renewcommand*{\allbutlastand}[3][j]{SCREW YOU}%
+              \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#4)}
+                                        {\partial #2\partial#3}\Partial at end}%
+            \else
+              \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#3,#4)}
+                                        {\partial #2\partial#3}\Partial at end}%
+            \fi
+          \fi
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\newcommand*{\PartialMixSecond at star}[4]{%
+    \settowidth{\Partial at const@width}{\ensuremath{#4}}%
+    \addtolength{\Partial at const@width}{-0.25\Partial at const@width}%
+    \PartialMixSecond at nostar{#1}{#2}{#3}{#4}%
+    \if at subscripted
+      \ifdim\operator at width<\Partial at const@width
+        \kern -\operator at width
+      \else
+        \kern -\Partial at const@width
+      \fi
+    \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\PartialMixSecondBigg}
+% \begin{macro}{\PartialMixSecondBigg*}
+% \begin{macro}{\PartialMixSecondbigg}
+% \begin{macro}{\PartialMixSecondbigg*}
+% The macro \cs{PartialMixSecondBigg} and its starred form are analogous to
+% \cs{PartialBigg} and \cs{PartialSecondBigg}. \cs{PartialMixSecondbigg} and
+% its starred form are similarly analogous to \cs{Partialbigg} and
+% \cs{PartialSecondbigg}.
+%    \begin{macrocode}
+\def\PartialMixSecondBigg{%
+  \def\Partial at start{\expandafter\Biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\Biggr\PartialClose}%
+  \PartialMixSecond%
+}
+\def\PartialMixSecondbigg{%
+  \def\Partial at start{\expandafter\biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\biggr\PartialClose}%
+  \PartialMixSecond%
+}
+%    \end{macrocode}
+% If the user does not load the \verb"amsmath" package, we will not have access
+% to \cs{Biggl}, \cs{Biggr}, \cs{biggl}, and \cs{biggr}, so we revert them back
+% to the ordinary \cs{left} and \cs{right} versions and warn the user.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \@ifpackageloaded{amsmath}{}{%
+      \PackageWarningNoLine{thermodynamics}
+        {Package amsmath not loaded; load to make PartialBigg and friends
+            work correctly}%
+      \let\PartialBigg\Partial
+      \let\Partialbigg\Partial
+      \let\PartialSecondBigg\PartialSecond
+      \let\PartialSecondbigg\PartialSecond
+      \let\PartialMixSecondBigg\PartialMixSecond
+      \let\PartialMixSecondbigg\PartialMixSecond
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Local Override of Delimiters}
+% \begin{environment}{thermoparentheses}
+% \begin{environment}{thermobrackets}
+% \begin{environment}{thermobraces}
+% \begin{environment}{thermobar}
+% \begin{environment}{thermoplain}
+% We define seven environments that \emph{locally} override the delimiters on
+% partial derivatives generated with \cs{Partial} and friends and/or the
+% subscript notation for partial derivatives.
+%    \begin{macrocode}
+\newenvironment*{thermoparentheses}{
+  \renewcommand*{\PartialOpen}{(}%
+  \renewcommand*{\PartialClose}{)}%
+  \renewcommand*{\PartialEmptyClose}{)}%
+}{}
+\newenvironment*{thermobrackets}{%
+  \renewcommand*{\PartialOpen}{[}%
+  \renewcommand*{\PartialClose}{]}%
+  \renewcommand*{\PartialEmptyClose}{]}%
+}{}
+\newenvironment*{thermobraces}{%
+  \renewcommand*{\PartialOpen}{\{}%
+  \renewcommand*{\PartialClose}{\}}%
+  \renewcommand*{\PartialEmptyClose}{\}}%
+}{}
+\newenvironment*{thermobar}{%
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{\rvert}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+}{}
+\newenvironment*{thermoplain}{%
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{.}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+  \@subscriptedfalse
+}{}
+\newenvironment*{thermoNOsubscripts}{\@subscriptedfalse}{}
+\newenvironment*{thermosubscripts}{\@subscriptedtrue}{}
+%    \end{macrocode}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+%
+% \subsection{User-Interface Macros to Define Symbols}
+% \begin{macro}{\DeclareSubscrSymbol}
+% First, we define a (messy!)\ command that serves to create ``subscripted''
+% symbols; for example, typing \verb"\cP_i" should yield $C_{P,i}$ rather
+% than $C_{Pi}$, ${C_P}_i$, or ${C_{P_i}}$. Superscripts are also handled
+% properly and can be in either order.
+%    \begin{macrocode}
+\newcommand*{\DeclareSubscrSymbol}[3]{%
+  \expandafter\def\csname #1\endcsname{%
+    \@ifnextchar^{\csname @#1\endcsname}
+                 {\@ifnextchar_{\csname @@#1\endcsname}{{#2}_{#3}}}
+  }
+  \expandafter\def\csname @#1\endcsname ##1##2{%
+    {#2}^{##2}\@ifnextchar_{\csname @@@#1\endcsname}{_{#3}}%
+  }
+  \expandafter\def\csname @@#1\endcsname ##1##2{{#2}_{#3,##2}}
+  \expandafter\def\csname @@@#1\endcsname ##1##2{_{#3,##2}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\heatcapacitysymbol}
+% \begin{macro}{\compressibilitysymbol}
+% \begin{macro}{\expansivitysymbol}
+% Now we define symbols for the heat capacities, compressibilities, and
+% so forth.
+%    \begin{macrocode}
+\newcommand*{\heatcapacitysymbol}{C}
+\newcommand*{\compressibilitysymbol}{\kappa}
+\newcommand*{\expansivitysymbol}{\alpha}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\cV}
+% \begin{macro}{\cP}
+% The heat capacities are molar by default; we also declare extensive and
+% specific heat capacities.
+% The heat capacities themselves are defined to be ``smart'': \verb"\cV_i" will
+% recognize the subscript appropriately and render $C_{V,i}$ rather than
+% ${C_V}_i$ or some other unintended symbol. Superscripts are also handled
+% appropriately and can be in either order.
+%    \begin{macrocode}
+\DeclareSubscrSymbol{cV}{\@intensive\heatcapacitysymbol}{\volume at symbol}
+\DeclareSubscrSymbol{cP}{\@intensive\heatcapacitysymbol}{\pressure at symbol}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\cVt}
+% \begin{macro}{\cPt}
+% We also introduce \emph{extensive} (rather than molar) heat capacity macros.
+%    \begin{macrocode}
+\DeclareSubscrSymbol{cVt}{\@extensive\heatcapacitysymbol}{\volume at symbol}
+\DeclareSubscrSymbol{cPt}{\@extensive\heatcapacitysymbol}{\pressure at symbol}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\cPs}
+% \begin{macro}{\cVs}
+% \cs{cPs} and \cs{cVs} are the specific heat capacities.
+%    \begin{macrocode}
+\DeclareSubscrSymbol{cVs}{\@specific\heatcapacitysymbol}{\volume at symbol}
+\DeclareSubscrSymbol{cPs}{\@specific\heatcapacitysymbol}{\pressure at symbol}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\kappaT}
+% \begin{macro}{\kappaS}
+% The isothermal and adiabatic compressibilities are defined similarly, but
+% those do not have extensive versions for obvious reasons.
+%    \begin{macrocode}
+\DeclareSubscrSymbol{kappaT}{\compressibilitysymbol}{\temperature at symbol}
+\DeclareSubscrSymbol{kappaS}{\compressibilitysymbol}{\entropy at symbol}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\alphaP}
+% \begin{macro}{\alphaS}
+% The macro \cs{alphaP} is intended to refer to the isobaric volume
+% expansivity, while \cs{alphaS} is the isentropic volume expansivity.
+%    \begin{macrocode}
+\DeclareSubscrSymbol{alphaP}{\expansivitysymbol}{\pressure at symbol}
+\DeclareSubscrSymbol{alphaS}{\expansivitysymbol}{\entropy at symbol}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Psat}
+% \begin{macro}{\Pvap}
+% The \cs{Psat} macro (and its clone, the \cs{Pvap} macro) should be used for
+% the saturation pressure.
+% \begin{macro}{\phisat}
+% \begin{macro}{\fsat}
+% \begin{macro}{\sat}
+% Similarly, a \cs{phisat} macro typesets the fugacity coefficient at
+% saturation. The \cs{fsat} macro similarly renders the fugacity at saturation.
+% Other saturation properties should use \verb"M^\sat" or similar, preferably
+% by defining another macro such as \verb"\Gmsat".
+%    \begin{macrocode}
+\newcommand*{\sat}{{\text{sat}}}
+\newcommand*{\Psat}{P^\sat}
+\let\Pvap\Psat
+\newcommand*{\phisat}{\phi^\sat}
+\newcommand*{\fsat}{f^\sat}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{std}
+% \begin{macro}{Pstd}
+% \begin{macro}{fstd}
+% The \cs{std} macro denotes standard properties. \cs{Pstd} and \cs{fstd} are
+% defined for convenience and for consistency across textbooks.
+%    \begin{macrocode}
+\let\std\circ
+\newcommand*{\Pstd}{P^\std}
+\newcommand*{\fstd}{f^\std}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Deltamix}
+% \begin{macro}{\mixing}
+% Mixing properties, such as $\Delta G_\text{mix}$, should be accessed using
+% \verb"\Deltamix\Gm" and similar constructions---this construct will typeset
+% as $\Delta_{MIX}G$ using the \verb"Thompson" package option, for example,
+% and as $\Delta_\text{mix}G$ using the \verb"Sandler" package option.
+%    \begin{macrocode}
+\newcommand*{\mixing}{{\text{mix}}}
+\newcommand*{\Deltamix}[1]{\Delta{#1}_\mixing}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Deltafus}
+% \begin{macro}{\fusion}
+% \begin{macro}{\Deltavap}
+% \begin{macro}{\vaporization}
+% \begin{macro}{\Deltasub}
+% \begin{macro}{\sublimation}
+% \begin{macro}{\Deltarxn}
+% \begin{macro}{\reaction}
+% Similar entities for property changes on fusion, reaction, sublimation, and
+% vaporization are defined. The heat of reaction is handled differently if
+% \cs{cP} is its argument: one must typeset $\Delta C_{P,\text{rxn}}$ and
+% $\Delta C_{P,\text{rxn}}^\circ$ rather than
+% $\Delta{C_P}_\text{rxn}$ and $\Delta{C_P}^\circ_\text{rxn}$.
+%    \begin{macrocode}
+\newcommand*{\fusion}{{\text{fus}}}
+\newcommand*{\reaction}{{\text{rxn}}}
+\newcommand*{\sublimation}{{\text{sub}}}
+\newcommand*{\vaporization}{{\text{vap}}}
+\newcommand*{\formation}{f}
+\newcommand*{\Deltafus}[1]{\Delta{#1}^\fusion}
+\newcommand*{\Deltasub}[1]{\Delta{#1}^\sublimation}
+\newcommand*{\Deltavap}[1]{\Delta{#1}^\vaporization}
+% TODO It would be nice not to have to handle \cP in a special way....
+\let\Delta at rxn@sym\relax
+\DeclareSubscrSymbol{@DeltarxncP}{\Delta at rxn@sym}{\pressure at symbol,\reaction}
+\DeclareSubscrSymbol{@Deltarxn}{\Delta at rxn@sym}{\reaction}
+\newcommand*{\Deltarxn}[1]{%
+    \def\tmp at arg{#1}%
+    \def\tmp@@arg{\cP}%
+    \ifx\tmp at arg\tmp@@arg\relax
+      \def\@command{\def\Delta at rxn@sym{\Delta\@intensive\heatcapacitysymbol}%
+                    \@DeltarxncP}
+    \else
+      \def\@command{\def\Delta at rxn@sym{\Delta{#1}}\@Deltarxn}
+    \fi
+    \@command
+}
+\let\Delta at f@sym\relax
+\DeclareSubscrSymbol{@Deltaf}{\Delta at f@sym}{f}
+\newcommand*{\Deltaf}[1]{\def\Delta at f@sym{\Delta{#1}}\@Deltaf}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fmix}
+% The \cs{fmix} command is intended to describe fugacities in mixtures.
+% It renders as $\hat f$ by default, and would be used as \verb"\fmix_i" or
+% the like, producing $\hat f_i$; some authors like to use $\bar f_i$ or
+% just $f_i$, and this command creates a consistent way to change between
+% such options.
+%    \begin{macrocode}
+\newcommand*{\fmix}{\hat{f}}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\phimix}
+% A similar command, \cs{phimix}, renders $\hat\phi$ by default to represent
+% the fugacity coefficient in the mixture.
+%    \begin{macrocode}
+\newcommand*{\phimix}{\hat\phi}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fpure}
+% The \cs{fpure} command is intended to describe fugacities in pure substances.
+% It renders as $f$ by default, and would be used as \verb"\fpure" or
+% \verb"\fpure_i" or the like, producing $f_i$; some authors like to use
+% $f_{\text{pure},i}$, and others like to use $f_i^\bullet$; this command
+% creates a consistent way to change between the these options. A similar
+% command for $\phi$ is given, \cs{phipure}, for fugacity coefficients.
+%    \begin{macrocode}
+\newcommand*{\fpure}{f}
+\let\phipure\phi
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Partial Molar Quantities}
+% \begin{macro}{\partialmolar}
+% Partial molar quantities appear as $\thermooverline{G_i}$ or,
+% for residual properties, $\thermooverline{G_i^R}$, rather than something like
+% $\thermooverline{G}_i$ or $\thermooverline{G}_i^R$, which looks better but
+% is harder to implement for obvious reasons. Their definitions allow them to
+% be used as symbols, something like \verb"\Gpm_i", \verb"\Gpm^{\IGM}_i",
+% \verb"\Gpm^{\IGM}_i", and even \verb"\Gpm_i^{\IGM}";
+% they can also be treated as commands: \verb"\Gpm{i}" is equivalent to
+% \verb"\Gpm_i" and \verb"\Gpm[\IGM]{i}" is equivalent to \verb"\Gpm_i^{\IGM}".
+% The macro \cs{partialmolar} can be used to create an arbitrary partial
+% molar symbol.
+%    \begin{macrocode}
+\let\pm at symbol\relax
+\newcommand*{\partialmolar}[1]{\gdef\pm at symbol{#1}\generic at pm}
+% if nextchar is _
+\def\generic at pm{\@ifnextchar_\@generic at pm\@@generic at pm}
+% then store the argument
+\def\@generic at pm#1#2{%
+    \gdef\pm at arg{#2}%
+    % if nextchar after argument is ^
+    \@ifnextchar^\@@@generic at pm\@@@@generic at pm
+}
+% then print it this way
+\def\@@@generic at pm#1#2{\thermo at overline{\pm at symbol^{#2}_{\pm at arg}}}
+% else do it this way
+\def\@@@@generic at pm{\thermo at overline{\pm at symbol_{\pm at arg}}}
+% else, check whether there is also a ^ coming, otherwise assume
+% it's [] or {}
+\def\@@generic at pm{\@ifnextchar^\@@@@@generic at pm\@pm at bracket@check}
+\def\@@@@@generic at pm#1#2#3#4{\thermo at overline{\pm at symbol^{#2}_{#4}}}
+\def\@pm at bracket@check{\@ifnextchar[\@pm at bracket@yes\@pm at bracket@no}
+\def\@pm at bracket@yes[#1]#2{\thermo at overline{\pm at symbol^{#1}_{#2}}}
+\def\@pm at bracket@no#1{\thermo at overline{\pm at symbol_{#1}}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Symbol Definitions}
+% These macros define the user interface to the symbols for energy, volume,
+% and so forth. We define the ``extra'' symbols \cs{Bt} and \cs{Mt} to
+% represent arbitrary properties.
+% \begin{macro}{\Nt}
+% \begin{macro}{\Et}
+% \begin{macro}{\Ut}
+% \begin{macro}{\Ft}
+% \begin{macro}{\Gt}
+% \begin{macro}{\Ht}
+% \begin{macro}{\Lt}
+% \begin{macro}{\At}
+% \begin{macro}{\St}
+% \begin{macro}{\Vt}
+% \begin{macro}{\Qt}
+% \begin{macro}{\Wt}
+% \begin{macro}{\Mt}
+% \begin{macro}{\Bt}
+% \penalty-600%
+% First, the extensive properties.
+%    \begin{macrocode}
+\newcommand*{\Nt}{\mole at symbol}
+\newcommand*{\Et}{\@extensive\totalenergy at symbol}
+\newcommand*{\Ut}{\@extensive\internalenergy at symbol}
+\newcommand*{\Ft}{\@extensive\Helmholtz at symbol}
+\newcommand*{\Gt}{\@extensive\Gibbs at symbol}
+\newcommand*{\Ht}{\@extensive\enthalpy at symbol}
+\newcommand*{\Lt}{\@extensive\Landau at symbol}
+\newcommand*{\At}{\@extensive\area at symbol}
+\newcommand*{\St}{\@extensive\entropy at symbol}
+\newcommand*{\Vt}{\@extensive\volume at symbol}
+\newcommand*{\Qt}{\@extensive\heat at symbol}
+\newcommand*{\Wt}{\@extensive\work at symbol}
+\newcommand*{\Mt}{\@extensive M}
+\newcommand*{\Bt}{\@extensive B}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Em}
+% \begin{macro}{\Um}
+% \begin{macro}{\Fm}
+% \begin{macro}{\Gm}
+% \begin{macro}{\Hm}
+% \begin{macro}{\Lm}
+% \begin{macro}{\Am}
+% \begin{macro}{\Sm}
+% \begin{macro}{\Vm}
+% \begin{macro}{\Qm}
+%^^A \penalty-600%
+% Then the molar properties.
+%    \begin{macrocode}
+\newcommand*{\Em}{\@intensive\totalenergy at symbol}
+\newcommand*{\Um}{\@intensive\internalenergy at symbol}
+\newcommand*{\Fm}{\@intensive\Helmholtz at symbol}
+\newcommand*{\Gm}{\@intensive\Gibbs at symbol}
+\newcommand*{\Hm}{\@intensive\enthalpy at symbol}
+\newcommand*{\Lm}{\@intensive\Landau at symbol}
+\newcommand*{\Am}{\@intensive\area at symbol}
+\newcommand*{\Sm}{\@intensive\entropy at symbol}
+\newcommand*{\Vm}{\@intensive\volume at symbol}
+\newcommand*{\Qm}{\@intensive\heat at symbol}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\Wm}
+% \begin{macro}{\Mm}
+% \begin{macro}{\Bm}
+% More molar properties.
+%    \begin{macrocode}
+\newcommand*{\Wm}{\@intensive\work at symbol}
+\newcommand*{\Mm}{\@intensive M}
+\newcommand*{\Bm}{\@intensive B}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Es}
+% \begin{macro}{\Us}
+% \begin{macro}{\Fs}
+% \begin{macro}{\Gs}
+% \begin{macro}{\Hs}
+% \begin{macro}{\Ls}
+% \begin{macro}{\As}
+% \begin{macro}{\Ss}
+% \begin{macro}{\Vs}
+% \begin{macro}{\Qs}
+% \begin{macro}{\Ws}
+% \begin{macro}{\Ms}
+% \begin{macro}{\Bs}
+% \penalty-600%
+% Now the specific (per unit mass) properties.
+%    \begin{macrocode}
+\newcommand*{\Us}{\@specific\internalenergy at symbol}
+\newcommand*{\Es}{\@specific\totalenergy at symbol}
+\newcommand*{\Fs}{\@specific\Helmholtz at symbol}
+\newcommand*{\Gs}{\@specific\Gibbs at symbol}
+\newcommand*{\Hs}{\@specific\enthalpy at symbol}
+\newcommand*{\Ls}{\@specific\Landau at symbol}
+\newcommand*{\As}{\@specific\area at symbol}
+\newcommand*{\Ss}{\@specific\entropy at symbol}
+\newcommand*{\Vs}{\@specific\volume at symbol}
+\newcommand*{\Qs}{\@specific\heat at symbol}
+\newcommand*{\Ws}{\@specific\work at symbol}
+\newcommand*{\Ms}{\@specific M}
+\newcommand*{\Bs}{\@specific B}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Epm}
+% \begin{macro}{\Upm}
+% \begin{macro}{\Hpm}
+% \begin{macro}{\Fpm}
+% \begin{macro}{\Gpm}
+% \begin{macro}{\Apm}
+% \begin{macro}{\Spm}
+% \begin{macro}{\Vpm}
+% \begin{macro}{\Lpm}
+% \begin{macro}{\Mpm}
+% \begin{macro}{\Bpm}
+% Now the partial molar properties.
+%    \begin{macrocode}
+\newcommand*{\Epm}{\partialmolar{\totalenergy at symbol}}
+\newcommand*{\Upm}{\partialmolar{\internalenergy at symbol}}
+\newcommand*{\Hpm}{\partialmolar{\enthalpy at symbol}}
+\newcommand*{\Fpm}{\partialmolar{\Helmholtz at symbol}}
+\newcommand*{\Gpm}{\partialmolar{\Gibbs at symbol}}
+\newcommand*{\Apm}{\partialmolar{\area at symbol}}
+\newcommand*{\Spm}{\partialmolar{\entropy at symbol}}
+\newcommand*{\Vpm}{\partialmolar{\volume at symbol}}
+\newcommand*{\Lpm}{\partialmolar{\Omega}}
+\newcommand*{\Mpm}{\partialmolar{M}}
+\newcommand*{\Bpm}{\partialmolar{B}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cPpm}
+% \begin{macro}{\cVpm}
+% Partial molar heat capacities are \emph{hard}, but the following
+% implementation seems to work flawlessly\dots so far.
+%    \begin{macrocode}
+\newcommand*{\cPpm}{%
+  \def\@@@generic at pm##1##2{%
+    \thermo at overline{\pm at symbol^{##2}_{\pressure at symbol,\pm at arg}}}%
+  \def\@@@@generic at pm{\thermo at overline{\pm at symbol_{\pressure at symbol,\pm at arg}}}%
+  \def\@@@@@generic at pm##1##2##3##4{%
+    \thermo at overline{\pm at symbol^{##2}_{\pressure at symbol,##4}}}%
+  \def\@pm at bracket@yes[##1]##2{%
+    \thermo at overline{\pm at symbol^{##1}_{\pressure at symbol,##2}}}%
+  \def\@pm at bracket@no##1{\thermo at overline{\pm at symbol_{\pressure at symbol,##1}}}%
+  \partialmolar{\heatcapacitysymbol}%
+}
+\newcommand*{\cVpm}{%
+  \def\@@@generic at pm##1##2{%
+    \thermo at overline{\pm at symbol^{##2}_{\volume at symbol,\pm at arg}}}%
+  \def\@@@@generic at pm{\thermo at overline{\pm at symbol_{\volume at symbol,\pm at arg}}}%
+  \def\@@@@@generic at pm##1##2##3##4{%
+    \thermo at overline{\pm at symbol^{##2}_{\volume at symbol,##4}}}%
+  \def\@pm at bracket@yes[##1]##2{%
+    \thermo at overline{\pm at symbol^{##1}_{\volume at symbol,##2}}}%
+  \def\@pm at bracket@no##1{\thermo at overline{\pm at symbol_{\volume at symbol,##1}}}%
+  \partialmolar{\heatcapacitysymbol}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Residual and Excess Properties}
+% \begin{macro}{\residual}
+% \begin{macro}{\excess}
+% Macros are defined for residual properties (departure from non-ideal gases)
+% and excess properties (departure from ideal solutions). We begin with two
+% macros to use for defining generic residual and excess properties that are
+% not already defined.
+%    \begin{macrocode}
+\newcommand*{\residual}{R}
+\newcommand*{\excess}{E}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UR}
+% \begin{macro}{\HR}
+% \begin{macro}{\FR}
+% \begin{macro}{\GR}
+% \begin{macro}{\VR}
+% \begin{macro}{\SR}
+% The ordinary residual properties are molar.
+%    \begin{macrocode}
+\newcommand*{\UR}{\Um^\residual}
+\newcommand*{\HR}{\Hm^\residual}
+\newcommand*{\FR}{\Fm^\residual}
+\newcommand*{\GR}{\Gm^\residual}
+\newcommand*{\VR}{\Vm^\residual}
+\newcommand*{\SR}{\Sm^\residual}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% 
+% \pagebreak[3]%
+% \begin{macro}{\URt}
+% \begin{macro}{\HRt}
+% \begin{macro}{\FRt}
+% \begin{macro}{\GRt}
+% \begin{macro}{\VRt}
+% \begin{macro}{\SRt}
+% We define similar macros for the extensive residual properties. These are
+% appended by a \verb"t" (for ``total'').
+%    \begin{macrocode}
+\newcommand*{\URt}{\Ut^\residual}
+\newcommand*{\HRt}{\Ht^\residual}
+\newcommand*{\FRt}{\Ft^\residual}
+\newcommand*{\GRt}{\Gt^\residual}
+\newcommand*{\VRt}{\Vt^\residual}
+\newcommand*{\SRt}{\St^\residual}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\URs}
+% \begin{macro}{\HRs}
+% \begin{macro}{\FRs}
+% \begin{macro}{\GRs}
+% \begin{macro}{\VRs}
+% \begin{macro}{\SRs}
+% Similar macros are declared for the specific residual properties.
+% These are appended by an \verb"s".
+%    \begin{macrocode}
+\newcommand*{\URs}{\Us^\residual}
+\newcommand*{\HRs}{\Hs^\residual}
+\newcommand*{\FRs}{\Fs^\residual}
+\newcommand*{\GRs}{\Gs^\residual}
+\newcommand*{\VRs}{\Vs^\residual}
+\newcommand*{\SRs}{\Ss^\residual}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \penalty-500
+% \begin{macro}{\URpm}
+% \begin{macro}{\HRpm}
+% \begin{macro}{\FRpm}
+% \begin{macro}{\GRpm}
+% \begin{macro}{\VRpm}
+% \begin{macro}{\SRpm}
+% Now for the partial molar residual properties.
+% These are appended by \verb"pm".
+%    \begin{macrocode}
+\newcommand*{\URpm}{\partialmolar{\internalenergy at symbol^\residual}}
+\newcommand*{\HRpm}{\partialmolar{\enthalpy at symbol^\residual}}
+\newcommand*{\FRpm}{\partialmolar{\Helmholtz at symbol^\residual}}
+\newcommand*{\GRpm}{\partialmolar{\Gibbs at symbol^\residual}}
+\newcommand*{\VRpm}{\partialmolar{\volume at symbol^\residual}}
+\newcommand*{\SRpm}{\partialmolar{\entropy at symbol^\residual}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UE}
+% \begin{macro}{\HE}
+% \begin{macro}{\FE}
+% \begin{macro}{\GE}
+% \begin{macro}{\VE}
+% \begin{macro}{\SE}
+% Now for the excess molar properties.
+%    \begin{macrocode}
+\newcommand*{\UE}{\Um^\excess}
+\newcommand*{\FE}{\Fm^\excess}
+\newcommand*{\HE}{\Hm^\excess}
+\newcommand*{\GE}{\Gm^\excess}
+\newcommand*{\SE}{\Sm^\excess}
+\newcommand*{\VE}{\Vm^\excess}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UEt}
+% \begin{macro}{\HEt}
+% \begin{macro}{\FEt}
+% \begin{macro}{\GEt}
+% \begin{macro}{\VEt}
+% \begin{macro}{\SEt}
+% Similarly, the extensive excess properties.
+%    \begin{macrocode}
+\newcommand*{\UEt}{\Ut^\excess}
+\newcommand*{\FEt}{\Ft^\excess}
+\newcommand*{\HEt}{\Ht^\excess}
+\newcommand*{\GEt}{\Gt^\excess}
+\newcommand*{\SEt}{\St^\excess}
+\newcommand*{\VEt}{\Vt^\excess}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UEs}
+% \begin{macro}{\HEs}
+% \begin{macro}{\FEs}
+% \begin{macro}{\GEs}
+% \begin{macro}{\VEs}
+% \begin{macro}{\SEs}
+% Now for the specific excess properties.
+%    \begin{macrocode}
+\newcommand*{\UEs}{\Us^\excess}
+\newcommand*{\FEs}{\Fs^\excess}
+\newcommand*{\HEs}{\Hs^\excess}
+\newcommand*{\GEs}{\Gs^\excess}
+\newcommand*{\SEs}{\Ss^\excess}
+\newcommand*{\VEs}{\Vs^\excess}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \pagebreak[3]%
+% \begin{macro}{\UEpm}
+% \begin{macro}{\HEpm}
+% \begin{macro}{\FEpm}
+% \begin{macro}{\GEpm}
+% \begin{macro}{\VEpm}
+% \begin{macro}{\SEpm}
+% Finally, the excess partial molar quantities.
+%    \begin{macrocode}
+\newcommand*{\UEpm}{\partialmolar{\internalenergy at symbol^\excess}}
+\newcommand*{\HEpm}{\partialmolar{\enthalpy at symbol^\excess}}
+\newcommand*{\FEpm}{\partialmolar{\Helmholtz at symbol^\excess}}
+\newcommand*{\GEpm}{\partialmolar{\Gibbs at symbol^\excess}}
+\newcommand*{\VEpm}{\partialmolar{\volume at symbol^\excess}}
+\newcommand*{\SEpm}{\partialmolar{\entropy at symbol^\excess}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\prodall}
+% \begin{macro}{\sumall}
+% \begin{macro}{\sumallbutlast}
+% The \cs{sumall} command and its cousin, \cs{sumallbutlast}, simplify the
+% typesetting of commonly-used sums; the command \cs{prodall} does the same
+% thing for products, viz.,
+% \begin{verbatim}
+%   \[ \sumall_i x_i = 1 \qquad \sumallbutlast_i x_i = 1 - x_\ncomponents
+%       \qquad K = \exp\left(\frac{-\Deltarxn\Gm^\std}{RT}\right)
+%                = \prodall_i a_i^{\nu_i} \]
+%\end{verbatim}
+% gives
+%   \[ \sum_{i=1}^C x_i = 1 \qquad \sum_{i=1}^{C-1} x_i = 1 - x_C \qquad
+%      K = \exp\left(\frac{-\Delta G_\text{rxn}^\circ}{RT}\right)
+%        = \prod_{i=1}^C a_i^{\nu_i} \]
+%    \begin{macrocode}
+\newcommand*{\sumall}{\@ifnextchar_\@sumall\@@sumall}
+\def\@sumall#1#2{\sum_{#2=1}^{\ncomponents}}
+\def\@@sumall#1{\sum_{#1=1}^{\ncomponents}}
+\newcommand*{\sumallbutlast}{\@ifnextchar_\@sumallbutlast\@@sumallbutlast}
+\def\@sumallbutlast#1#2{\sum_{#2=1}^{\ncomponents-1}}
+\def\@@sumallbutlast#1{\sum_{#1=1}^{\ncomponents-1}}
+\newcommand*{\prodall}{\@ifnextchar_\@prodall\@@prodall}
+\def\@prodall#1#2{\prod_{#2=1}^{\ncomponents}}
+\def\@@prodall#1{\prod_{#1=1}^{\ncomponents}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\IG}
+% \begin{macro}{\IGM}
+% \begin{macro}{\IS}
+% The \cs{IG}, \cs{IGM}, and \cs{IS} macros (meaning ``ideal gas,'' ``ideal
+% gas mixture,'' and ``ideal solution,'' respectively) should be used to
+% make clean transitions between textbooks---some use ``IM'' rather than ``IS''
+% for example.
+%    \begin{macrocode}
+\newcommand*{\IG}{{\text{IG}}}
+\newcommand*{\IGM}{{\text{IGM}}}
+\newcommand*{\IS}{{\text{IS}}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Henryrat}
+% \begin{macro}{\Henrymol}
+% The Henry's Law constants for the rational basis ($y_i P = x_i h_i$) and
+% the molal basis ($y_i P = C_i \mathcal{H}_i$) are given by the macros
+% \cs{Henryrat} and \cs{Henrymol}, respectively. Using them this way
+% consistently allows for easy switching back and forth.
+%    \begin{macrocode}
+\newcommand*{\Henryrat}{h}
+\newcommand*{\Henrymol}{{\mathcal{H}}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\gammarat}
+% \begin{macro}{\gammamol}
+% The ordinary activity coefficient is universally denoted $\gamma$, so I
+% have not defined a special macro for that. However, the Henry's Law activity
+% coefficients are far from universal, so I have defined macros to make their
+% use consistent. The defaults render \cs{gammarat} as $\gamma^\ast$ and
+% \cs{gammamol} as $\gamma^\square$.
+% \cs{gammamol} will use \cs{square} from packages if it is defined; if not,
+% it ``fakes it'' with the definition below (based on the \textsf{amsthm}
+% package).
+%^^A Code for \square ripped off from amsthm.sty with tweaks
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \providecommand*{\square}{%
+    \text{\leavevmode
+      \hbox to.77778em{%
+      \hfil\vrule
+      \vbox to.6em{\hrule width.6em\vfil\hrule}%
+      \vrule\hfil}%
+    }%
+  }%
+}
+\newcommand*{\gammarat}{\gamma^\ast}
+\newcommand*{\gammamol}{\gamma^\square}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{Jacobian}
+% The \cs{Jacobian} command typesets the Jacobian, viz.,
+% \begin{verbatim}
+% \[ \Jacobian{K}{L}{X}{Y} =
+%   \begin{vmatrix}
+%     \displaystyle \Partial{K}{X}{Y} & \displaystyle \Partial{K}{Y}{X}
+%   \\[2ex]
+%     \displaystyle \Partial{L}{X}{Y} & \displaystyle \Partial{L}{Y}{X}
+%   \end{vmatrix}
+% \]
+%\end{verbatim}
+% produces
+% \[ \left(\frac{\partial(K,L)}{\partial(X,Y)}\right) =
+%   \begin{vmatrix}
+%     \displaystyle \left(\frac{\partial K}{\partial X}\right)_Y
+%     & \displaystyle \left(\frac{\partial K}{\partial Y}\right)_X \\[2ex]
+%     \displaystyle \left(\frac{\partial L}{\partial X}\right)_Y
+%     & \displaystyle \left(\frac{\partial L}{\partial Y}\right)_X
+%   \end{vmatrix}
+% \]
+% This macro is defined purely for convenience.
+%    \begin{macrocode}
+\newcommand*{\Jacobian}[4]{\frac{\partial{(#1,#2)}}{\partial{(#3,#4)}}}%
+%    \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</package>
+%<*example>
+\documentclass{article}
+\usepackage[margin=1in]{geometry}
+\usepackage{amsmath,amssymb}
+\usepackage{thermodynamics}
+\title{Examples to Accompany the \textsf{thermodynamics} Package}
+\author{Karl D. Hammond}
+\date{}
+\begin{document}
+\maketitle\noindent
+The combined laws:
+\begin{align*}
+  d\Et &= d\Ut + d\left(\frac12 m v^2\right) - d(m\phi) \\
+  d\Ut &= \dbar\Qt + \dbar\Wt + \Um d\Nt
+        = \dbar\Qt - P d\Vt + \Hm d\Nt
+    \\ &= \Partial*{\Ut}{\St}{\Vt,\allNs} d\St
+        + \Partial*{\Ut}{\Vt}{\St,\allNs} d\Vt
+        + \sumall_i \Partial*{\Ut}{\Nt_i}{\Vt,\St,\allNsbut{i}} d\Nt_i
+    \\ &= T d\St - P d\Vt + \sumall_i \mu_i d\Nt_i
+\end{align*}
+With surfaces present:
+\begin{gather*}
+   d\Ut = T d\St - P d\Vt  + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Ht = T d\St + \Vt dP  + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Ft = -\St dT - P d\Vt + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Gt = -\St dT + \Vt dP + \sigma d\At + \sumall_i \mu_i d\Nt_i \\
+   d\Lt = -\St dT - P d\Vt + \sigma d\At - \sumall_i \Nt_i d\mu_i \\
+    \Bt = \Ut + P\Vt - T\St - \sigma\At \\
+   d\Bt = -\St dT + \Vt dP - \At d\sigma + \sumall_i \mu_i d\Nt_i \\
+   \mu_i = \Bpm_i = \Gpm_i + \sigma \Apm_i
+\end{gather*}
+Some Maxwell reciprocity relations:
+\begin{gather*}
+  \Partial*{\Vt}{T}{P,\allNs}
+    = \PartialMixSecond*{\Gt}{T}{P}{\allNs}
+    = \PartialMixSecond*{\Gt}{P}{T}{\allNs}
+    = -\Partial{\St}{P}{T,\allNs}
+\\
+    \Partial*{\Gpm_i}{T}{P,\allXs}
+    = \PartialMixSecond*{\Gt}{T}{\Nt_i}{P,\allNsbut{i}}
+    = \PartialMixSecond*{\Gt}{\Nt_i}{T}{P,\allNsbut{i}}
+    = -\Partial*{\St}{\Nt_i}{T,P,\allNsbut{i}}
+    = -\Spm_i
+\end{gather*}
+The heat capacities:
+\begin{gather*}
+  \cV = T \Partial*{\Sm}{T}{\Vm,\allXs} = \Partial*{\Um}{T}{\Vm,\allXs}
+      = -T\PartialSecond{\Fm}{T}{\Vm,\allXs}
+  \\
+  \cP^\IGM = T \Partial*{\Sm^\IGM}{T}{P,\allYs}
+           = \Partial*{\Hm^\IGM}{T}{P,\allYs}
+    \begin{thermobrackets}
+      = -T\PartialSecond{\Gm^\IGM}{T}{P,\allYs}
+    \end{thermobrackets}
+  \\
+  \cVt = T \Partial*{\St}{T}{\Vt,\allNs} = \Partial*{\Ut}{T}{\Vt,\allNs}
+    \begin{thermobraces}
+       = -T\PartialSecond{\Ft}{T}{\Vm,\allNs}
+    \end{thermobraces}
+  \\
+    \begin{thermobar}
+  \cPt = T \Partial*{\St}{T}{P,\allNs} = \Partial*{\Ht}{T}{P,\allNs}
+       = -T\PartialSecond{\Gt}{T}{P,\allNs}
+    \end{thermobar}
+  \\
+  \cVs = T \Partial*{\Ss}{T}{\Vs,\allWs} = \Partial*{\Us}{T}{\Vs,\allWs}
+    \begin{thermoplain}
+       = -T\PartialSecond{\Fs}{T}{\Vs,\allWs}
+    \end{thermoplain}
+  \\
+  \cPs = T \Partialbigg*{\Ss}{T}{P,\allWs} = \Partialbigg*{\Hs}{T}{P,\allWs}
+       = -T\PartialSecondbigg{\Gs}{T}{P,\allWs}
+  \\
+\begin{split}
+  \cPpm_i &= \Partial*{\cPt}{\Nt_i}{T,P,\allNsbut{i}}
+           = T \PartialMixSecond*{\St}{\Nt_i}{T}{P,\allNsbut{i}}
+           = T \PartialMixSecond*{\St}{T}{\Nt_i}{P,\allNsbut{i}}
+       \\ &= T \Partial*{\Spm_i}{T}{P,\allXs}
+           = \Partial*{\Hpm_i}{T}{P,\allXs}
+           = \PartialMixSecond*{\Ht}{T}{\Nt_i}{P,\allNsbut{i}}
+           = \PartialMixSecond*{\Ht}{\Nt_i}{T}{P,\allNsbut{i}}
+       \\ &= -T\PartialSecond*{\Gpm_i}{T}{P,\allXs}
+           = -T\Partial{{}^3 \Gt}{T^2\partial \Nt_i}{P,\allNsbut{i}}
+\end{split}
+\end{gather*}
+Other measurable quantities:
+\begin{align*}
+  \alphaS &= \frac{1}{\Vm} \Partial{\Vm}{T}{\Sm} &
+  \alphaP &= \frac{1}{\Vm} \Partial{\Vm}{T}{P} \\
+  \kappaS &= -\frac{1}{\Vm} \Partial{\Vm}{P}{\Sm} &
+  \kappaT &= -\frac{1}{\Vm} \Partial{\Vm}{P}{T}
+\end{align*}
+The chemical potential, fugacity, and activity:
+\[ \mu_i = \Gpm_i = \Gm_i^\std + RT \ln a_i
+         = \Gm_i^\std + RT\ln\left(\frac{\fmix_i}{\fstd_i}\right) \]
+Equilibrium in a chemical reaction:
+\[ \sumall_i \nu_i \mu_i = 0
+    \Rightarrow
+    \exp\left(\frac{-\Delta\Gm^\std}{RT}\right) = K = \prodall_i a_i^{\nu_i} \]
+Partial molar quantities:
+\begin{align*}
+  \Hpm{i} &= \Partial*{\Ht}{\Nt_i}{T,P,\allNsbut{i}}
+           = \Hm + \Nt \Partial*{\Hm}{\Nt_i}{T,P,\allNsbut{i}}
+       \\ &= \Hm + \Partial*{\Hm}{x_i}{T,P,\allXsbut{i}}
+                 - \sumallbutlast_j x_j \Partial*{\Hm}{x_j}{T,P,\allXsbut{j}}
+           = \Partial*{\Hm}{x_i}{T,P,\allXsbut{i}} + \Hpm_\ncomponents
+\end{align*}
+\[ \Vpm_i = \Partial{\Vt}{\Nt_i}{T,P,\allNsbut{i}} \]
+Fugacity and related properties:
+\begin{gather*}
+  \Gpm_i = \mu_i
+         = \Gm_i^\std(T) + RT\ln a_i
+         = \Gm_i^\std(T) + RT\ln\left(\frac{\fmix_i}{\fstd_i}\right)
+  \\
+  a_i = \frac{\fmix_i}{\fstd_i}
+      = x_i \gamma_i
+                \exp\left(\frac{1}{RT} \int_{\Pstd}^P \Vm_i(T,p) dp\right)
+      \approx x_i \gamma_i
+  \\
+  \begin{split}
+  \fmix_i &= x_i \phimix_i P
+           = x_i \gamma_i \fpure_i = x_i \gamma_i \phipure_i P
+           = x_i \gammarat_i \Henryrat_i
+           = C_i \gammamol_i \Henrymol_i
+           = x_i \gamma_i \fsat_i
+                 \exp\left(\frac{1}{RT} \int_{\Psat_i}^P \Vm_i(T,p) dp\right)
+       \\ &= x_i \gamma_i \Psat_i \phisat_i
+                \exp\left(\frac{1}{RT} \int_{\Psat_i}^P \Vm_i(T,p) dp\right)
+          \approx x_i \gamma_i \Psat_i
+  \end{split}
+\end{gather*}
+Chemical Equilibria:
+\begin{gather*}
+  \Deltarxn\Hm^\std = \sumall_i \nu_i \Deltaf\Hm_i^\std \\
+  \Deltarxn\Gm^\std = \sumall_i \nu_i \Deltaf\Gm_i^\std
+                    = \sumall_i \nu_i \mu_i^\std \\
+  \Deltarxn\cP^\std = \sumall_i \nu_i \cP_i^\std \\
+  \mu_i = \mu_i^\std + RT\ln a_i \\
+  a_i = \begin{cases}
+\displaystyle
+     \frac{y_i \phimix_i P}{\Pstd} \approx \frac{y_i P}{\Pstd}
+        & \text{(gases)} \\
+\rule{0pt}{5ex}%
+\displaystyle
+     x_i \gamma_i \exp\left(\frac{1}{RT} \int_{\Pstd}^P \Vm_i(T,p)\,dp\right)
+     \approx
+     x_i \gamma_i \exp\left(\frac{\Vm_i(P-\Pstd)}{RT}\right)
+     \approx x_i \gamma_i \approx 1
+        & \text{(solids, solvents)} \\
+\displaystyle
+\rule{0pt}{5ex}%
+     \frac{C_i \gammamol_i}{C_i^\std}
+        \exp\left(\frac{1}{RT}
+        \int_{\Pstd}^P \Vpm_i^\infty(T,p,\allXs)\,dp\right)
+     \approx
+     \frac{C_i \gammamol_i}{C_i^\std} \approx \frac{C_i}{C_i^\std}
+        & \text{(solutes)}
+        \end{cases}
+\end{gather*}
+Phase change properties:
+\begin{gather*}
+  \Deltafus\Sm = \Sm^L - \Sm^S \\
+  \Deltasub\Vm = \Vm^V - \Vm^S \\
+  \Deltavap\Gm = \Gm^V - \Gm^L
+\end{gather*}
+Specific properties:
+\newcommand*{\Btilde}[2][]{\widetilde{B}_{#2}^{#1}}
+\[ \Btilde{j} \equiv \Partial{\Bt}{m_j}{T,\Vs,\allMsbut[i]{j}} \]
+and thus
+\[ \Btilde{i}
+    = \frac{\Bpm{i}}{M_i}
+        + \Biggl(\Vs - \frac{\Vpm_i}{M_i}\Biggr)
+          \Partial*{\Bs}{\Vs}{T,\allMs}
+    = \frac{\Bpm{i}}{M_i}
+        + \Biggl(\Vs - \frac{\Vpm_i}{M_i}\Biggr)
+          \Partial{\Bs}{\Vs}{T,m,\allWs} \]
+and
+\[ \Bs = \sumall_i w_i \Btilde{i}. \]
+Excess and Residual (Departure) Properties:
+\begin{align*}
+  \HR &= \Hm - \Hm^\IG &
+  \FR &= \Fm - \Fm^\IGM \\
+  \SE &= \Sm - \Sm^\IS &
+  \VRpm_k &= \Vpm_k - \Vpm_k^\IGM
+\end{align*}
+\end{document}
+%</example>
+% \fi
+%
+% \Finale
+\endinput


Property changes on: trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.ins	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/thermodynamics/thermodynamics.ins	2022-04-30 20:02:45 UTC (rev 63188)
@@ -0,0 +1,73 @@
+%% File: thermodynamics.ins Copyright (C) 2021 Karl D. Hammond
+%%
+%% Karl D. Hammond,
+%% Department of Chemical Engineering
+%% University of Missouri
+%% Contact: hammondkd at missouri.edu
+%%
+%% 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 K. D. Hammond.
+%%
+%% This work consists of the files thermodynamics.dtx and thermodynamics.ins
+%% and the derived files thermodynamics.sty and thermodynamics.pdf.
+%% \fi
+
+\input{docstrip}
+\keepsilent
+\usedir{tex/latex/thermodynamics}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2017-2018 by Karl D. Hammond
+
+Karl D. Hammond,
+Department of Chemical Engineering
+University of Missouri
+Contact: hammondkd at missouri.edu
+                                                                   
+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.
+\endpreamble
+
+\generate{%
+    \file{thermodynamics.sty}{\from{thermodynamics.dtx}{package}}%
+    \file{thermodynamics-examples.tex}{\from{thermodynamics.dtx}{example}}%
+}
+
+\obeyspaces
+\Msg{********************************************************************}
+\Msg{*                                                                  *}
+\Msg{* To finish the installation you have to move the                  *}
+\Msg{* following file into a directory searched by TeX:                 *}
+\Msg{*                                                                  *}
+\Msg{*   thermodynamics.sty                                             *}
+\Msg{*                                                                  *}
+\Msg{* To produce the documentation, run the following                  *}
+\Msg{* commands:                                                        *}
+\Msg{*   pdflatex thermodynamics.dtx                                    *}
+\Msg{*   makeindex -s gglo.ist -o thermodynamics.gls thermodynamics.glo *}
+\Msg{*   makeindex -s gind.ist -o thermodynamics.ind thermodynamics.idx *}
+\Msg{*   pdflatex thermodynamics.dtx                                    *}
+\Msg{*   pdflatex thermodynamics.dtx                                    *}
+\Msg{*                                                                  *}
+\Msg{* Happy TeXing!                                                    *}
+\Msg{*                                                                  *}
+\Msg{********************************************************************}
+
+\endbatchfile

Added: trunk/Master/texmf-dist/tex/latex/thermodynamics/thermodynamics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/thermodynamics/thermodynamics.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/thermodynamics/thermodynamics.sty	2022-04-30 20:02:45 UTC (rev 63188)
@@ -0,0 +1,1005 @@
+%%
+%% This is file `thermodynamics.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% thermodynamics.dtx  (with options: `package')
+%% 
+%% This is a generated file.
+%% 
+%% Copyright (C) 2017-2018 by Karl D. Hammond
+%% 
+%% Karl D. Hammond,
+%% Department of Chemical Engineering
+%% University of Missouri
+%% Contact: hammondkd at missouri.edu
+%% 
+%% 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}
+\ProvidesPackage{thermodynamics}
+    [2022/04/29 v1.00 thermodynamics package]
+\RequirePackage{amstext}
+\AtBeginDocument{
+    \@ifpackageloaded{pxfonts}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-10mu d}}%
+    }{}
+    \@ifpackageloaded{newpxmath}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-10mu d}}%
+    }{}
+    \@ifpackageloaded{txfonts}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-11mu d}}%
+    }{}
+    \@ifpackageloaded{mathptmx}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-10mu d}}%
+    }{}
+    \@ifpackageloaded{newtxmath}{%
+        \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-12mu d}}%
+    }{}
+    \@ifpackageloaded{mathdesign}{%
+        \def\@charter{mdbch}%
+        \def\@utopia{mdput}%
+        \def\@garamond{mdugm}%
+        \ifx\MD at default@family\@utopia
+            \providecommand*{\dbar}{{\mkern8mu\mathchar'26\mkern-20mu d}}%
+        \fi
+        \ifx\MD at default@family\@charter
+            \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-15mu d}}%
+        \fi
+        \ifx\MD at default@family\@garamond
+            \providecommand*{\dbar}{{\mkern5mu\mathchar'26\mkern-17mu d}}%
+        \fi
+    }{}
+    % Defaults to Computer Modern
+    \providecommand*{\dbar}{{\mkern3mu\mathchar'26\mkern-12mu d}}
+}
+\newcommand*{\totalenergy at symbol}{E}
+\newcommand*{\internalenergy at symbol}{U}
+\newcommand*{\Helmholtz at symbol}{A}
+\newcommand*{\Gibbs at symbol}{G}
+\newcommand*{\Landau at symbol}{\Omega}
+\newcommand*{\enthalpy at symbol}{H}
+\newcommand*{\entropy at symbol}{S}
+\newcommand*{\area at symbol}{a}
+\newcommand*{\volume at symbol}{V}
+\newcommand*{\mole at symbol}{n}
+\newcommand*{\heat at symbol}{Q}
+\newcommand*{\work at symbol}{W}
+\newcommand*{\temperature at symbol}{T}
+\newcommand*{\pressure at symbol}{P}
+\newcommand*{\thermo at underline}[1]{%
+  \mkern1mu\underline{\mkern-1mu #1\mkern-4mu}\mkern4mu%
+}
+\newcommand*{\thermo at overline}[1]{%
+  \mkern2mu\overline{\mkern-2mu #1\mkern-1mu}\mkern1mu%
+}
+\newcommand*{\PartialOpen}{(}
+\newcommand*{\PartialClose}{)}
+\newcommand*{\PartialEmptyClose}{)}
+\DeclareOption{EUAGHan}{}% the default
+\DeclareOption{EUAGHaN}{\renewcommand*{\mole at symbol}{N}}%
+\DeclareOption{EUHAGan}{\ExecuteOptions{EUAGHan}}
+\DeclareOption{EUHAGaN}{\ExecuteOptions{EUAGHaN}}
+\DeclareOption{EUFGHAn}{% this is my favorite set of symbols
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+}
+\DeclareOption{EUFGHAN}{% this is my second favorite set of symbols
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EEFGHAn}{% this treats all energy the same way(?)
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+}
+\DeclareOption{EEFGHAN}{% this treats all energy the same way(?)
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\area at symbol}{A}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EEFGHan}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}
+}
+\DeclareOption{EEFGHaN}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\Helmholtz at symbol}{F}
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EEAGHan}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+}
+\DeclareOption{EEAGHaN}{%
+  \renewcommand*{\internalenergy at symbol}{E}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EUAGHAn}{% Helmholtz free energy and area look the same here
+  \renewcommand*{\area at symbol}{A}%
+}
+\DeclareOption{EUAGHAN}{% Helmholtz free energy and area look the same here
+  \renewcommand*{\area at symbol}{A}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{EUFGHan}{%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+}
+\DeclareOption{EUFGHaN}{%
+  \renewcommand*{\Helmholtz at symbol}{F}%
+  \renewcommand*{\mole at symbol}{N}%
+}
+\DeclareOption{delta}{\let\dbar\delta}
+\let\@extensive\relax
+\let\@intensive\relax
+\let\@specific\hat
+\DeclareOption{extensive-plain}{%
+    \let\@extensive\relax
+    \let\@intensive\thermo at underline
+}
+\DeclareOption{intensive-plain}{% the default
+    \let\@extensive\thermo at underline
+    \let\@intensive\relax
+}
+\DeclareOption{intensive-lowercase}{% PLEASE don't use this!
+    \let\@extensive\MakeUppercase
+    \let\@intensive\MakeLowercase
+    \def\@specific#1{\MakeLowercase{\hat #1}}
+    \AtEndOfPackage{
+        \renewcommand*{\partialmolar}[1]{%
+            \gdef\pm at symbol{\MakeLowercase #1}\generic at pm}
+        \renewcommand*{\heatcapacitysymbol}{c}
+    }
+}
+\DeclareOption{extensive-superscript}{%
+    \gdef\@extensive#1{{#1}^t}%
+    \let\@intensive\relax%
+    \AtEndOfPackage{%
+      \renewcommand*{\URt}{\internalenergy at symbol^{\residual,t}}
+      \renewcommand*{\HRt}{\enthalpy at symbol^{\residual,t}}
+      \renewcommand*{\FRt}{\Helmholtz at symbol^{\residual,t}}
+      \renewcommand*{\GRt}{\Gibbs at symbol^{\residual,t}}
+      \renewcommand*{\VRt}{\volume at symbol^{\residual,t}}
+      \renewcommand*{\SRt}{\entropy at symbol^{\residual,t}}
+      \renewcommand*{\UEt}{\internalenergy at symbol^{\excess,t}}
+      \renewcommand*{\HEt}{\enthalpy at symbol^{\excess,t}}
+      \renewcommand*{\FEt}{\Helmholtz at symbol^{\excess,t}}
+      \renewcommand*{\GEt}{\Gibbs at symbol^{\excess,t}}
+      \renewcommand*{\VEt}{\volume at symbol^{\excess,t}}
+      \renewcommand*{\SEt}{\entropy at symbol^{\excess,t}}
+    }
+}
+\newif\if at subscripted
+\@subscriptedtrue
+\DeclareOption{subscripts}{\@subscriptedtrue}
+\DeclareOption{nosubscripts}{\@subscriptedfalse}
+\DeclareOption{parentheses}{}
+\DeclareOption{brackets}{%
+  \renewcommand*{\PartialOpen}{[}%
+  \renewcommand*{\PartialClose}{]}%
+  \renewcommand*{\PartialEmptyClose}{]}%
+}
+\DeclareOption{braces}{%
+  \renewcommand*{\PartialOpen}{\{}%
+  \renewcommand*{\PartialClose}{\}}%
+  \renewcommand*{\PartialEmptyClose}{\}}%
+}
+\DeclareOption{bar}{%
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{\rvert}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+}
+\DeclareOption{plain-derivatives}{% This implies dU(S,V,N)/dS notation
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{.}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+  \ExecuteOptions{nosubscripts}%
+}
+\newcommand*{\ncomponents}{C}
+\newcommand*{\allNs}{\allcomponents{\Nt}}
+\newcommand*{\allXs}{\allcomponents{x}}
+\newcommand*{\allYs}{\allcomponents{y}}
+\newcommand*{\allmus}{\allcomponents{\mu}}
+\newcommand*{\allMs}{\allcomponents{m}}
+\newcommand*{\allWs}{\allcomponents{w}}%
+\newcommand*{\allNsbut}[2][j]{\allbut[#1]{#2}{\Nt}}
+\newcommand*{\allXsbut}[2][j]{\allbutlastand[#1]{#2}{x}}
+\newcommand*{\allYsbut}[2][j]{\allbutlastand[#1]{#2}{y}}
+\newcommand*{\allmusbut}[2][j]{\allbut[#1]{#2}{\mu}}
+\newcommand*{\allMsbut}[2][j]{\allbut[#1]{#2}{m}}
+\newcommand*{\allWsbut}[2][j]{\allbutlastand[#1]{#2}{w}}%
+\newcommand*{\allcomponents}[1]{\vec{#1}}
+\newcommand*{\allbut}[3][j]{%
+  \def\tmp at arg{#2}%
+  \def\tmp@@arg{#1}%
+  \ifx\tmp at arg\tmp@@arg
+    {#3}_{k\neq #2}%
+  \else
+    {#3}_{#1\neq #2}%
+  \fi
+}
+\newcommand*{\allbutlastand}[3][j]{%
+  \edef\tmp at arg{#1}%
+  \edef\tmp@@arg{#2}%
+  \ifx\tmp@@arg\ncomponents
+    {#3}_{#1 \neq #2}%
+  \else
+    \ifx\tmp at arg\tmp@@arg
+      {#3}_{k \neq #2,\ncomponents}%
+    \else
+      {#3}_{#1 \neq #2,\ncomponents}%
+    \fi
+  \fi
+}
+\DeclareOption{moles-index}{}
+\DeclareOption{moles-range}{%
+  \renewcommand*{\allcomponents}[1]{{#1}_1,\dots,{#1}_{\ncomponents}}
+  \renewcommand*{\allbut}[3][j]{%
+    \def\@one{1}%
+    \edef\tmp at arg{#2}%
+    \ifx\tmp at arg\@one
+      {#3}_2,\dots,{#3}_{\ncomponents}%
+    \else
+      \ifx\tmp at arg\ncomponents
+        {#3}_1,\dots,{#3}_{\ncomponents-1}%
+      \else
+        {#3}_1,\dots,[{#3}_{#2}],\dots,{#3}_{\ncomponents}%
+      \fi
+    \fi
+  }
+  \renewcommand*{\allbutlastand}[3][j]{%
+    \def\@one{1}%
+    \edef\tmp at arg{#2}%
+    \edef\@ncminusone{\ncomponents-1}%
+    \ifx\tmp at arg\@one
+      {#3}_2,\dots,{#3}_{\ncomponents-1}%
+    \else
+      \ifx\tmp at arg\@ncminusone
+        {#3}_1,\dots,{#3}_{\ncomponents-2}%
+      \else
+        \ifx\tmp at arg\ncomponents
+          {#3}_1,\dots,{#3}_{\ncomponents-1}%
+      \else
+          {#3}_1,\dots,[{#3}_{#2}],\dots,{#3}_{\ncomponents}%
+        \fi
+      \fi
+    \fi
+  }
+}
+\DeclareOption{Bejan}{
+  \ExecuteOptions{EUFGHAN,intensive-lowercase,delta}
+  \let\@specific\MakeLowercase
+  \def\@intensive#1{\MakeLowercase{\bar #1}}
+  \AtEndOfPackage{
+    \DeclareSubscrSymbol{cV}{\bar\heatcapacitysymbol}{v}
+    \DeclareSubscrSymbol{cVs}{\heatcapacitysymbol}{v}
+    \DeclareSubscrSymbol{cVt}{\Nt\heatcapacitysymbol}{v}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\ncomponents}{n}
+  }
+}
+\DeclareOption{CBK}{
+  \ExecuteOptions{EUAGHAN,intensive-lowercase}
+  \AtEndOfPackage{
+    \let\thermo at overline\widetilde
+    \let\@specific\MakeLowercase
+    \renewcommand*{\@intensive}[1]{\MakeLowercase{\bar{#1}}}
+    \renewcommand*{\pressure at symbol}{p}
+    \renewcommand*{\Deltarxn}[1]{#1_R}
+    \renewcommand*{\compressibilitysymbol}{\beta}
+    \renewcommand*{\expansivitysymbol}{\alpha}
+  }
+}
+\DeclareOption{ElliottLira}{
+  \AtEndOfPackage{
+    \renewcommand*{\allcomponents}[1]{#1}
+    \renewcommand*{\Deltarxn}[1]{\Delta #1}
+  }
+}
+\DeclareOption{Koretsky}{
+  \ExecuteOptions{EUAGHAn,brackets,intensive-lowercase,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\partialmolar}[1]{\gdef\pm at symbol{#1}\generic at pm}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\IS}{{\text{ideal}}}
+    \renewcommand*{\residual}{{\text{dep}}}
+    \renewcommand*{\IG}{{\text{ideal}}}
+    \renewcommand*{\IGM}{{\text{ideal}}}
+    \renewcommand*{\Deltafus}[1]{\Delta{#1}_\fusion}
+    \renewcommand*{\Deltasub}[1]{\Delta{#1}_\sublimation}
+    \renewcommand*{\Deltavap}[1]{\Delta{#1}_\vaporization}
+    \renewcommand*{\Henryrat}{{\mathcal{H}}}
+    \renewcommand*{\gammarat}{\gamma^\text{Henry's}}
+    \let\phipure\varphi
+    \renewcommand*{\phimix}{\hat\varphi}
+    \renewcommand*{\phisat}{\varphi^\sat}
+    \let\Delta at fus@sym\relax
+    \DeclareSubscrSymbol{@Deltafus}{\Delta at fus@sym}{\fusion}
+    \renewcommand*{\Deltafus}[1]{\def\Delta at fus@sym{\Delta #1}\@Deltafus}
+    \let\Delta at vap@sym\relax
+    \DeclareSubscrSymbol{@Deltavap}{\Delta at vap@sym}{\vaporization}
+    \renewcommand*{\Deltasub}[1]{\def\Delta at sub@sym{\Delta #1}\@Deltasub}
+    \let\Delta at sub@sym\relax
+    \DeclareSubscrSymbol{@Deltasub}{\Delta at sub@sym}{\sublimation}
+    \renewcommand*{\Deltasub}[1]{\def\Delta at sub@sym{\Delta #1}\@Deltasub}
+  }
+}
+\DeclareOption{MSBB}{
+  \ExecuteOptions{EUFGHAn,intensive-lowercase,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\IGM}{\ast}
+    \renewcommand*{\IG}{\ast}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\allcomponents}[1]{#1}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}%
+      \else
+        {#3}_{#1}%
+      \fi
+    }
+    \let\Helmholtz at symbol\psi
+    \renewcommand*{\Ft}{\Psi}
+    \def\@intensive#1{\MakeLowercase{\thermo at overline #1}}
+    \let\@specific\MakeLowercase
+    \renewcommand*{\partialmolar}[1]{\gdef\pm at symbol{#1}\generic at pm}
+    \renewcommand*{\fmix}{\bar f}
+    \renewcommand*{\phimix}{\bar\phi}
+    \renewcommand*{\pressure at symbol}{p}
+  }
+}
+\DeclareOption{Prausnitz}{
+  \ExecuteOptions{intensive-lowercase}
+  \AtEndOfPackage{
+    \renewcommand*{\fmix}{f}
+    \let\phimix\phi
+    \renewcommand*{\fsat}{\fpure^\sat}
+    \DeclareSubscrSymbol{fpure}{f}{{\text{pure}}}
+    \DeclareSubscrSymbol{phipure}{\phi}{{\text{pure}}}
+    \renewcommand*{\residual}{{{\mathcal{R}}}}
+    \renewcommand*{\allcomponents}[1]{{#1}_i}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}%
+      \else
+        {#3}_{#1}%
+      \fi
+    }
+  }
+}
+\DeclareOption{Sandler}{
+  \ExecuteOptions{EUAGHaN,extensive-plain}
+  \AtEndOfPackage{
+    \renewcommand*{\sat}{{\text{vap}}}
+    \renewcommand*{\excess}{{\text{{ex}}}}
+    \renewcommand*{\residual}{{\text{r}}}
+    \renewcommand*{\ncomponents}{\mathcal{C}}
+    \renewcommand*{\fmix}{\bar f}
+    \renewcommand*{\fstd}{\bar f^\circ}
+    \renewcommand*{\phimix}{\bar\phi}
+    \renewcommand*{\allcomponents}[1]{\thermo at underline{#1}}
+    \renewcommand*{\IG}{{\text{IG}}}
+    \renewcommand*{\IGM}{{\text{IGM}}}
+    \renewcommand*{\IS}{{\text{IM}}}
+    \renewcommand*{\Deltamix}[1]{\Delta_\mixing #1}
+    \renewcommand*{\Deltarxn}[1]{\Delta_\reaction #1}
+    \renewcommand*{\Deltasub}[1]{\Delta_\sublimation #1}
+    \renewcommand*{\Deltafus}[1]{\Delta_\fusion #1}
+    \renewcommand*{\Deltavap}[1]{\Delta_\vaporization #1}
+    \renewcommand*{\Henryrat}{H}
+    \DeclareSubscrSymbol{cV}{\heatcapacitysymbol}{\volume at symbol}
+    \DeclareSubscrSymbol{cP}{\heatcapacitysymbol}{\pressure at symbol}
+    \DeclareSubscrSymbol{cVt}{\Nt\heatcapacitysymbol}{\volume at symbol}
+    \DeclareSubscrSymbol{cPt}{\Nt\heatcapacitysymbol}{\pressure at symbol}
+  }
+}
+\DeclareOption{SVNAS}{
+  \ExecuteOptions{extensive-superscript}
+  \AtEndOfPackage{
+    \renewcommand*{\allcomponents}[1]{#1}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}%
+      \else
+        {#3}_{#1}%
+      \fi
+    }
+    \renewcommand*{\IG}{{ig}}
+    \renewcommand*{\IGM}{{ig}}
+    \renewcommand*{\IS}{{id}}
+    \renewcommand*{\expansivitysymbol}{\beta}
+    \renewcommand*{\Deltarxn}[1]{\Delta #1}
+    \DeclareSubscrSymbol{cVt}{\Nt\heatcapacitysymbol}{\volume at symbol}
+    \DeclareSubscrSymbol{cPt}{\Nt\heatcapacitysymbol}{\pressure at symbol}
+  }
+}
+\DeclareOption{TesterModell}{
+  \ExecuteOptions{EUAGHaN,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\ncomponents}{n}
+    \renewcommand*{\allcomponents}[1]{{#1}_i}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_k\relax[#2]
+      \else
+        {#3}_{#1}\relax[#2]
+      \fi
+    }
+    \renewcommand*{\allbutlastand}[3][j]{%
+      \edef\tmp at arg{#1}%
+      \edef\tmp@@arg{#2}%
+      \ifx\tmp@@arg\ncomponents
+        {#3}_{#1}\relax[#2]%
+      \else
+        \ifx\tmp at arg\tmp@@arg
+          {#3}\relax[#2,\ncomponents]%
+        \else
+          {#3}\relax[#2,\ncomponents]%
+        \fi
+      \fi
+    }
+    \renewcommand*{\IG}{{ig}}
+    \renewcommand*{\IGM}{{igm}}
+    \renewcommand*{\IS}{{ID}}
+    \renewcommand*{\excess}{{EX}}%
+    \renewcommand*{\reaction}{{rx}}
+    \renewcommand*{\Henryrat}{f^{\ast\ast}}
+    \renewcommand*{\Henrymol}{f^\ast}
+    \renewcommand*{\gammarat}{\gamma^{\ast\ast}}
+    \renewcommand*{\gammamol}{\gamma^\ast}
+  }
+}
+\DeclareOption{Thompson}{
+  \ExecuteOptions{EUAGHAn,delta}
+  \AtEndOfPackage{
+    \renewcommand*{\excess}{{EX}}
+    \renewcommand*{\residual}{{R}}
+    \renewcommand*{\allcomponents}[1]{{#1}_j}
+    \renewcommand*{\ncomponents}{c}
+    \renewcommand*{\IS}{{IS}}
+    \renewcommand*{\IG}{{IG}}
+    \let\IGM\IG
+    \def\@fpure_#1{f_{#1}\@ifnextchar^{}{^\bullet}}
+    \renewcommand*{\fpure}{\@ifnextchar_{\@fpure}{f}}
+    \def\@phi at pure_#1{\phi_{#1}\@ifnextchar^{}{^\bullet}}
+    \renewcommand*{\phipure}{\@ifnextchar_{\@phi at pure}{\phi}}
+    \renewcommand*{\mixing}{{MIX}}
+    \renewcommand*{\Deltamix}[1]{\Delta_\mixing #1}
+    \renewcommand*{\Deltarxn}[1]{\Delta #1}
+    \def\@@intensive_#1{_{#1}\@ifnextchar^{}{^\bullet}}
+    \newcommand*{\@intensive}[1]{#1\@ifnextchar_{\@@intensive}{}}
+    \renewcommand*{\allbut}[3][j]{%
+      \def\tmp at arg{#2}%
+      \def\tmp@@arg{#1}%
+      \ifx\tmp at arg\tmp@@arg
+        {#3}_{k}\neq{#3}_{#2}%
+      \else
+        {#3}_{#1}\neq{#3}_{#2}%
+      \fi
+    }
+  }
+}
+\ExecuteOptions{EUAGHan,subscripts,parentheses,intensive-plain,moles-index}
+\ProcessOptions
+\newlength{\Partial at const@width}
+\newlength{\operator at width}
+\settowidth{\operator at width}{=}
+\newlength{\adjust at width}
+\setlength{\adjust at width}{0.1\operator at width}
+\addtolength{\operator at width}{\adjust at width}
+\def\Partial at start{\left\PartialOpen}
+\def\Partial at end{\right\PartialClose}
+\def\Partial at empty@end{\right\PartialEmptyClose}
+\def\Partial{\@ifstar\Partial at star\Partial at nostar}
+\newif\iftwo at has@Nt
+\two at has@Ntfalse
+\newif\iftwo at has@xory
+\two at has@xoryfalse
+\newif\ifthree at has@Nt
+\three at has@Ntfalse
+\newif\ifthree at has@xory
+\three at has@xoryfalse
+\AtEndOfPackage{%
+  \edef\thermo at Nt{\Nt}%
+  \edef\thermo at x{x}%
+  \edef\thermo at y{y}%
+}
+\def\thermo at parse@two#1\relax{%
+  \@tfor\@i:=#1\do{%
+    \edef\@@i{\@i}%
+    \ifx\@@i\thermo at Nt
+      \two at has@Nttrue
+      \@break at tfor
+    \fi
+    \ifx\@@i\thermo at x
+      \two at has@xorytrue
+      \@break at tfor
+    \fi
+    \ifx\@@i\thermo at y
+      \two at has@xorytrue
+      \@break at tfor
+    \fi
+  }
+}
+\newcommand*{\Partial at nostar}[3]{%
+  \def\tmp at arg{#3}%
+  \if at subscripted
+    % Handles situation of empty variables held constant
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial #1}
+                                     {\partial #2}\Partial at empty@end}%
+    \else
+      \ensuremath{\Partial at start\frac{\partial #1}
+                                     {\partial #2}\Partial at end_{#3}}%
+    \fi
+  \else
+    % If not subscripted, we put the arguments (if any) in the derivative
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial #1}
+                                     {\partial #2}\Partial at empty@end}%
+    \else
+      % Check for whether #3 contains \allNsbut{i}/etc. and #2 is \Nt_i/etc.
+      \thermo at parse@two#2\relax
+      \iftwo at has@Nt
+        \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+        \ensuremath{\Partial at start\frac{\partial #1(#3)}
+                                       {\partial #2}\Partial at end}%
+      \else
+        \iftwo at has@xory
+          \renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+          \ensuremath{\Partial at start\frac{\partial #1(#3)}
+                                         {\partial #2}\Partial at end}%
+        \else
+          \ensuremath{\Partial at start\frac{\partial #1(#2,#3)}
+                                         {\partial #2}\Partial at end}%
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\newcommand*{\Partial at star}[3]{%
+  \settowidth{\Partial at const@width}{\ensuremath{#3}}%
+  \addtolength{\Partial at const@width}{-0.15\Partial at const@width}%
+  \Partial at nostar{#1}{#2}{#3}%
+  \if at subscripted
+    \ifdim\operator at width<\Partial at const@width
+      \kern -\operator at width
+    \else
+      \kern -\Partial at const@width
+    \fi
+  \fi
+}
+\def\PartialBigg{%
+  \def\Partial at start{\Biggl\PartialOpen}%
+  \def\Partial at end{\Biggr\PartialClose}%
+  \def\Partial at empty@end{\Biggr\PartialClose}%
+  \Partial%
+}
+\def\Partialbigg{%
+  \def\Partial at start{\biggl\PartialOpen}%
+  \def\Partial at end{\biggr\PartialClose}%
+  \def\Partial at empty@end{\biggr\PartialClose}%
+  \Partial%
+}
+\def\PartialSecond{\@ifstar\PartialSecond at star\PartialSecond at nostar}
+\newcommand*{\PartialSecond at nostar}[3]{%
+  \def\tmp at arg{#3}%
+  \if at subscripted
+  % Handles situation of empty variables held constant
+    \ifx\tmp at arg\@empty
+        \ensuremath{\Partial at start\frac{\partial^2 #1}
+                                       {\partial #2^2}\Partial at empty@end}%
+    \else
+        \ensuremath{\Partial at start\frac{\partial^2 #1}
+                                       {\partial #2^2}\Partial at end_{#3}}%
+    \fi
+  \else
+    \ifx\tmp at arg\@empty
+        \ensuremath{\Partial at start\frac{\partial^2 #1}
+                                       {\partial #2^2}\Partial at empty@end}%
+    \else
+      % Check for whether #3 contains \allNsbut{i}/etc. and #2 is \Nt_i/etc.
+      \thermo at parse@two#2\relax
+      \iftwo at has@Nt
+        \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+        \ensuremath{\Partial at start\frac{\partial^2 #1(#3)}
+                                       {\partial #2^2}\Partial at end}%
+      \else
+        \iftwo at has@xory
+          \renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+          \ensuremath{\Partial at start\frac{\partial^2 #1(#3)}
+                                         {\partial #2^2}\Partial at end}%
+        \else
+          \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#3)}
+                                         {\partial {#2}^2}\Partial at end}%
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\newcommand*{\PartialSecond at star}[3]{%
+    \settowidth{\Partial at const@width}{\ensuremath{#3}}%
+    \addtolength{\Partial at const@width}{-0.15\Partial at const@width}%
+    \PartialSecond at nostar{#1}{#2}{#3}%
+    \if at subscripted
+      \ifdim\operator at width<\Partial at const@width
+        \kern -\operator at width
+      \else
+        \kern -\Partial at const@width
+      \fi
+    \fi
+}
+\def\PartialSecondBigg{%
+  \def\Partial at start{\expandafter\Biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\Biggr\PartialClose}%
+  \PartialSecond%
+}
+\def\PartialSecondbigg{%
+  \def\Partial at start{\expandafter\biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\biggr\PartialClose}%
+  \PartialSecond%
+}
+\def\PartialMixSecond{\@ifstar\PartialMixSecond at star\PartialMixSecond at nostar}
+\newcommand*{\PartialMixSecond at nostar}[4]{%
+  \def\tmp at arg{#4}%
+  \if at subscripted
+  % Handles situation of empty variables held constant
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial^2 #1}
+                           {\partial #2\partial#3}\Partial at empty@end}%
+    \else
+      \ensuremath{\Partial at start\frac{\partial^2 #1}
+                           {\partial #2\partial#3}\Partial at end_{#4}}%
+    \fi
+  \else
+    \ifx\tmp at arg\@empty
+      \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#3)}
+                           {\partial #2\partial#3}\Partial at empty@end}%
+    \else
+      % This time, we check whether #2 OR #3 are \Nt_i/etc.
+      \thermo at parse@two#3\relax
+      \iftwo at has@Nt\three at has@Nttrue\fi
+      \iftwo at has@xory\three at has@xorytrue\fi
+      \two at has@Ntfalse
+      \two at has@xoryfalse
+      \thermo at parse@two#2\relax
+      \iftwo at has@Nt
+        \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+        \ensuremath{\Partial at start\frac{\partial^2 #1(#3,#4)}
+                                       {\partial #2\partial#3}\Partial at end}%
+      \else
+        \iftwo at has@xory
+          \renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+          \ensuremath{\Partial at start\frac{\partial^2 #1(#3,#4)}
+                                         {\partial #2\partial#3}\Partial at end}%
+        \else
+          \ifthree at has@Nt
+            \renewcommand*{\allbut}[3][j]{\allcomponents{##3}}%
+            \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#4)}
+                                      {\partial #2\partial#3}\Partial at end}%
+          \else
+            \ifthree at has@xory
+              \PackageWarning{thermodynamics}{GOT HERE}
+              %\renewcommand*{\allbutlastand}[3][j]{\allbut{\ncomponents}{##3}}%
+              \renewcommand*{\allbutlastand}[3][j]{SCREW YOU}%
+              \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#4)}
+                                        {\partial #2\partial#3}\Partial at end}%
+            \else
+              \ensuremath{\Partial at start\frac{\partial^2 #1(#2,#3,#4)}
+                                        {\partial #2\partial#3}\Partial at end}%
+            \fi
+          \fi
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\newcommand*{\PartialMixSecond at star}[4]{%
+    \settowidth{\Partial at const@width}{\ensuremath{#4}}%
+    \addtolength{\Partial at const@width}{-0.25\Partial at const@width}%
+    \PartialMixSecond at nostar{#1}{#2}{#3}{#4}%
+    \if at subscripted
+      \ifdim\operator at width<\Partial at const@width
+        \kern -\operator at width
+      \else
+        \kern -\Partial at const@width
+      \fi
+    \fi
+}
+\def\PartialMixSecondBigg{%
+  \def\Partial at start{\expandafter\Biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\Biggr\PartialClose}%
+  \PartialMixSecond%
+}
+\def\PartialMixSecondbigg{%
+  \def\Partial at start{\expandafter\biggl\PartialOpen}%
+  \def\Partial at end{\expandafter\biggr\PartialClose}%
+  \PartialMixSecond%
+}
+\AtBeginDocument{%
+  \@ifpackageloaded{amsmath}{}{%
+      \PackageWarningNoLine{thermodynamics}
+        {Package amsmath not loaded; load to make PartialBigg and friends
+            work correctly}%
+      \let\PartialBigg\Partial
+      \let\Partialbigg\Partial
+      \let\PartialSecondBigg\PartialSecond
+      \let\PartialSecondbigg\PartialSecond
+      \let\PartialMixSecondBigg\PartialMixSecond
+      \let\PartialMixSecondbigg\PartialMixSecond
+  }%
+}
+\newenvironment*{thermoparentheses}{
+  \renewcommand*{\PartialOpen}{(}%
+  \renewcommand*{\PartialClose}{)}%
+  \renewcommand*{\PartialEmptyClose}{)}%
+}{}
+\newenvironment*{thermobrackets}{%
+  \renewcommand*{\PartialOpen}{[}%
+  \renewcommand*{\PartialClose}{]}%
+  \renewcommand*{\PartialEmptyClose}{]}%
+}{}
+\newenvironment*{thermobraces}{%
+  \renewcommand*{\PartialOpen}{\{}%
+  \renewcommand*{\PartialClose}{\}}%
+  \renewcommand*{\PartialEmptyClose}{\}}%
+}{}
+\newenvironment*{thermobar}{%
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{\rvert}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+}{}
+\newenvironment*{thermoplain}{%
+  \renewcommand*{\PartialOpen}{.}%
+  \renewcommand*{\PartialClose}{.}%
+  \renewcommand*{\PartialEmptyClose}{.}%
+  \@subscriptedfalse
+}{}
+\newenvironment*{thermoNOsubscripts}{\@subscriptedfalse}{}
+\newenvironment*{thermosubscripts}{\@subscriptedtrue}{}
+\newcommand*{\DeclareSubscrSymbol}[3]{%
+  \expandafter\def\csname #1\endcsname{%
+    \@ifnextchar^{\csname @#1\endcsname}
+                 {\@ifnextchar_{\csname @@#1\endcsname}{{#2}_{#3}}}
+  }
+  \expandafter\def\csname @#1\endcsname ##1##2{%
+    {#2}^{##2}\@ifnextchar_{\csname @@@#1\endcsname}{_{#3}}%
+  }
+  \expandafter\def\csname @@#1\endcsname ##1##2{{#2}_{#3,##2}}
+  \expandafter\def\csname @@@#1\endcsname ##1##2{_{#3,##2}}
+}
+\newcommand*{\heatcapacitysymbol}{C}
+\newcommand*{\compressibilitysymbol}{\kappa}
+\newcommand*{\expansivitysymbol}{\alpha}
+\DeclareSubscrSymbol{cV}{\@intensive\heatcapacitysymbol}{\volume at symbol}
+\DeclareSubscrSymbol{cP}{\@intensive\heatcapacitysymbol}{\pressure at symbol}
+\DeclareSubscrSymbol{cVt}{\@extensive\heatcapacitysymbol}{\volume at symbol}
+\DeclareSubscrSymbol{cPt}{\@extensive\heatcapacitysymbol}{\pressure at symbol}
+\DeclareSubscrSymbol{cVs}{\@specific\heatcapacitysymbol}{\volume at symbol}
+\DeclareSubscrSymbol{cPs}{\@specific\heatcapacitysymbol}{\pressure at symbol}
+\DeclareSubscrSymbol{kappaT}{\compressibilitysymbol}{\temperature at symbol}
+\DeclareSubscrSymbol{kappaS}{\compressibilitysymbol}{\entropy at symbol}
+\DeclareSubscrSymbol{alphaP}{\expansivitysymbol}{\pressure at symbol}
+\DeclareSubscrSymbol{alphaS}{\expansivitysymbol}{\entropy at symbol}
+\newcommand*{\sat}{{\text{sat}}}
+\newcommand*{\Psat}{P^\sat}
+\let\Pvap\Psat
+\newcommand*{\phisat}{\phi^\sat}
+\newcommand*{\fsat}{f^\sat}
+\let\std\circ
+\newcommand*{\Pstd}{P^\std}
+\newcommand*{\fstd}{f^\std}
+\newcommand*{\mixing}{{\text{mix}}}
+\newcommand*{\Deltamix}[1]{\Delta{#1}_\mixing}
+\newcommand*{\fusion}{{\text{fus}}}
+\newcommand*{\reaction}{{\text{rxn}}}
+\newcommand*{\sublimation}{{\text{sub}}}
+\newcommand*{\vaporization}{{\text{vap}}}
+\newcommand*{\formation}{f}
+\newcommand*{\Deltafus}[1]{\Delta{#1}^\fusion}
+\newcommand*{\Deltasub}[1]{\Delta{#1}^\sublimation}
+\newcommand*{\Deltavap}[1]{\Delta{#1}^\vaporization}
+\let\Delta at rxn@sym\relax
+\DeclareSubscrSymbol{@DeltarxncP}{\Delta at rxn@sym}{\pressure at symbol,\reaction}
+\DeclareSubscrSymbol{@Deltarxn}{\Delta at rxn@sym}{\reaction}
+\newcommand*{\Deltarxn}[1]{%
+    \def\tmp at arg{#1}%
+    \def\tmp@@arg{\cP}%
+    \ifx\tmp at arg\tmp@@arg\relax
+      \def\@command{\def\Delta at rxn@sym{\Delta\@intensive\heatcapacitysymbol}%
+                    \@DeltarxncP}
+    \else
+      \def\@command{\def\Delta at rxn@sym{\Delta{#1}}\@Deltarxn}
+    \fi
+    \@command
+}
+\let\Delta at f@sym\relax
+\DeclareSubscrSymbol{@Deltaf}{\Delta at f@sym}{f}
+\newcommand*{\Deltaf}[1]{\def\Delta at f@sym{\Delta{#1}}\@Deltaf}
+\newcommand*{\fmix}{\hat{f}}
+\newcommand*{\phimix}{\hat\phi}
+\newcommand*{\fpure}{f}
+\let\phipure\phi
+\let\pm at symbol\relax
+\newcommand*{\partialmolar}[1]{\gdef\pm at symbol{#1}\generic at pm}
+\def\generic at pm{\@ifnextchar_\@generic at pm\@@generic at pm}
+\def\@generic at pm#1#2{%
+    \gdef\pm at arg{#2}%
+    % if nextchar after argument is ^
+    \@ifnextchar^\@@@generic at pm\@@@@generic at pm
+}
+\def\@@@generic at pm#1#2{\thermo at overline{\pm at symbol^{#2}_{\pm at arg}}}
+\def\@@@@generic at pm{\thermo at overline{\pm at symbol_{\pm at arg}}}
+\def\@@generic at pm{\@ifnextchar^\@@@@@generic at pm\@pm at bracket@check}
+\def\@@@@@generic at pm#1#2#3#4{\thermo at overline{\pm at symbol^{#2}_{#4}}}
+\def\@pm at bracket@check{\@ifnextchar[\@pm at bracket@yes\@pm at bracket@no}
+\def\@pm at bracket@yes[#1]#2{\thermo at overline{\pm at symbol^{#1}_{#2}}}
+\def\@pm at bracket@no#1{\thermo at overline{\pm at symbol_{#1}}}
+\newcommand*{\Nt}{\mole at symbol}
+\newcommand*{\Et}{\@extensive\totalenergy at symbol}
+\newcommand*{\Ut}{\@extensive\internalenergy at symbol}
+\newcommand*{\Ft}{\@extensive\Helmholtz at symbol}
+\newcommand*{\Gt}{\@extensive\Gibbs at symbol}
+\newcommand*{\Ht}{\@extensive\enthalpy at symbol}
+\newcommand*{\Lt}{\@extensive\Landau at symbol}
+\newcommand*{\At}{\@extensive\area at symbol}
+\newcommand*{\St}{\@extensive\entropy at symbol}
+\newcommand*{\Vt}{\@extensive\volume at symbol}
+\newcommand*{\Qt}{\@extensive\heat at symbol}
+\newcommand*{\Wt}{\@extensive\work at symbol}
+\newcommand*{\Mt}{\@extensive M}
+\newcommand*{\Bt}{\@extensive B}
+\newcommand*{\Em}{\@intensive\totalenergy at symbol}
+\newcommand*{\Um}{\@intensive\internalenergy at symbol}
+\newcommand*{\Fm}{\@intensive\Helmholtz at symbol}
+\newcommand*{\Gm}{\@intensive\Gibbs at symbol}
+\newcommand*{\Hm}{\@intensive\enthalpy at symbol}
+\newcommand*{\Lm}{\@intensive\Landau at symbol}
+\newcommand*{\Am}{\@intensive\area at symbol}
+\newcommand*{\Sm}{\@intensive\entropy at symbol}
+\newcommand*{\Vm}{\@intensive\volume at symbol}
+\newcommand*{\Qm}{\@intensive\heat at symbol}
+\newcommand*{\Wm}{\@intensive\work at symbol}
+\newcommand*{\Mm}{\@intensive M}
+\newcommand*{\Bm}{\@intensive B}
+\newcommand*{\Us}{\@specific\internalenergy at symbol}
+\newcommand*{\Es}{\@specific\totalenergy at symbol}
+\newcommand*{\Fs}{\@specific\Helmholtz at symbol}
+\newcommand*{\Gs}{\@specific\Gibbs at symbol}
+\newcommand*{\Hs}{\@specific\enthalpy at symbol}
+\newcommand*{\Ls}{\@specific\Landau at symbol}
+\newcommand*{\As}{\@specific\area at symbol}
+\newcommand*{\Ss}{\@specific\entropy at symbol}
+\newcommand*{\Vs}{\@specific\volume at symbol}
+\newcommand*{\Qs}{\@specific\heat at symbol}
+\newcommand*{\Ws}{\@specific\work at symbol}
+\newcommand*{\Ms}{\@specific M}
+\newcommand*{\Bs}{\@specific B}
+\newcommand*{\Epm}{\partialmolar{\totalenergy at symbol}}
+\newcommand*{\Upm}{\partialmolar{\internalenergy at symbol}}
+\newcommand*{\Hpm}{\partialmolar{\enthalpy at symbol}}
+\newcommand*{\Fpm}{\partialmolar{\Helmholtz at symbol}}
+\newcommand*{\Gpm}{\partialmolar{\Gibbs at symbol}}
+\newcommand*{\Apm}{\partialmolar{\area at symbol}}
+\newcommand*{\Spm}{\partialmolar{\entropy at symbol}}
+\newcommand*{\Vpm}{\partialmolar{\volume at symbol}}
+\newcommand*{\Lpm}{\partialmolar{\Omega}}
+\newcommand*{\Mpm}{\partialmolar{M}}
+\newcommand*{\Bpm}{\partialmolar{B}}
+\newcommand*{\cPpm}{%
+  \def\@@@generic at pm##1##2{%
+    \thermo at overline{\pm at symbol^{##2}_{\pressure at symbol,\pm at arg}}}%
+  \def\@@@@generic at pm{\thermo at overline{\pm at symbol_{\pressure at symbol,\pm at arg}}}%
+  \def\@@@@@generic at pm##1##2##3##4{%
+    \thermo at overline{\pm at symbol^{##2}_{\pressure at symbol,##4}}}%
+  \def\@pm at bracket@yes[##1]##2{%
+    \thermo at overline{\pm at symbol^{##1}_{\pressure at symbol,##2}}}%
+  \def\@pm at bracket@no##1{\thermo at overline{\pm at symbol_{\pressure at symbol,##1}}}%
+  \partialmolar{\heatcapacitysymbol}%
+}
+\newcommand*{\cVpm}{%
+  \def\@@@generic at pm##1##2{%
+    \thermo at overline{\pm at symbol^{##2}_{\volume at symbol,\pm at arg}}}%
+  \def\@@@@generic at pm{\thermo at overline{\pm at symbol_{\volume at symbol,\pm at arg}}}%
+  \def\@@@@@generic at pm##1##2##3##4{%
+    \thermo at overline{\pm at symbol^{##2}_{\volume at symbol,##4}}}%
+  \def\@pm at bracket@yes[##1]##2{%
+    \thermo at overline{\pm at symbol^{##1}_{\volume at symbol,##2}}}%
+  \def\@pm at bracket@no##1{\thermo at overline{\pm at symbol_{\volume at symbol,##1}}}%
+  \partialmolar{\heatcapacitysymbol}%
+}
+\newcommand*{\residual}{R}
+\newcommand*{\excess}{E}
+\newcommand*{\UR}{\Um^\residual}
+\newcommand*{\HR}{\Hm^\residual}
+\newcommand*{\FR}{\Fm^\residual}
+\newcommand*{\GR}{\Gm^\residual}
+\newcommand*{\VR}{\Vm^\residual}
+\newcommand*{\SR}{\Sm^\residual}
+\newcommand*{\URt}{\Ut^\residual}
+\newcommand*{\HRt}{\Ht^\residual}
+\newcommand*{\FRt}{\Ft^\residual}
+\newcommand*{\GRt}{\Gt^\residual}
+\newcommand*{\VRt}{\Vt^\residual}
+\newcommand*{\SRt}{\St^\residual}
+\newcommand*{\URs}{\Us^\residual}
+\newcommand*{\HRs}{\Hs^\residual}
+\newcommand*{\FRs}{\Fs^\residual}
+\newcommand*{\GRs}{\Gs^\residual}
+\newcommand*{\VRs}{\Vs^\residual}
+\newcommand*{\SRs}{\Ss^\residual}
+\newcommand*{\URpm}{\partialmolar{\internalenergy at symbol^\residual}}
+\newcommand*{\HRpm}{\partialmolar{\enthalpy at symbol^\residual}}
+\newcommand*{\FRpm}{\partialmolar{\Helmholtz at symbol^\residual}}
+\newcommand*{\GRpm}{\partialmolar{\Gibbs at symbol^\residual}}
+\newcommand*{\VRpm}{\partialmolar{\volume at symbol^\residual}}
+\newcommand*{\SRpm}{\partialmolar{\entropy at symbol^\residual}}
+\newcommand*{\UE}{\Um^\excess}
+\newcommand*{\FE}{\Fm^\excess}
+\newcommand*{\HE}{\Hm^\excess}
+\newcommand*{\GE}{\Gm^\excess}
+\newcommand*{\SE}{\Sm^\excess}
+\newcommand*{\VE}{\Vm^\excess}
+\newcommand*{\UEt}{\Ut^\excess}
+\newcommand*{\FEt}{\Ft^\excess}
+\newcommand*{\HEt}{\Ht^\excess}
+\newcommand*{\GEt}{\Gt^\excess}
+\newcommand*{\SEt}{\St^\excess}
+\newcommand*{\VEt}{\Vt^\excess}
+\newcommand*{\UEs}{\Us^\excess}
+\newcommand*{\FEs}{\Fs^\excess}
+\newcommand*{\HEs}{\Hs^\excess}
+\newcommand*{\GEs}{\Gs^\excess}
+\newcommand*{\SEs}{\Ss^\excess}
+\newcommand*{\VEs}{\Vs^\excess}
+\newcommand*{\UEpm}{\partialmolar{\internalenergy at symbol^\excess}}
+\newcommand*{\HEpm}{\partialmolar{\enthalpy at symbol^\excess}}
+\newcommand*{\FEpm}{\partialmolar{\Helmholtz at symbol^\excess}}
+\newcommand*{\GEpm}{\partialmolar{\Gibbs at symbol^\excess}}
+\newcommand*{\VEpm}{\partialmolar{\volume at symbol^\excess}}
+\newcommand*{\SEpm}{\partialmolar{\entropy at symbol^\excess}}
+\newcommand*{\sumall}{\@ifnextchar_\@sumall\@@sumall}
+\def\@sumall#1#2{\sum_{#2=1}^{\ncomponents}}
+\def\@@sumall#1{\sum_{#1=1}^{\ncomponents}}
+\newcommand*{\sumallbutlast}{\@ifnextchar_\@sumallbutlast\@@sumallbutlast}
+\def\@sumallbutlast#1#2{\sum_{#2=1}^{\ncomponents-1}}
+\def\@@sumallbutlast#1{\sum_{#1=1}^{\ncomponents-1}}
+\newcommand*{\prodall}{\@ifnextchar_\@prodall\@@prodall}
+\def\@prodall#1#2{\prod_{#2=1}^{\ncomponents}}
+\def\@@prodall#1{\prod_{#1=1}^{\ncomponents}}
+\newcommand*{\IG}{{\text{IG}}}
+\newcommand*{\IGM}{{\text{IGM}}}
+\newcommand*{\IS}{{\text{IS}}}
+\newcommand*{\Henryrat}{h}
+\newcommand*{\Henrymol}{{\mathcal{H}}}
+\AtBeginDocument{%
+  \providecommand*{\square}{%
+    \text{\leavevmode
+      \hbox to.77778em{%
+      \hfil\vrule
+      \vbox to.6em{\hrule width.6em\vfil\hrule}%
+      \vrule\hfil}%
+    }%
+  }%
+}
+\newcommand*{\gammarat}{\gamma^\ast}
+\newcommand*{\gammamol}{\gamma^\square}
+\newcommand*{\Jacobian}[4]{\frac{\partial{(#1,#2)}}{\partial{(#3,#4)}}}%
+\endinput
+%%
+%% End of file `thermodynamics.sty'.


Property changes on: trunk/Master/texmf-dist/tex/latex/thermodynamics/thermodynamics.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2022-04-30 20:02:01 UTC (rev 63187)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2022-04-30 20:02:45 UTC (rev 63188)
@@ -779,7 +779,7 @@
     textualicomma texvc
     textcase textfit textglos textgreek textmerg textopo textpath textpos
     tfrupee thaienum thaispec thalie
-    theanodidot theanomodern theanooldstyle theatre theoremref
+    theanodidot theanomodern theanooldstyle theatre theoremref thermodynamics
     thesis-ekf thesis-gwu thesis-qom thesis-titlepage-fhac
     thinsp thmbox thmtools
     threadcol threeddice threeparttable threeparttablex

Modified: trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc	2022-04-30 20:02:01 UTC (rev 63187)
+++ trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc	2022-04-30 20:02:45 UTC (rev 63188)
@@ -224,6 +224,7 @@
 depend tex-ewd
 depend textgreek
 depend textopo
+depend thermodynamics
 depend thmbox
 depend tiscreen
 depend turnstile

Added: trunk/Master/tlpkg/tlpsrc/thermodynamics.tlpsrc
===================================================================


More information about the tex-live-commits mailing list.