summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Master/texmf-dist/doc/latex/diffcoeff/README.txt41
-rw-r--r--Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.pdfbin505283 -> 621459 bytes
-rw-r--r--Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.tex2215
-rw-r--r--Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def121
-rw-r--r--Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty1232
5 files changed, 1982 insertions, 1627 deletions
diff --git a/Master/texmf-dist/doc/latex/diffcoeff/README.txt b/Master/texmf-dist/doc/latex/diffcoeff/README.txt
index 74f14fed4ce..bef6346a728 100644
--- a/Master/texmf-dist/doc/latex/diffcoeff/README.txt
+++ b/Master/texmf-dist/doc/latex/diffcoeff/README.txt
@@ -1,22 +1,29 @@
-README file for LaTeX package: diffcoeff version 1.1
+diffcoeff: a package to ease the writing of a variety
+of differential coefficients (derivatives)
-Author: Andrew Parsloe (ajparsloe@gmail.com) 2018-10-25
+Andrew Parsloe (ajparsloe@gmail.com) 3 December 2018
-diffcoeff.sty allows the easy writing of ordinary and partial differential
-coefficients of arbitrary order. For mixed partial derivatives, the overall
-order (algebraic or numeric) is calculated by the package. Optional arguments
-allow the easy specification of a point of evaluation for ordinary
-derivatives, or variables held constant for partial derivatives, and the
-placement of the differentiand (in the numerator or appended). Some tweaking
-of the display is possible through key = value settings. Secondary commands
-provide analogous coefficients constructed from D, \Delta and \delta and a
-command for writing Jacobians.
+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
-The packages require the LaTeX3 bundles, l3kernel and l3packages.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-There are three files plus this README: diffcoeff.tex, diffcoeff.pdf, and diffcoeff.sty.
+This is version 2 of diffcoeff.sty, and associated files,
+and requires the LaTeX3 bundles l3kernel and l3packages.
-(Version 1.0 of diffcoeff.sty was accompanied by diffcoeffx.sty. However
-that package contained a bug which meant it did not do all the things
-claimed for it. Fixing the bug did not seem feasible without a complete
-rewrite. diffcoeffx is now withdrawn.) \ No newline at end of file
+Version 2 is built on xtemplate (in l3packages). As a result,
+the \diffset command of version 1 is now functionless and has
+been superseded by the more versatile \diffdef command.
+
+Manifest
+%%%%%%%%
+README.txt this document
+diffcoeff.sty LaTeX .sty file
+diffcoeff.pdf documentation
+diffcoeff.tex LaTeX source of documentation
+diffcoeff-doc.def definition file to be placed
+ in same directory as the .pdf
+ and .tex files
diff --git a/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.pdf b/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.pdf
index 5753b9ff419..f7f63e84712 100644
--- a/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.pdf
+++ b/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.tex b/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.tex
index c8df6968c63..8f1d147fe0e 100644
--- a/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.tex
+++ b/Master/texmf-dist/doc/latex/diffcoeff/diffcoeff.tex
@@ -6,10 +6,21 @@
\renewcommand{\ttdefault}{lmtt}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
-\setcounter{secnumdepth}{2}
-\setcounter{tocdepth}{2}
+\setcounter{secnumdepth}{4}
+\setcounter{tocdepth}{4}
+\usepackage{color}
+\definecolor{shadecolor}{rgb}{1, 0.667969, 0.5}
+\usepackage{babel}
+\usepackage{wrapfig}
\usepackage{booktabs}
-\usepackage{amstext}
+\usepackage{calc}
+\usepackage{framed}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage[unicode=true,pdfusetitle,
+ bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2,
+ breaklinks=true,pdfborder={0 0 0},pdfborderstyle={},backref=section,colorlinks=true,pdfpagemode=FullScreen]
+ {hyperref}
\makeatletter
@@ -30,1243 +41,1485 @@
\normalfont\ttfamily}%
\item[]}
{\end{list}}
-\providecommand*{\strong}[1]{\textbf{#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands.
-\usepackage{diffcoeff}
+\usepackage[def-file=diffcoeff-doc]{diffcoeff}
-\@ifundefined{showcaptionsetup}{}{%
- \PassOptionsToPackage{caption=false}{subfig}}
-\usepackage{subfig}
\makeatother
-\usepackage{babel}
\begin{document}
\title{\texttt{diffcoeff}~\\
-a \LaTeX{} package for writing\texttt{}~\\
-differential coefficients easily}
+a \LaTeX{} package to ease\texttt{ }the\texttt{}~\\
+ writing of differential coefficients \\
+in all their variety\\
+Version 2}
\author{Andrew Parsloe\\
{\small{}(ajparsloe@gmail.com)}}
\maketitle
\begin{abstract}
-\noindent \texttt{diffcoeff.sty} allows the easy writing of ordinary and
-partial differential coefficients of arbitrary (algebraic or numeric) order.
-For mixed partial derivatives, the overall order (the superscript on $\partial$
-in the numerator) is calculated by the package. Optional arguments allow
-the easy specification of a point of evaluation for ordinary derivatives,
-or variables held constant for partial derivatives, and the placement of
-the differentiand (in the numerator or appended). Some tweaking of the
-display is possible through key = value settings. Secondary commands provide
-analogous coefficients constructed from $D,\thinspace\Delta,$ and $\delta$,
-and a command for writing Jacobians. The package uses \texttt{expl3} and
-\texttt{xparse} from the \LaTeX 3 bundles, \texttt{l3kernel} and \texttt{l3packages}.
+\noindent \texttt{diffcoeff.sty} allows the easy and consistent writing
+of ordinary, partial and other derivatives of arbitrary (algebraic or numeric)
+order. For mixed partial derivatives, the total order of differentiation
+is calculated by the package. Optional arguments allow specification of
+points of evaluation (ordinary derivatives), or variables held constant
+(partial derivatives), and the placement of the differentiand (numerator
+or appended). Version 2 is built on \texttt{xtemplate,} allowing the systematic
+fine-tuning of the display and generation and use of variant forms (like
+derivatives built from $D$, $\Delta$ or $\delta$). The package requires
+the \LaTeX 3 bundles \texttt{l3kernel} and \texttt{l3packages}.
\end{abstract}
+\tableofcontents{}
-\section{Version}
-
-Version 1.1 of the \texttt{diffcoeff} package changes the handling of error
-messages which was just plain wrong in version 1 and caused a conflict
-with the \texttt{mhchem} package.
-
-\texttt{diffcoeff.sty} had a `big brother' \texttt{diffcoeffx.sty} that
-was `\texttt{diffcoeff} on steroids'. However a bug in \texttt{diffcoeffx}
-means it didn't do all it claimed and it will be withdrawn.
-
-\section{Requirements}
+\section{Introduction}
The \LaTeX{} package \texttt{diffcoeff.sty} is written in the expl3 language
of \LaTeX 3\texttt{ }and requires the bundles \texttt{l3kernel} and \texttt{l3packages}
-(the latter for the \texttt{xparse} module). However, granted the presence
-of these bundles in your \TeX{} distribution, the \LaTeX 3 element should
-be invisible to the user.
-
-The package is invoked in the usual way by entering
+(the latter for the \texttt{xparse}, \texttt{l3keys2e} and \texttt{xtemplate}
+packages\texttt{)}. The package is invoked in the usual way by entering
\begin{lyxcode}
\textbackslash usepackage\{diffcoeff\}
\end{lyxcode}
-in the preamble of your document.
-
-\paragraph{Note on terminology}
+in the preamble of your document. There are two package options. The first
+is a switch, \texttt{ISO}, which turns on formatting conforming to ISO
+recommendations:
+\begin{lyxcode}
+\textbackslash usepackage{[}ISO{]}\{diffcoeff\}
+\end{lyxcode}
+The effect of this is discussed in Section~\ref{sec:Changing-defaults}.
+The second is a filename for a file containing definitions of variant forms
+of derivative:
+\begin{lyxcode}
+\textbackslash usepackage{[}def-file=<filename>{]}\{diffcoeff\}
+\end{lyxcode}
+This is discussed in Subsection~\ref{subsec:The-.def-file}. Of course
+both options can be used in the same call if desired:
+\begin{lyxcode}
+\textbackslash usepackage{[}ISO,def-file=<filename>{]}\{diffcoeff\}
+\end{lyxcode}
+For the present document, the call was
+\begin{lyxcode}
+\textbackslash usepackage{[}def-file=diffcoeff-doc{]}\{diffcoeff\}
+\end{lyxcode}
+with the file \texttt{diffcoeff-doc.def} in the same directory as \texttt{diffcoeff.tex}.
+
+\subsection{Version comparison}
+
+The present document discusses \emph{version 2} of the \texttt{diffcoeff}
+package. Unlike version 1, version 2 is built on the the \texttt{xtemplate}
+package (included in the \texttt{l3packages} bundle) which makes certain
+facilities available which it would be silly not to exploit. Hence the
+coding between the versions is completely different and there are consequences.
+
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{shaded}%
+\begin{enumerate}
+\item The \texttt{\textbackslash diffset} command, formerly used to tweak the
+display of derivatives, has been superseded by the \texttt{\textbackslash diffdef}
+command. \texttt{\textbackslash diffset} now sends a message warning of
+its obsolescence to the terminal and \LaTeX{} log but is otherwise functionless.
+It should not interfere with the compilation of a document but any intended
+fine-tuning of the display by means of the \texttt{\textbackslash diffset}
+command\texttt{ }will not eventuate. The warning message is: \texttt{Obsolete
+command: \textbackslash diffset has been superseded by the \textbackslash diffdef
+command. See the diffcoeff documentation for further information.} The
+\texttt{\textbackslash diffdef} command is discussed in Subsection~\ref{subsec:diffdef}.
+\item The optional trailing argument used to indicate a point of evaluation or
+variables held constant is now delimited by square brackets, \texttt{{[}}
+and \texttt{{]}}, as other optional arguments are. For compatibility with
+version 1, braces can still be used but their use to delimit an \emph{optional}
+argument is now deprecated in \texttt{xparse} on which \texttt{diffcoeff}
+depends. Presumably at some stage this provision will be removed from \texttt{xparse}.
+For future-proofing documents use square brackets.
+\item The commands \texttt{\textbackslash Diff}, \texttt{\textbackslash diffd}
+and \texttt{\textbackslash Diffd} used to construct derivatives from $D$,
+$\delta$ and $\Delta$ in version 1, are still available in version 2,
+but deprecated. A new optional argument in the \texttt{\textbackslash diff}
+command offers these and a host of other possibilities and is now the preferred
+method of forming such variants; see Subsection~\ref{subsec:D-delta-Delta}.
+\end{enumerate}
+\end{shaded}%
+\end{minipage}
+
+\subsubsection*{Note on terminology}
I refer throughout to the quantity or function being differentiated as
the \emph{differentiand} (in line with \emph{integrand}, \emph{operand},
etc.).
-\section{Ordinary differential coefficients \label{sec:Ordinary-differential-coefficien}}
+\section{A Rogues' Gallery of derivatives}
+
+\label{sec:Rogues'-gallery}Browsing through texts on statistical mechanics,
+relativity and classical mechanics I find the following choice examples
+of derivatives `disporting every which way'.
+
+Multi-character variables of differentiation un-parenthesized:
+
+\begin{equation}
+\diffp{\frac{\psi}{\Theta}}{\frac{1}{\Theta}},\quad\diffp{E/T}{1/T},\quad\diffp{\ln f}{\ln x_{0}},\quad\diffp\psi{a_{i},\frac{1}{\Theta}},\quad\diffp{\mathcal{L}}{\eta_{,i}^{(r)}}\label{eq:eg1}
+\end{equation}
+Multi-character variables of differentiation parenthesized:
+\begin{equation}
+\diffp H{\displaystyle \diffp S{q_{k}}[]},\quad\diffp\varepsilon{(1/\Theta)},\label{eq:eg2}
+\end{equation}
+Higher-order derivatives where the parentheses do not or do include the
+operator:
+\begin{equation}
+\diffp[2]q{\frac{1}{\Theta}},\quad\diffp[2]q{1/\Theta},\quad\diffp[2]\varepsilon{a_{i}},\quad\diff.wrapall.[2]{\phi^{i}(x^{i})}{x^{i}}.\label{eq:eg3}
+\end{equation}
+Should the $d$ or $\partial$ be included within the parentheses, as in
+the last of (\ref{eq:eg3}), or not, as in the others? Logic says `yes';
+practice suggests (generally) `no'.
+
+Indicating a point of evaluation is similarly varied:
+\begin{equation}
+\diff.pvrule.\phi\varepsilon[\varepsilon=\varepsilon_{0}],\quad\diff.pvrule.[2]\phi\varepsilon[\varepsilon=\varepsilon_{0}],\quad\diff.psqbra.{b^{\beta}}{a^{\alpha}}[b=0],\quad\diff.paren.uv[v=0].\label{eq:eg4}
+\end{equation}
+ ISO 80000-2 (item 2.11.13) favours the last of these \textendash{} parentheses
+\textendash{} for ordinary derivatives. Presumably, partial derivatives
+should follow suit, although parentheses are also used to indicate variables
+held constant:
+\begin{equation}
+\diffp*{\frac{P}{T}}U[V],\quad\diffp S{N_{2}}[U,V,N_{1}],\quad\diffp S/T[V].\label{eq:eg5}
+\end{equation}
+
+Other symbols besides $d$ and $\partial$ are used to denote derivative-like
+quantities. From introductory calculus, classical mechanics and thermodynamics
+come $\delta$ and $\Delta$, from fluid mechanics comes $D$:
+\begin{equation}
+\diff.delta.yx,\quad\diff.D.\rho t,\quad\diff.pDelta.UT[V],\quad\diff.Delta.U/T,\quad\diff.delta.{\mathcal{L}}{\eta^{(r)}}.\label{eq:eg6}
+\end{equation}
+
+There are those, like the International Organization for Standardization
+(ISO), who stipulate (or prefer) an upright `d' for their derivatives:
+\begin{equation}
+\diff.up.yx.\label{eq:eg11}
+\end{equation}
+When the differentiand is too big or awkward to sit in the numerator and
+is appended to the operator, the $d$ or $\partial$ in the numerator is
+generally centred \textendash{} but not always. In texts prior to the age
+of computerised typesetting one will sometimes find the symbol pushed to
+the \emph{left}:
+\begin{equation}
+\diff.pleft.*{\diffp{x^{i^{*}}}{x^{k^{*}}}{}}{x^{l^{*}}},\quad\diff.left.*{\left(\frac{m\mathbf{q}_{x}}{\sqrt{1-q^{2}}}\right)}{t}.\label{eq:eg12}
+\end{equation}
+The observant will note an italic adjustment with the first expression,
+so that the $\partial$ in the numerator and the $\partial$ in the denominator
+line up in a slanting column, but no such adjustment for the $d$-s in
+the second derivative.
+
+And finally, the operator in the numerator may differ from that in the
+denominator. For instance, in tensor calculus acceleration is sometimes
+written as
+\[
+\diff.nabla.{v^{i}}t=\diff{v^{i}}t+\Gamma_{k\hphantom{i}h}^{\hphantom{k}i}v^{h}\diff{y^{k}}t
+\]
+where $\nabla v^{i}$ is the `absolute differential' of the velocity
+$v^{i}$.
+
+Version 2 of the \texttt{diffcoeff} package has the generative power to
+cope with all these variations \textendash{} see Section~\ref{sec:Changing-defaults}
+\textendash{} although it is unlikely an author should need to call on
+this capacity to anything like the extent required for this Rogues' Gallery.
+
+\section{Ordinary derivatives \label{sec:Ordinary-derivatives}}
Writing\textbf{ }\texttt{\textbackslash diff\{y\}\{x\}} will produce $\diff{y}{x}$
-in text style (i.e. placed between \texttt{\$ \$}) or
+in text style (i.e., placed between \texttt{\$ \$}) or
\[
\diff{y}{x}
\]
-in display style (i.e. placed between \texttt{\textbackslash{[} \textbackslash{]}}
+in display style (i.e., placed between \texttt{\textbackslash{[} \textbackslash{]}}
). In fact \texttt{\textbackslash diff yx} (omitting the braces) will
produce these results, with a saving on keystrokes. The braces are needed
-only when differentiand or variable of differentiation is more than a single
-token.
+only when an argument \textendash{} differentiand, variable of differentiation
+\textendash{} is more than a single token.
+\begin{itemize}
+\item If you want upright `$\mathrm{d}$'s as default, as ISO 80000-2 recommends,
+rather than the math-italic `$d$'s I am using, this can easily be done;
+see Section~\ref{sec:Changing-defaults} on changing default settings.
+\end{itemize}
+For inclusion in a line of text you might prefer to use a slash-fraction
+form of derivative. That is achieved by inserting a slash, `/', between
+numerator and denominator arguments: \texttt{\textbackslash diff \{\textbackslash ln
+x\}/x} produces $\diff{\ln x}/x$. (Braces are required for the numerator
+in this case since it contains more than one token.)
-There is one other form: we can insert a slash, `/', between numerator
-and denominator: \texttt{\textbackslash diff f/x} produces $\diff f/x$
-which may be preferred for textstyle differential coefficients on occasion.
-Nothing is gained in this particular instance. It is quicker to type the
-five keystrokes d, f, /, d, x than it is to type the nine of \textbackslash ,
-d, i, f, f, , f, /, x but there are occasions when this is not always the
-case.
+\subsection{Order of differentiation}
An optional first argument allows the order of differentiation to be specified.
The order need not be a number; an algebraic order of differentiation is
-perfectly acceptable or, indeed, a mix:
-\begin{example}
-\textbackslash diff{[}2{]}\{y\}\{x\} $\Longrightarrow\quad{\displaystyle \diff[2]{y}{x},}$\medskip{}
-
-\textbackslash diff{[}n+1{]}\{y\}\{x\} $\Longrightarrow\quad{\displaystyle \diff[n+1]{y}{x}}.$
-\end{example}
-
-(And again the braces can be omitted for single letters like \textbf{x}
-and \textbf{y}.)
-
-In slash style, \texttt{\textbackslash diff{[}2{]}f/x} (11 keystrokes)
-produces $\diff[2]f/x$, not significantly more typing than \texttt{d\textasciicircum 2f/dx\textasciicircum 2}
-(9 keystrokes).
-
-If you want to specify a point at which the derivative is evaluated, append
-a final optional argument, but note that it is given in \emph{braces} rather
-than square brackets:
+perfectly acceptable as is a mix of the two:
\begin{example}
-\textbackslash diff{[}2{]}\{y\}\{x\}\{0\} $\Longrightarrow\quad{\displaystyle \diff[2]{y}{x}{0}}$
-\end{example}
+\textbackslash diff{[}2{]}yx $\Longrightarrow\quad{\displaystyle \diff[2]yx,}$\medskip{}
-\noindent (In this example it seems neater \emph{not} to finish with a
-full stop or other punctuation.) The use of braces means that the differential
-coefficient can be followed immediately by a mathematical expression wrapped
-in \texttt{\textbackslash\{ \textbackslash\}}, or \texttt{{[} {]}},
-without the expression being confused with the (final) optional argument.
-Note also that there must be \emph{no space} before the argument: it follows
-\emph{immediately} on the second mandatory argument (if it follows at all).
-
-We could save a few keystrokes by writing this last example as \texttt{\textbackslash diff{[}2{]}yx\{0\}}.
-The braces around the final optional argument can \emph{not} be omitted
-\textendash{} otherwise there is no way of knowing that it \emph{is }the
-final optional argument and not part of a following expression.
-
-In slash style, the trailing optional argument can be used, but perhaps
-should not be. It looks ugly:
-\begin{example}
-\textbackslash diff{[}2{]}y/x\{0\} $\Longrightarrow\quad{\displaystyle \diff[2]{y}/{x}{0}}$
+\textbackslash diff{[}n+1{]}yx $\Longrightarrow\quad{\displaystyle \diff[n+1]yx}.$
\end{example}
-Slash style is a more casual rendering of the derivative, intended for
-inline use within text and it would be better to use a phrase like `evaluated
-at zero'.
-
-\subsection{\textbackslash diffset: formatting tweaks}
-
-There are a number of tweaks one can make to the display of a derivative.
-Many people now use upright (roman) forms for the `d's of a differential
-coefficient, rather than math italic. To do this, put the command
+As mentioned, the braces can be and have been omitted around the $x$ and
+$y$; the square brackets around the optional argument, the order of differentiation,
+are essential. For a first-order derivative, no optional argument is needed
+and entering \texttt{1} as the optional argument has no effect:
\begin{example}
-{\footnotesize{}\textbackslash}diffset{[}roman = true{]}
+\textbackslash diff{[}1{]}yx $\Longrightarrow\quad{\displaystyle \diff[1]yx.}$
\end{example}
-\noindent in the preamble of your document (following the \texttt{\textbackslash usepackage\{diffcoeff\}}
-of course). The default is math italic.
+\noindent In slash style, \texttt{\textbackslash diff{[}2{]}y/x} produces
+$\diff[2]y/x$, and \texttt{\textbackslash diff{[}n+1{]}y/x} produces
+$\diff[n+1]y/x$.
-It is possible that you may want more space between the `d' in the numerator
-of a differential coefficient and the superscripted order of the derivative.
-Using an upright `d' alleviates this problem, but if using the default
-math italic for the `d's, the separation can be altered by using the
-\begin{example}
-\textbackslash diffset{[}d-sep = $n${]}
-\end{example}
-
-\noindent command which adds an extra $n$~mu to \TeX 's spacing. The
-default value for $n$ is 1 (i.e. 1~mu). The new separation will affect
-all derivatives following the new setting. Put in the preamble, the new
-separation will be document-wide.
+\subsection{Multi-character variables of differentiation}
-A third tweak changes the delimiters used to indicate the point of evaluation.
-By default there is nothing on the left side and a vertical rule with the
-point of evaluation subscripted to it on the right. You may prefer subscripted
-parentheses. In that case write
-\begin{example}
-\textbackslash diffset{[}d-delims~=~(){]}\textmd{.}
-\end{example}
-
-Whatever delimiters you choose need to work with \LaTeX 's \texttt{\textbackslash left}
-and \texttt{\textbackslash right} commands and consist of exactly two
-tokens. \texttt{{[}} and \texttt{{]}}\textbf{ }are acceptable as also are
-pairs like \texttt{\textbackslash lceil \textbackslash rceil}, \texttt{\textbackslash lfloor
-\textbackslash rfloor} but if you want to use \texttt{\textbackslash\{}\textbf{
-}and\textbf{ }\texttt{\textbackslash\}} you need to place the \texttt{\textbackslash diffset}
-command between maths delimiters. The default pair, as indicated, is \texttt{. |},
-t or full stop being \LaTeX 's way of suppressing (in this case) the left
-delimiter.
-
-If you change the delimiters, say to \textbf{( )}, then the position of
-the subscript may need adjusting. To do this, use the command
-\begin{example}
-\textbackslash diffset{[}d-nudge = $n${]}
-\end{example}
-
-A suggested setting for parentheses \textbf{( )} is $-6$ (in fact $-6$~mu
-but the `mu' is supplied by \texttt{diffcoeff}). Thus the total change
-would be
-\begin{example}
-\textbackslash diffset{[}d-delims = ( ), d-nudge = -6{]}
-\end{example}
-
-producing, for example,
-\begin{example}
-\textbackslash diff{[}n{]}\{y\}\{x\}\{0\} $\diffset[d-delims=(),d-nudge=-6]\Longrightarrow\quad{\displaystyle \diff[n]{y}{x}{0}}.$
-\end{example}
-
-The default setting for \textbf{. |} is 0. Simply writing
-\begin{example}
-\textbackslash diffset $\diffset$
-\end{example}
-
-will return all settings to their defaults.
-
-\subsection{Variations}
-
-\subsubsection{Appending the differentiand: \textbackslash diff{*}}
-
-If you want the differentiand to follow the differential coefficient rather
-than sit in the numerator, perhaps because it is a fraction itself or because
-it is long, like a polynomial ($ax^{2}+bx+c$), then one way to achieve
-that is to leave the first mandatory argument in the \texttt{\textbackslash diff}
-command empty and immediately follow the differential operator with the
-differentiand:
-\begin{example}
-\textbackslash diff\{\}\{x\}(ax\textasciicircum 2+bx+c) $\Longrightarrow\quad{\displaystyle \diff{}{x}(ax^{2}+bx+c)}.$
-\end{example}
-
-Another is to use the star form of the \texttt{\textbackslash diff }command,
-\begin{example}
-\textbackslash diff{*}{[}2{]}\{\textbackslash frac\{F(x)\}\{G(x)\}\}\{x\}
-$\Longrightarrow\quad{\displaystyle \diff*[2]{\frac{F(x)}{G(x)}}{x}.}$
-\end{example}
-
-\noindent The LaTeX expression can be harder to read if, as here, one is
-using a command like \texttt{\textbackslash frac} with its own pairs of
-braces, but it is much easier, if one isn't sure whether the differentiand
-should be appended or in the numerator, simply to insert or delete an asterisk
-than move the differentiand from one place to the other. The star form
-becomes especially useful if you want to both append the differentiand
-\emph{and }indicate the point of evaluation, since it saves having to set
-up the \texttt{\textbackslash left.} and \texttt{\textbackslash right|}\textbf{
-}delimiters and the subscript:
-\begin{example}
-\textbackslash diff{*}\{\textbackslash frac\{F(x)\}\{G(x)\}\}\{x\}\{0\}
-$\Longrightarrow\quad{\displaystyle \diffset[d-delims=.|,d-nudge=0]\diff*{\frac{F(x)}{G(x)}}{x}{0}}$
-\end{example}
-
-In slash style with the star option, an example above becomes
-\begin{example}
-\textbackslash diff{*}\{(ax\textasciicircum 2+bx+c)\}/\{x\} $\Longrightarrow\quad\text{\ensuremath{{\displaystyle \diff*{(ax^{2}+bx+c)}/{x}}}}$,
-\end{example}
-
-where the derivative is automatically enclosed in parentheses by \texttt{diffcoeff}.
-
-\subsubsection{Multi-character variables of differentiation}
-
-Derivatives of a function-of-a-function may require forming a differential
-coefficient in which the variable of differentiation is more complicated
-than a single symbol like \texttt{x} or \texttt{\textbackslash alpha}.
-For instance, to differentiate $\ln x^{2}$ (the logarithm of $x^{2}$)
-one first differentiates in $x^{2}$ then in $x$. The initial differentiation
-can be rendered
-\begin{example}
-\textbackslash diff\{\textbackslash ln x\textasciicircum 2\}\{x\textasciicircum 2\}
-$\Longrightarrow\quad{\displaystyle \diff{\ln x^{2}}{x^{2}}}$; \medskip{}
-
-diff\{\textbackslash ln x\textasciicircum 2\}/\{x\textasciicircum 2\}
-$\Longrightarrow\quad{\displaystyle \diff{\ln x^{2}}/{x^{2}}}.$
-\end{example}
-
-\noindent Because of the superscript in the variable of differentiation
-$x^{2}$, parentheses have been automatically inserted in the denominator.
-This does not happen in a first-order derivative unless there is a superscript
-present. For instance,
+Differentiating a function of a function may involve a multi-character
+differentiation variable. For instance, to differentiate $\ln\sin x$ in
+$x$ means forming the product
\begin{example}
\textbackslash diff\{\textbackslash ln\textbackslash sin x\}\{\textbackslash sin
-x\} $\Longrightarrow\quad{\displaystyle \diff{\ln\sin x}{\sin x}.}$
+x\}\textbackslash diff\{\textbackslash sin x\}x $\Longrightarrow\quad{\displaystyle \diff{\ln\sin x}{\sin x}\diff{\sin x}x.}$
\end{example}
-\noindent displays without parentheses. However, for higher order derivatives
-parentheses are \emph{always} inserted to avoid confusion:
+\noindent Forming the \emph{second} derivative of $\ln\sin x$ will now
+involve forming (among other quantities)
\begin{example}
\textbackslash diff{[}2{]}\{\textbackslash ln\textbackslash sin x\}\{\textbackslash sin
x\} $\Longrightarrow\quad{\displaystyle \diff[2]{\ln\sin x}{\sin x}.}$
\end{example}
+\noindent Parentheses have been inserted automatically by \texttt{diffcoeff}
+around $\sin x$ in the denominator to avoid any visual hint that we are
+differentiating in the sine of the square of $x$.
-\paragraph{Positioning the d in the numerator}
+The question is: are the parentheses in the right place? Logically, no.
+They should include the $d$: $(d\sin x)^{2}$ \textendash{} it is the
+differential $d\sin x$ that is of the second order. But as the examples
+in the Rogues' Gallery show \textendash{} see particularly (\ref{eq:eg3})
+\textendash{} the inclination seems to be to do otherwise. This may be
+because one wants, in any case, to parenthesise the variable. A second,
+outer pair of parentheses then seems fussy and distracting:
+\[
+\diff.wrapall.[2]{f(x)}{(1/x)}.
+\]
-When appending a differentiand, you may want to change the position of
-the `d' in the numerator, particularly if the variable of differentiation
-is a multi-character symbol or the order of differentiation is a multi-character
-value like $n+1$.
+Customary but illogical notations are familiar in mathematics \textendash{}
+think of the position of the superscripts in an identity like $\sin^{2}\theta+\cos^{2}\theta=1$.
+But, like other features of the derivative, the manner of this wrapping
+in parentheses of long variables for \emph{higher order} derivatives is
+customisable; see Section~\ref{sec:Changing-defaults}.
-If you `manually' append the differentiand, then there are various ways
-of altering the placement of the `d' from the default midpoint: use \texttt{\textbackslash hfill}
-to push it hard to the left; use \texttt{\textbackslash hfil} to\textbf{
-}push it to the left an intermediate amount; use \texttt{\textbackslash hphantom}
-or \texttt{\textbackslash hspace}, both with a braced argument, to push
-it to the left some custom amount; use \texttt{\textbackslash hspace}\textbf{
-}with a \emph{negative} braced argument to push it to the right.\emph{
-}These same means can be used to shift the `d' when using the starred
-form of \texttt{\textbackslash diff}.\textbf{ }The effect is exactly the
-same, too:
+For first order derivatives, parenthesising does not occur. If you want
+the variable of differentiation to be parenthesised, you need to insert
+them yourself:
\begin{example}
-\textbackslash diff{[}n+1{]}\{\textbackslash hphantom\{\textbackslash sin
-x\}\}\{\textbackslash sin x\}\textbackslash ln\textbackslash sin x $\Longrightarrow\quad{\displaystyle \diff[n+1]{\hphantom{\sin x}}{\sin x}\ln\sin x},$\medskip{}
-
-\textbackslash diff{*}{[}n+1{]}\{\textbackslash hphantom\{\textbackslash sin
-x\}\textbackslash ln\textbackslash sin x\}\{\textbackslash sin x\} $\Longrightarrow\quad{\displaystyle \diff*[n+1]{\hphantom{\sin x}\ln\sin x}{\sin x}}.$
+\textbackslash diff \{f(x)\}\{1/x\}, \textbackslash quad\textbackslash diff
+\{f(x)\}\{(1/x)\} $\Longrightarrow\quad{\displaystyle \diff{f(x)}{1/x},\quad\diff{f(x)}{(1/x)}.}$
\end{example}
-\noindent In the starred form \texttt{diffcoeff} understands that the formatting
-is not appended with the differentiand but stays in the numerator. (But
-a \emph{second} \texttt{\textbackslash hphantom} or \texttt{\textbackslash hfil}
-etc. would be appended.) These are to be compared with
-\begin{example}
-\textbackslash diff{*}{[}n+1{]}\{\textbackslash ln\textbackslash sin
-x\}\{\textbackslash sin x\} $\Longrightarrow\quad{\displaystyle \diff*[n+1]{\ln\sin x}{\sin x},}$
-\end{example}
-where no phantom has been used. Which is better? Deleting the asterisk
-gives
-\begin{example}
-\textbackslash diff{[}n+1{]}\{\textbackslash ln\textbackslash sin x\}\{\textbackslash sin
-x\} $\Longrightarrow\quad{\displaystyle \diff[n+1]{\ln\sin x}{\sin x},}$
-\end{example}
+\subsection{Appending the differentiand: \texttt{\textbackslash diff{*}}}
-In slash style, the phantom (or \texttt{\textbackslash hfil} etc.) is
-ignored:
+Some differentiands are too big or awkward to be placed neatly in the numerator
+of a derivative and it is natural to append them to a preceding differential
+operator. One way to do this is to leave the numerator argument empty in
+the \texttt{\textbackslash diff} command and follow the command with the
+differentiand. A better way is to star the \texttt{\textbackslash diff}
+command. This tells \texttt{diffcoeff} to append the differentiand. Thus
+suppose the differentiand is a polynomial, say $ax^{2}+bx+c$. Add a star
+(an asterisk) to the \texttt{\textbackslash diff} command:
\begin{example}
-\textbackslash diff{*}{[}n+1{]}\{\textbackslash hphantom\{\textbackslash sin
-x\textbackslash sin x\textbackslash sin x\}\textbackslash ln\textbackslash sin
-x\}/\{\textbackslash sin x\} $\Longrightarrow\quad{\displaystyle \diff*[n+1]{\hphantom{\sin x\sin x\sin x}\ln\sin x}/{\sin x}}.$
+\textbackslash diff{*}\{(ax\textasciicircum 2+bx+c)\}x $\Longrightarrow\quad{\displaystyle \diff*{(ax^{2}+bx+c)}x.}$
\end{example}
-
-\subsubsection{Iterated derivatives}
-
-A second derivative is an iterated derivative, i.e., one in which a differential
-coefficient forms the differentiand of another differential coefficient:
+A virtue of using an asterisk is that if one isn't sure whether a differentiand
+should be appended or not, it is an easy matter to simply insert or delete
+the asterisk to compare the results. For example, a second derivative is
+an iterated derivative \textendash{} one in which a derivative forms the
+differentiand of another derivative:
\begin{example}
\textbackslash diff{[}2{]}yx = \textbackslash diff{*}\{\textbackslash diff
-yx\}x $\Longrightarrow{\displaystyle \diff[2]yx=\diff*{\diff yx}x},$
+yx\}x $\Longrightarrow\quad{\displaystyle \diff[2]yx=\diff*{\diff yx}x},$
\end{example}
-or even
+\noindent which is more elegant to my eye than
\begin{example}
\textbackslash diff{[}2{]}yx = \textbackslash diff\{\textbackslash diff
-yx\}x $\Longrightarrow{\displaystyle \diff[2]yx=\diff{\diff yx}x},$
+yx\}x $\Longrightarrow\quad{\displaystyle \diff[2]yx=\diff{\diff yx}x},$
\end{example}
-where omission of unnecessary braces has aided readability. Note how easy
-it is to switch between the different forms on the right, simply by inserting
-or removing an asterisk.
-
-\subsection{Forming `derivatives' with D, \textbackslash Delta, \textbackslash delta}
+\noindent although whether the \emph{meaning} is clearer is moot.\emph{
+}It is easy to switch between the two forms on the right, simply by inserting
+or removing the asterisk.
-Often one wants to construct analogues of a differential coefficient but
-with symbols other than $d$ or $\partial$. The \texttt{diffcoeff} package
-offers three alternatives, all with the same pattern of optional and mandatory
-arguments as for \texttt{\textbackslash diff}, except for the slash form.
-There is \emph{no} slash option.
-
-An uppercase $D$ is used in place of $d$ for the \emph{material} or \emph{substantive}
-derivative of a quantity in (for example) fluid dynamics. Write \texttt{\textbackslash Diff}
-to invoke this command:\footnote{The \texttt{\textbackslash diffp} command, the partial derivative, in
-the example is discussed in the next section.}
+In slash style with the star option, the polynomial example becomes
\begin{example}
-\textbackslash Diff\{\textbackslash rho\}\{t\}=\textbackslash diffp\textbackslash rho
-t + \textbackslash mathbf\{u\textbackslash cdot\}\textbackslash nabla\textbackslash rho
-$\Longrightarrow{\displaystyle \Diff{\rho}{t}=\diffp\rho t+\mathbf{u\cdot}\nabla\rho.}$
+\textbackslash diff{*}\{(ax\textasciicircum 2+bx+c)\}/x $\Longrightarrow\quad\text{\ensuremath{{\displaystyle (\diff{}/{x})(ax^{2}+bx+c)}}, }$
\end{example}
-(The braces could also be removed from the arguments of \texttt{\textbackslash Diff}
-as they have been from the arguments of \texttt{\textbackslash diffp}.)\texttt{ }
+\noindent where the parentheses around the differential operator are automatically
+inserted by \texttt{diffcoeff}. Like other elements of automatic formatting,
+this is user-adjustable; see Section~\ref{sec:Changing-defaults}.
-The `D's are romanised (along with the `d's of ordinary derivatives)
-with the
-\begin{example}
-\textbackslash diffset{[}roman = true{]}
-\end{example}
-
-command. The default is math italic.
+\subsection{Point of evaluation\label{subsec:Point-of-evaluation}}
-The command \texttt{\textbackslash diffd} will form a fraction often used
-in introductory calculus texts (and other places):\footnote{I considered using \texttt{\textbackslash diffg} for this command as in
-`diff greek' but decided that the more likely mind-phrase is `diff delta',
-leading to the use of `d' rather than `g'.}
+If you want to specify a point at which the derivative is evaluated, append
+a final optional argument. Note that there \emph{must be no space} before
+the left square bracket of the argument:
\begin{example}
-\textbackslash diffd\{y\}\{x\} $\Longrightarrow{\displaystyle \diffd yx.}$
+\textbackslash diff{[}2{]}yx{[}0{]} $\Longrightarrow\quad{\displaystyle \diff[2]yx[0]}$
\end{example}
-Similarly, \texttt{\textbackslash Diffd} forms a fraction with $\Delta$:
+\noindent If a space does slip in before the final optional argument, it
+will not cause a \LaTeX{} error. Instead, the argument will be treated as
+a square-bracketed mathematical expression following the derivative, and
+typeset as such.
+\begin{itemize}
+\item If you prefer to use subscripted \emph{parentheses} around the derivative
+to indicate a point of evaluation \textendash{} as ISO 80000-2 recommends
+\textendash{} then this can easily be done; see Section~\ref{sec:Changing-defaults}
+on changing default settings. Or use the \texttt{ISO} package option; see
+the introduction.
+\end{itemize}
+Because the slash form spreads the derivative out horizontally, parentheses
+are preferred here to indicate a point of evaluation:
\begin{example}
-\textbackslash Diffd\{y\}\{x\} $\Longrightarrow{\displaystyle \Diffd{y}{x}.}$
+\textbackslash diff\{\textbackslash ln sin x\}/\{sin x\}{[}x=\textbackslash pi/6{]}
+$\Longrightarrow\quad{\displaystyle \diff{\ln\sin x}/{\sin x}[x=\pi/6]}$
\end{example}
-Higher order forms of these derivatives are produced in the same way as
-with \texttt{\textbackslash diff}, using an optional argument to specify
-the order:
+\noindent A vertical rule (or `pipe') can become too remote from the
+opening $d$ of the differential coefficient: $\diff.svrule.{\ln\sin x}/{\sin x}[x=\pi/6]$;
+parentheses tie the whole cluster of symbols together.
+
+\subsubsection{Superscripts}
+
+It is easy to add a superscript to a derivative to indicate evaluation
+at two points and the difference between the values:
\begin{example}
-\textbackslash diffd{[}2{]}\{y\}\{x\} $\Longrightarrow{\displaystyle \diffd[2]yx.}$
+\textbackslash diff \{\textbackslash sin x\}x{[}0{]}\textasciicircum\{\textbackslash pi/2\}
+${\displaystyle \Longrightarrow\quad\diff{\sin x}x[0]^{\pi/2}}$
\end{example}
-A final optional argument, enclosed in braces, specifies a point of evaluation,
-care being taken, as ever, to ensure that there is no space between it
-and the second mandatory argument:
+\noindent If you want only the superscript, no subscript, include the final
+optional argument but leave it empty. Thus, for a particle of mass $m$
+moving along a line, distance $x$ at time $t$, the kinetic energy is:
\begin{example}
-\textbackslash Diffd\{y\}\{x\}\{x=0\} $\Longrightarrow{\displaystyle \Diffd yx{x=0}.}$
+\textbackslash tfrac 12 m \textbackslash diff x/t{[}{]}\textasciicircum 2
+$\Longrightarrow\quad{\displaystyle \tfrac{1}{2}m\diff x/t[]^{2}}.$
\end{example}
-\section{Partial differential coefficients\label{sec:Partial-differential-coefficient}}
+\section{Partial derivatives\label{sec:Partial-derivatives}}
\noindent \begin{flushleft}
-Partial differential coefficients follow the same pattern as for ordinary
-derivatives, with some generalisations arising from the greater possibilities.
-The command this time is \texttt{\textbackslash diffp}. Thus \textbf{\textbackslash diffp\{F\}\{x\}}
-produces $\diffp{F}{x}$ in text style and
+Partial derivatives follow the same pattern as for ordinary derivatives,
+with some extensions. The command this time is \texttt{\textbackslash diffp}.
+Thus \texttt{\textbackslash diffp\{F\}\{x\}}, or, with a saving on keystrokes,\texttt{
+\textbackslash diffp Fx}, produces $\diffp Fx$ in text style and
\[
\diffp{F}{x}
\]
- in display style. Braces can be omitted for single token differentiands
-and variables: \texttt{\textbackslash diffp Fx} does the job.\textbf{
-}As for \texttt{\textbackslash diff}, there is a slash form for more casual
-use: \texttt{\textbackslash diffp F/x} displaying as $\diffp F/x$. Given
-that \texttt{\textbackslash partial} takes 8 keystrokes to type, the slash
-form \emph{does }economise on keystrokes for a partial derivative.
+in display style. (As for \texttt{\textbackslash diff}, the omission of
+braces is possible when the differentiand or the differentiation variable
+are single tokens.) As for \texttt{\textbackslash diff}, there is a slash
+form, generally preferred for inline use, \texttt{\textbackslash diffp
+F/x}, displaying as $\diffp F/x$. Given that \texttt{\textbackslash partial}
+takes 8 keystrokes to type, the slash form \emph{does }economise on keystrokes
+for a partial derivative.
\par\end{flushleft}
\begin{flushleft}
Again an optional argument allows the specification of the order of differentiation
-and it may be numeric or algebraic or a mix of the two. For a second or,
-indeed, an $n+4$th-order partial derivative,
+and it may be numeric or algebraic or a mix of the two:
\par\end{flushleft}
\begin{example}
-\textbackslash diffp{[}n+4{]}\{F\}\{x\} $\Longrightarrow\quad{\displaystyle {\displaystyle \diffp[n+4]{F}{x},}}$\medskip{}
-
-\textbackslash diffp{[}n+4{]}\{F\}/\{x\} $\Longrightarrow\quad{\displaystyle {\displaystyle \diffp[n+4]{F}/{x},}}$
+\textbackslash diffp{[}3{]}F/x , \textbackslash quad \textbackslash diffp{[}n{]}F/x
+$\Longrightarrow\quad{\displaystyle {\displaystyle {\displaystyle \diffp[3]F/x}},\quad{\displaystyle \diffp[n]F/x.}}$\medskip{}
+\textbackslash diffp{[}n+1{]}Fx $\Longrightarrow\quad{\displaystyle {\displaystyle \diffp[n+1]Fx,}}$
\end{example}
+
+\subsection{Variables held constant}
+
In a subject like thermodynamics, there is a need to indicate which variable
or variables are held constant when the differentiation occurs. To show
-this, append a final optional argument. Thus to differentiate the entropy
-$S$ in the temperature $T$ while holding the volume $V$ constant, write
+this, append a final square-bracketed optional argument and ensure that
+it follows \emph{immediately} on the preceding mandatory argument. A space
+here will detach the argument from the derivative and result in it being
+treated as a mathematical expression following the derivative. Thus to
+differentiate the entropy $S$ in temperature $T$ while holding the volume
+$V$ constant, write
\begin{example}
-\textbackslash diffp\{S\}\{T\}\{V\} $\Longrightarrow\quad{\displaystyle \diffp{S}{T}{V}}$
+\textbackslash diffp ST{[}V{]} $\Longrightarrow\quad{\displaystyle \diffp ST[V]}$
\end{example}
-As with \texttt{\textbackslash diff}\textbf{ }note how the final optional
-argument is given in braces rather than square brackets, and that there
-must be \emph{no space} before the argument: if used, it follows \emph{immediately}
-on the second mandatory argument. This means that the differential coefficient
-can be followed immediately by a mathematical expression wrapped in \textbackslash\{
-\textbackslash\}, or {[} {]}, without the expression being confused with
-the (final) optional argument.
-
-We could save a few keystrokes by writing this last example as \texttt{\textbackslash diffp
-ST\{V\}}. The braces around the optional argument can \emph{not} be dispensed
-with (otherwise there is no way of knowing that it \emph{is} the final
-optional argument and not part of a following expression).
-
-Note that for the slash form of the derivative it is anticipated that there
-will be no trailing optional argument. If you \emph{do} use one, you will
-need to change the nudge value either with the \texttt{\textbackslash diffset}
-command or, better, by including a spacing command in the third argument:
+\noindent In slash form the same expression looks like
\begin{example}
-\textbackslash diffp\{S\}/\{T\}\{\textbackslash ;V\} $\Longrightarrow\quad{\displaystyle \diffp{S}/{T}{\;V}}$
+\textbackslash diffp S/T{[}V{]} $\Longrightarrow\quad{\displaystyle \diffp{S}/{T}[V]}.$
\end{example}
-Without the spacing command, the subscript encroaches on the right parenthesis.
+This use of a parenthesised, subscripted form to indicate a variable or
+variables held constant, leaves open the question: how do we represent
+a point of evaluation? ISO 80000-2 makes no recommendation for \emph{partial}
+derivatives; presumably we follow the same practice as their recommendation
+for ordinary derivatives:
+\begin{example}
+\textbackslash diffp \{F(x,y)\}x{[}(0,0){]} $\Longrightarrow\quad{\displaystyle \diffp{F(x,y)}x[(0,0)]}$
+\end{example}
-\subsubsection{Appending the differentiand}
+However, you may prefer (as I do) to use a vertical rule for this purpose:
+\[
+\diff.pvrule.{F(x,y)}x[(0,0)]
+\]
+Making this possibility available is discussed in Section~\ref{sec:Changing-defaults}.
-If you want to remove the differentiand from the numerator to instead follow
-the derivative, one way, as for ordinary derivatives, is to leave the first
-mandatory argument empty and manually append the differentiand:
+An empty final argument produces a parenthesised derivative with no subscript:
\begin{example}
-\textbackslash diffp{[}n{]}\{\}xf(x) $\Longrightarrow\quad{\displaystyle \diffp[n]{}xf(x).}$
+\textbackslash diffp yx{[}{]}${\displaystyle \Longrightarrow\quad\diffp yx[]}.$
\end{example}
-However, you may wonder how that would look with the differentiand in the
-numerator, which is a good reason for preferring the starred form of the
-\texttt{\textbackslash diffp} command to achieve an appended derivative:
+\noindent This can be useful sometimes, e.g. for writing Lagrange's equations
+of motion in analytic mechanics:
\begin{example}
-\textbackslash diffp{*}{[}n{]}\{f(x)\}x $\Longrightarrow\quad{\displaystyle \diffp*[n]{f(x)}x.}$
+\textbackslash diffp L\{q\_k\}-\textbackslash diff{*}\{\textbackslash diffp
+L\{\textbackslash dot\{q\}\_k\}{[}{]}\}t = 0 $\Longrightarrow\quad{\displaystyle \diffp L{q_{k}}-\diff*{\diffp L{\dot{q}_{k}}[]}t}=0.$
\end{example}
-Now it is easy to switch between an appended differentiand and one in the
-numerator simply by inserting or deleting the asterisk. In the slash form,
-parentheses are automatically inserted around the differential operator:
+
+\subsubsection{Text-style derivatives}
+
+The \texttt{diffcoeff} package assumes that derivatives formed as `numerator
+over denominator' will be used in display-style expressions, and that
+the slash form will be used for inline use (text style). This is the familiar
+practice in the literature. If one \emph{does} use the first form in an
+inline expression where a variable is held constant, say \texttt{\textbackslash diffp
+ST{[}V{]}} as here $\diffp ST[V]$, the result is unsatisfactory, the subscript
+too tight on the closing parenthesis and too much space between parentheses
+and derivative. The matter is easily resolved using `variant forms' \textendash{}
+see Subsection~\ref{subsec:Text-and-script-style} below \textendash{}
+giving, for our example, $\diff.ptxt.ST[V]$.
+
+\subsection{Appending the differentiand\label{subsec:Partial-appending}}
+
+For a long or awkward differentiand, it is generally better to \emph{append}
+it to a preceding differential operator, rather than create a fractional
+form with the long expression in the numerator. As with ordinary derivatives,
+this is achieved by adding an asterisk to (i.e. by starring) the \texttt{\textbackslash diffp}
+command.
\begin{example}
-\textbackslash diffp{*}{[}n{]}\{f(x)\}/x $\Longrightarrow\quad{\displaystyle \diffp*[n]{f(x)}/x.}$
+\textbackslash diffp{*}{[}2{]}\{\textbackslash phi(x,y,z)\}x $\Longrightarrow\quad{\displaystyle \diffp*[2]{\phi(x,y,z)}x.}$
\end{example}
-It also happens, for example in thermodynamics, that you may wish to both
-append the differentiand \emph{and} indicate variables held constant. In
-that case, the starred \texttt{\textbackslash diffp} command is much easier
-to use. Thus, to express a relation in thermodynamics,
+\noindent Alternatively you could leave the first mandatory argument empty
+and manually append the differentiand, but by deleting or inserting an
+asterisk, it is easy to compare the two forms, differentiand-in-the-numerator,
+differentiand-appended, and see which is preferable.
+
+In slash form, parentheses are automatically inserted around the differential
+operator when the differentiand is appended,
\begin{example}
-\textbackslash diffp{*}\{\textbackslash frac \{P\}\{T\}\}\{U\}\{V\} =
-\textbackslash diffp{*}\{\textbackslash frac\{1\}\{T\}\}\{V\}\{U\} $\Longrightarrow\quad{\displaystyle \diffp*{\frac{P}{T}}{U}{V}=\diffp*{\frac{1}{T}}{V}{U}}$
+\textbackslash diffp{*}{[}n{]}\{f(x)\}/x $\Longrightarrow\quad{\displaystyle \diffp*[n]{f(x)}/x,}$
\end{example}
-\noindent where the starred form automatically takes care of the parentheses
-and subscripts. Again, not all the braces are necessary, with some help
-to readability:
+\noindent although this behaviour can be changed (Section~\ref{sec:Changing-defaults}
+again).
+
+If you wish to both append the differentiand \emph{and} indicate variables
+held constant, then the starred form is much the easier way to achieve
+this. Thus, to express a relation in thermodynamics,
\begin{example}
-\textbackslash diffp{*}\{\textbackslash frac PT\}U\{V\} = \textbackslash diffp{*}\{\textbackslash frac
-1T\}V\{U\} $\Longrightarrow\quad{\displaystyle \diffp*{\frac{P}{T}}U{V}=\diffp*{\frac{1}{T}}V{U}}$
+\textbackslash diffp{*}\{\textbackslash frac PT\}U{[}V{]} = \textbackslash diffp{*}\{\textbackslash frac
+1T\}V{[}U{]} $\Longrightarrow\quad{\displaystyle \diffp*{\frac{P}{T}}U[V]=\diffp*{\frac{1}{T}}V[U]}$
\end{example}
+\noindent where the starring automatically takes care of the parentheses
+and subscripts.
\subsection{Mixed partial derivatives}
The new thing with partial derivatives, not present with ordinary derivatives,
is \emph{mixed} partial derivatives, where there is more than one variable
of differentiation. If each variable is differentiated only to the first
-order, then it is easy to specify the derivative. Say $f(x,y,z)$ is a
-function of three variables, as indicated. Then
+order, then it is easy to specify the derivative. Suppose $F$ is a function
+of three variables, $x$, $y$ and $z$. Then
\begin{example}
-\textbackslash diffp\{f\}\{x\c{,}y,z\} $\Longrightarrow\quad{\displaystyle \diffp{f}{x,y,z}}.$
+\textbackslash diffp F\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp F{x,y,z}}.$
\end{example}
The variables of differentiation are listed in order in a comma list forming
the second mandatory argument. The total order of differentiation (3 in
this example) is inserted automatically \textendash{} \texttt{diffcoeff}
-does the calculation itself. There is also a slash form:
+does the calculation. There is also a slash form:
\begin{example}
-\textbackslash diffp\{f\}/\{x\c{,}y,z\} $\Longrightarrow\quad{\displaystyle \diffp{f}/{x,y,z}}.$
+\textbackslash diffp F/\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp F/{x,y,z}}.$
\end{example}
If we want to differentiate variables to higher order, then their orders
-need to be specified explicitly. To do so use a comma list also in the
-\emph{optional} argument:
+need to be specified explicitly. To do so use a comma list for the optional
+argument:
\begin{example}
-\textbackslash diffp{[}2,3{]}\{f\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[2,3]{f}{x,y,z}.}$
+\textbackslash diffp{[}2,3{]}F\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[2,3]F{x,y,z}.}$
\end{example}
\noindent Notice that the overall order of the derivative \textendash{}
6 \textendash{} is again automatically calculated and inserted as a superscript
on the $\partial$ symbol in the numerator. In this example, the comma
list of orders has only two members, even though there are three variables.
-It is assumed that the orders given in the comma list of orders apply in
-sequence to the variables, the first order to the first variable, the second
-to the second variable, and so on, and that any subsequent orders not listed
+It is assumed that the orders given in the comma list apply in sequence
+to the variables, the first order to the first variable, the second to
+the second variable, and so on, and that any subsequent orders not listed
in the optional argument are, by default, 1. Thus we need to specify only
-2 and 3 in the example; the order of $z$ is 1 by default.
-
+2 and 3 in the example; the order of differentiation of $z$ is 1 by default.
But you \emph{cannot} use an order specification like \texttt{{[},,2{]}}.
-This will be treated as if it were \texttt{{[}2{]}}. (This is a feature
-of comma lists in the expl3 language used by \texttt{diffcoeff.sty}.) Instead
-write \texttt{{[}1,1,2{]}}.\textbf{ }It is only the \emph{tail} of an order
-specification which can be omitted.
+Instead write \texttt{{[}1,1,2{]}}.\textbf{ }It is only the \emph{tail}
+of an order specification which can be omitted.
The automatic calculation of the overall order of differentiation remains
-true even when some or all of the orders for the individual variables are
-algebraic. For example, differentiating in three variables with orders
-\texttt{2k}, \texttt{m-k-2}, \texttt{m+k+3}, we have
+true even when some or all of the individual orders are variables rather
+than numbers. For example, differentiating in three variables to orders
+\texttt{1, m+1, m-1},
\begin{example}
-\textbackslash diffp{[}2k-1,m-k-2,m+k+3{]}\{F(x,y,z)\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[2k-1,m-k-2,m+k+3]{F(x,y,z)}{x,y,z}}$,
+\textbackslash diffp{[}1,m+1,m-1{]}\{F(x,y,z)\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[1,m+1,m-1]{F(x,y,z)}{x,y,z}.}$
\end{example}
+Should you specify \emph{more} orders in the comma list than there are
+variables, compilation will fail and an error message will be sent to the
+terminal and \LaTeX{} log . For example, if on line 53 (say) of my document
+I specify \texttt{{[}1,m-1,m+1,2{]}} for the orders of differentiation
+but list only \texttt{\{x,y,z\}} for the variables, the message will be
+\begin{lyxcode}
+!~Package~diffcoeff~Error:~4~orders~specified~for~3
-\subsection{The order-override option}
-
-In this example the overall order is presented as \texttt{2k+2m}. You might
-prefer this to be presented as \texttt{2(k+m)} instead. Although \texttt{diffcoeff}
-takes some steps to present the overall order appropriately, it does not
-factorise expressions. If you want to present the order in a manner distinct
-from that of \texttt{diffcoeff}, use the\emph{ order-override option},
-which is a second optional argument immediately following the first:
+variables;~{[}1,m+1,m-1,2{]}~(on~line~53)~for~variables~x,y,z.
+\end{lyxcode}
+\noindent Perhaps the differentiations are to orders \texttt{{[}2km,m-1,m+1{]}}:
\begin{example}
-\textbackslash diffp{[}2k-1,m-k-2,m+k+3{]}{[}2(k+m){]}\{F(x,y,z)\}\{x,y,z\}
-$\Longrightarrow\quad{\displaystyle \diffp[2k-1,m-k-2,m+k+3][2(m+k)]{F(x,y,z)}{x,y,z}}$.
+\textbackslash diffp{[}2km,m-1,m+1{]}\{F(x,y,z)\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[2km,m-1,m+1]{F(x,y,z)}{x,y,z}.}$
\end{example}
-The order-override option does exactly that: overrides the presentation
-of the calculated order with the manually given one. (In fact the algorithm
-does not get called at all.)
-
-\subsubsection{Order specifications beyond the scope of \texttt{diffcoeff.sty}}
-
-The order specification can include signed integers, variables like $k$
-and $\alpha$ with signed integer coeffients, and products of any number
-of variables like $mn$ or $kmn$ with signed integer coefficients. The
-algorithm that calculates the overall order in \texttt{diffcoeff.sty} \emph{cannot}
-handle\texttt{ }exponents, subscripts or parentheses. For such constructs,
-or more exotic ones, the order-override option is always available. If
-it is present (even if empty), the algorithm is bypassed completely and
-one can include `anything' there without causing error.
-
-I doubt that these limitations matter in any practical sense. We are in
-`overkill' territory here. Mixed partial derivatives are used far more
-rarely than the `pure' ones, and mixed partial derivatives to `exotic'
-orders of differentiation are used \emph{vanishingly} rarely, and in any
-case the order-override option is always available. But should you, in
-some freak circumstance, find yourself needing to write such things, then
-I suggest you use \texttt{diffcoeffx.sty}, which is \texttt{diffcoeff.sty}
-`on steroids'. It can handle the situations described above that are
-beyond the scope of \texttt{diffcoeff.sty}, and it uses exactly the same
-commands so there is nothing new to remember. It also provides additonal
-functionality for the trailing optional argument.
-
-\subsubsection{Presentation of the overall order}
-
-To take a grotesque example, that will never arise in practice, consider
-the following:
+\noindent Here the overall order is presented as \texttt{2km+2m}. You might
+prefer this to be presented as \texttt{2m(k+1)}. Although \texttt{diffcoeff}
+takes some steps to present the overall order appropriately, it is not
+a computer algebra system and does not factorise expressions. If you want
+to present the order in a manner distinct from that presented by \texttt{diffcoeff},
+use the \emph{order-override option}.
+
+\subsubsection{The order-override option}
+
+\noindent This is a second optional argument immediately following the
+order specification. For our last example, filling the override option
+with \texttt{2m(k+1)} gives the desired result:
\begin{example}
-\textbackslash diffp{[}kmn-mn+n-1,2kmn-mn+2n-1,n+1{]}\{f\}\{x,y,z,w\}
-$\Longrightarrow{\displaystyle \diffp[kmn-mn+n-1,2kmn-mn+2n-1,n+1]{f}{x,y,z,w}}.$
+\textbackslash diffp{[}2km,m-1,m+1{]}{[}2m(k+1){]}\{F(x,y,z)\}\{x,y,z\}
+$\Longrightarrow\quad{\displaystyle \diffp[2km,m-1,m+1][2m(k+1)]{F(x,y,z)}{x,y,z}}.$
\end{example}
-As noted earlier, since the final variable $w$ is differentiated only
-to order 1, there is no need to specify it in the comma list of orders.
-The implicit 1 contributes to the vanishing of the numerical part in the
-overall order of differentiation. In this example, the overall order contains
-multivariable terms, $kmn$ and $mn$. \texttt{diffcoeff} initially organises
-these in the sequence: \ldots{} 3-variable terms before 2-variable terms
-before single-variable terms, generally before the numerical term. However
-if a minus sign precedes the first many-variable term, and the numerical
-term is positive, it will be presented first:
+\noindent As another example, left to its own devices, \texttt{diffcoeff}
+produces
\begin{example}
-\textbackslash diffp{[}12-2km,k-1,km+1{]}\{f\}\{x,y,z,w\} $\Longrightarrow{\displaystyle \diffp[12-2km,km-1,k+1]{f}{x,y,z,w}}.$
+\textbackslash diffp{[}m/2+n/2,m/2,n/2{]}F\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[m/2+n/2,m/2,n/2]F{x,y,z},}$
\end{example}
-Should the numerical term either vanish or be negative and the leading
-algebraic term is preceded by a minus sign, \texttt{diffcoeff} will look
-for an algebraic term with a preceding $+$ sign and put that first:
+\noindent whereas we would like the total order to be presented as $m+n$.
+Using the override option,
\begin{example}
-\textbackslash diffp{[}2km-3k-1,2k-1,-3km+4k+1{]}\{f\}\{x,y,z,w\} $\Longrightarrow{\displaystyle \diffp[2km-3k-1,2k-1,-3km+4k+1]{f}{x,y,z,w}}.$
+\textbackslash diffp{[}m/2+n/2,m/2,n/2{]}{[}m+n{]}F\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[m/2+n/2,m/2,n/2][m+n]F{x,y,z}}.$
\end{example}
+The order-override option does exactly that: overrides the presentation
+of the calculated order with the manually given one. In fact the calculation
+algorithm does not get called at all when the override option is used so
+that one can in this way present the total order in whatever manner one
+wishes or, indeed, add essentially arbitrary material as a superscript
+to the $\partial$ symbol in the numerator.
+
+\subsubsection{Comma list of variables of differentiation}
+
+In tensor calculus the differentiations are almost always in terms of super-
+or subscripted coordinates. In many other contexts this is the case too
+\textendash{} the reciprocal of the temperature in thermodynamics or generalized
+cooredinates in analytical mechanics. This is why a comma list is used
+in \texttt{diffcoeff} for specifying variables of differentiation for mixed
+partial derivatives. Although it would be nice to write the minimal \texttt{\{xy\}}
+rather than \texttt{\{x,y}\} when two variables $x$ and $y$ are involved,
+the extra writing is trivial and the comma list allows a simpler handling
+of multi-character variables. For instance in tensor calculus we get expressions
+like
+\begin{example}
+\textbackslash diffp\{A\_i\}\{ x\textasciicircum j,x\textasciicircum k
+\} $\Longrightarrow\quad{\displaystyle \diffp{A_{i}}{x^{j},x^{k}}.}$
+\end{example}
-\subsection{\textbackslash diffset: formatting tweaks}
+\noindent It is easier to write \texttt{\{x\textasciicircum j,x\textasciicircum k\}}
+here than, say, \texttt{\{\{x\textasciicircum j\}\{x\textasciicircum k\}\}}
+to distinguish the variables. It does mean that should the variable of
+differentiation include a comma then that comma needs to be enclosed in
+braces. There are plenty of instances of this out in the world (see, e.g.,
+the last equation of (\ref{eq:eg1})) but it is overall a rare occurrence.
-As with ordinary derivatives, there are a number of tweaks one can make
-to the display of a partial derivative.
+\subsubsection{Overkill territory}
-You may want more space between the $\partial$ symbol in the numerator
-of a partial derivative and the superscripted order of the derivative.
-The separation can be altered by using the
+Two previous examples illustrate limitations of the algorithm that calculates
+the overall order of differentiation: \texttt{2m/2+2n/2} is not simplified
+to \texttt{m+n} and \texttt{2km+2m} is not factorised to \texttt{2m(k+1)}.
+But there is much that the algorithm \emph{can} handle \textendash{} for
+instance, the simple use of parentheses:
\begin{example}
-\textbackslash diffset{[}p-sep = $n${]}
+\textbackslash diffp{[}2m-(k+1),2(k+1)-m{]}\{F(x,y,z)\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp[2m-(k+1),2(k+1)-m]{F(x,y,z)}{x,y,z}}.$
\end{example}
-\noindent command which adds an extra $n$~mu to \TeX 's spacing. The
-default value is 1 (i.e. 1~mu). The new separation will affect all derivatives
-following the new setting. Put in the preamble, the new separation will
-be document-wide.
-You may also want to adjust the spacing between the terms in the denominator.
-This can be done with the command
-\begin{example}
-\textbackslash diffset{[}sep=$n${]}
-\end{example}
+\paragraph*{Dynamic use of parentheses}
-which adds an extra $n$~mu to \TeX 's spacing. The default value is 2~mu.
+\noindent For parenthetic expressions to be evaluated as in this example
+\textendash{} the \emph{dynamic} use of parentheses \textendash{} the left
+parenthesis must be preceded at most by a sign or a number; the right parenthesis
+must be followed at most by a sign.
-If you wish to indicate the point at which a partial derivative is evaluated,
-you may not want to use parentheses, since these when subscripted are widely
-held to indicate variables held constant. To change the delimiter on the
-right to a vertical line, use
-\begin{example}
-\textbackslash diffset{[}p-delims = . | {]}\textmd{,}
-\end{example}
+If a right parenthesis is followed by a \emph{variable}, say by \texttt{m}
+as in the order spec. \texttt{{[}(2n+1)m,(2n-1)m{]}}, it will throw an
+error and halt compilation. A message will be sent to the terminal and
+the \LaTeX{} log like the following (which assumes the order spec. was on
+line 53 of the document):
+\begin{lyxcode}
+!~Package~diffcoeff~Error:~Is~this~intended:~)~followed~
-the dot suppressing the delimiter on the left. (Note that to use \texttt{\textbackslash\{}
-and \texttt{\textbackslash\}} as delimiters, \texttt{\textbackslash diffset
-}must be placed between maths delimiters.)
+by~m~in~the~order~specification~{[}(2n+1)m,(2n-1)m{]}~on~
-Changing the delimiters will usually require a repositioning of the subscript.
-The command is
-\begin{example}
-\textbackslash diffset{[}p-nudge = $n${]}\textmd{.}
-\end{example}
+line~53?~Diffcoeff~cannot~calculate~the~overall~order~of~
-For parentheses the default value of $n$ is $-6$, but for the vertical
-rule a zero value is appropriate. Thus the overall command for . | would
-be
+differentiation~from~the~specification~in~this~case.~Use~
+
+the~order-override~option~to~enter~the~overall~order.
+\end{lyxcode}
+This is a limitation on the dynamic use of parentheses \textendash{} but
+they \emph{can} be nested.
+
+\paragraph*{Static use of parentheses}
+
+If a left parenthesis is preceded by a \emph{variable} (i.e., not a sign
+or a number) this signals to \texttt{diffcoeff} the \emph{static} use of
+parentheses. No attempt is made to evaluate what is between them and they
+are treated simply as an extension of the variable. For example,
\begin{example}
-\textbackslash diffset{[}p-delims = . |, p-nudge = 0{]} \textmd{.}
+\textbackslash diffp{[}f(k+1)+1,f(k-1)-1{]}\{F(x,y)\}\{x,y\} $\Longrightarrow\quad{\displaystyle \diffp[f(k+1)+1,f(k-1)-1]{F(x,y)}{x,y}}.$
\end{example}
-Writing
+\noindent In the static case you \emph{can} follow the right parenthesis
+by a variable without generating an error.\emph{ }You can nest them, and
+you can include static parentheses within a dynamic pair; for example,
\begin{example}
-\textbackslash diffset
+\textbackslash diffp{[}2(3+f(k))+1,1-3(f(k)-2){]}\{F(x,y)\}\{x,y\} $\Longrightarrow\quad{\displaystyle \diffp[2(3+f(k))+1,1-3(f(k)-2)]{F(x,y)}{x,y}}.$
\end{example}
-will return all settings to their default values.
-
-\subsection{Variations}
-
-\subsubsection{Multi-character variables of differentiation}
+\noindent However, the reverse is not possible: you can't have dynamic
+parentheses within a static pair.
-In thermodynamics one may want to differentiate in the reciprocal of the
-temperature, $1/T$. In tensor calculus the differentiations are almost
-always in terms of super- or subscripted coordinates, and in many other
-contexts this is the case too. This is why a comma list is used in \texttt{diffcoeff}
-for specifying the variables of differentiation for partial derivatives.
-Although it would be nice to write the minimal \texttt{\{xy\}} for this
-rather than \texttt{\{x,y}\}, the extra writing is trivial and the comma
-list allows the simplest handling of multi-character variables:
-\begin{example}
-\textbackslash diffp\{A\_i\}\{ x\textasciicircum j,x\textasciicircum k
-\} $\Longrightarrow{\displaystyle \diffp{A_{i}}{x^{j},x^{k}},}$
-\end{example}
+\paragraph*{Other refinements}
-taken from tensor calculus, or this strange object taken from statistical
-mechanics:
+Exponents and subscripts on a \emph{variable} are fine in an order specification,
+so long as the exponent or subscript consists of a \emph{single} token:
\begin{example}
-\textbackslash diffp{[}2{]}q\{\textbackslash frac 1\textbackslash Theta\}
-$\Longrightarrow{\displaystyle \diffp[2]q{\frac{1}{\Theta}}}$.
+\textbackslash diffp{[}m\textasciicircum 2+2(k-1),m\textasciicircum 2-(k+1){]}F\{x,y,z,w\}
+$\Longrightarrow\quad{\displaystyle \diffp[m^{2}+2(k-1),m^{2}-(k+1)]F{x,y,z,w}}.$
\end{example}
-The parentheses have been inserted automatically by \texttt{diffcoeff}
-to clarify exactly what the variable of differentiation is.
+\noindent Braced arguments containing \emph{multiple} tokens as exponents
+or subscripts to variables will generally not halt compilation but will
+usually give nonsensical results, as will \emph{signs} treated as superscripts
+or subscripts. Neither circumstance is checked for by \texttt{diffcoeff}.
-\subsubsection{Use of phantoms when appending differentiands}
+\emph{Numbers} raised to a power will cause a \LaTeX{} error. (The \texttt{l3int}
+module of the expl3 language is used to evaluate expressions, and this
+does not cater for raising to a power.)
-As for ordinary derivatives, when appending a differentiand you may want
-to include a phantom (\texttt{\textbackslash hphantom} etc.) in the numerator
-of the differential coefficient to alter the placement of the $\partial$
-symbol. This may be particularly relevant if the order of differentiation
-is a multi-character symbol or if there are a number of variables of differentiation.
+\paragraph*{Override}
-Either means of achieving the appended differentiand achieve the same result:
-\begin{example}
-\textbackslash diffp{[}m,2{]}\{\textbackslash hphantom\{\textbackslash partial
-y \textbackslash partial \}\}\{x,y,z\} (\textbackslash ln \textbackslash cos
-x + \textbackslash ln \textbackslash sin y)z $\Longrightarrow\quad{\displaystyle \diffp[m,2]{\hphantom{\partial y\partial}}{x,y,z}}(\ln\cos x+\ln\sin y)z,$\medskip{}
+There are limitations on what order specifications the \texttt{diffcoeff}
+package can `digest'; equally, it can digest a wide variety of such constructs,
+but it is \emph{not} a computer algebra system. In all those cases where
+it fails to calculate or present a correct total order, the order-override
+option is available. Yes, this is not as convenient as having the overall
+order calculated automatically but, let's remind ourselves, we are deep
+in overkill territory. Mixed partial derivatives are used far less often
+than the pure derivatives, and when they \emph{are} used it is nearly always
+to orders 1 or 2 in the variables. Mixed partial derivatives to exotic
+orders of differentiation are rarely used, so that the limitations of the
+calculational algorithm are of little real moment \textendash{} and the
+override option is always available for such cases.
-\textbackslash diffp{*}{[}m,2{]}\{\textbackslash hphantom\{\textbackslash partial
-y \textbackslash partial \}(\textbackslash ln \textbackslash cos x +
-\textbackslash ln \textbackslash sin y)z\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp*[m,2]{\hphantom{\partial y\partial}(\ln\cos x+\ln\sin y)z}{x,y,z}},$
-\end{example}
+\subsection{Parentheses around multi-character variables}
-which is to be compared with the derivative without the phantom,
+In thermodynamics and statistical mechanics one may want to differentiate
+in the reciprocal of the temperature, $1/T$ (or $1/\Theta$):
\begin{example}
-\textbackslash diffp{*}{[}m,2{]}\{(\textbackslash ln \textbackslash cos
-x + \textbackslash ln \textbackslash sin y)z\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \diffp*[m,2]{(\ln\cos x+\ln\sin y)z}{x,y,z}}.$
+\textbackslash diffp{[}2{]}q\{\textbackslash frac 1\textbackslash Theta\}
+$\Longrightarrow\quad{\displaystyle \diffp[2]q{\frac{1}{\Theta}}.}$
\end{example}
-\noindent In the starred form, \texttt{diffcoeff} understands that the
-phantom is not appended with the differentiand but stays in the numerator.
-(But a \emph{second} phantom would be appended.)
+\noindent In this case and for other \emph{higher order} derivatives of
+multi-character variables of differentiation, the parentheses are inserted
+automatically by \texttt{diffcoeff}. Precisely where parentheses should
+be placed is moot. The placement in this example is not strictly logical,
+although it feels intuitive, but the placement can be customised (Section~\ref{sec:Changing-defaults}).
-\subsubsection{Iterated derivatives}
-
-Partial derivatives can be iterated. For example,
+Parentheses are automatically inserted like this only for higher order
+derivatives. When the differentiation is to first order, parenthesising
+is up to the user:
\begin{example}
-\textbackslash diffp f\{x,y\} = \textbackslash diffp{*}\{\textbackslash diffp
-fy\}x $\Longrightarrow{\displaystyle \diffp f{x,y}=\diffp*{\diffp fy}x,}$\medskip{}
-
-\textbackslash diffp f\{x,y\} = \textbackslash diffp\{\textbackslash diffp
-fy\}x $\Longrightarrow{\displaystyle \diffp f{x,y}=\diffp{\diffp fy}x.}$
+\textbackslash diffp q\{(\textbackslash frac 1\textbackslash Theta),V\}
+$\Longrightarrow{\displaystyle \quad\diffp q{(\frac{1}{\Theta}),V}.}$
\end{example}
-It is easy to switch between these forms by inserting or deleting the asterisk.
\subsection{Jacobians}
\texttt{diffcoeff} provides a command \texttt{\textbackslash jacob} for
constructing Jacobians. For example
\begin{example}
-\textbackslash jacob\{u,v,w\}\{x,y,z\} $\Longrightarrow{\displaystyle \jacob{u,v,w}{x,y,z}.}$
+\textbackslash jacob\{u,v,w\}\{x,y,z\} $\Longrightarrow\quad{\displaystyle \jacob{u,v,w}{x,y,z}.}$
\end{example}
The comma lists can contain any number of variables. \texttt{\textbackslash jacob}
does \emph{not} check that the two arguments contain the same number of
-variables, so it is perfectly possible to form an object like
+variables, so it is perfectly possible to form an object like \texttt{\textbackslash jacob\{u,v,w\}\{x,y\}}
+which as far as I know has no meaning.
+
+\section{Changing defaults; variant forms\label{sec:Changing-defaults}}
+
+\begin{wraptable}[22]{o}{0.5\columnwidth}%
+\vspace{-2.5ex}
+\caption{{\small{}Defaults (ordinary derivatives})\label{tab:Ordinary-derivatives}}
+
+\centering{}\abovetopsep=.5ex{\small{}}%
+\begin{tabular}{lr}
+\toprule
+{\small{}key} & {\small{}default}\tabularnewline
+\midrule
+{\small{}op-symbol } & \texttt{\small{}d}\tabularnewline
+{\small{}op-symbol-alt} & \texttt{\small{}= op-symbol}\tabularnewline
+{\small{}op-order-sep } & \texttt{\small{}1 mu}\tabularnewline
+{\small{}{*}-op-left } & \texttt{\small{}false}\tabularnewline
+{\small{}{*}-italic-nudge} & \texttt{\small{}3 mu}\tabularnewline
+{\small{}{*}/-op-wrap} & \texttt{\small{}true}\tabularnewline
+{\small{}long-var-wrap } & \texttt{\small{}d(v)}\tabularnewline
+{\small{}denom-term-sep} & \texttt{\small{}2 mu}\tabularnewline
+{\small{}/-denom-term-sep } & \texttt{\small{}1 mu}\tabularnewline
+{\small{}left-delim} & \texttt{\small{}\textbackslash left .}\tabularnewline
+{\small{}right-delim} & \texttt{\small{}\textbackslash right |}\tabularnewline
+{\small{}elbowroom} & \texttt{\small{}0 mu}\tabularnewline
+{\small{}subscr-nudge } & \texttt{\small{}0 mu}\tabularnewline
+{\small{}/-left-delim} & \texttt{\small{}(}\tabularnewline
+{\small{}/-right-delim } & \texttt{\small{})}\tabularnewline
+{\small{}/-elbowroom} & \texttt{\small{}0 mu}\tabularnewline
+{\small{}/-subscr-nudge } & \texttt{\small{}0 mu}\tabularnewline
+\bottomrule
+\end{tabular}{\small\par}\end{wraptable}%
+To write the range of different examples displayed in the Rogues' Gallery
+(Section~\ref{sec:Rogues'-gallery}) I have had to make extensive use
+of forms of derivative other than the default. Version 2 of \texttt{diffcoeff}
+(as distinct from version 1) is built around the facilities offered by
+the \texttt{xtemplate} package (included in the \LaTeX 3 bundle \texttt{l3packages)}.
+These facilities are harnessed by means of a command, \texttt{\textbackslash diffdef},
+and a further optional argument of the \texttt{\textbackslash diff} command.\texttt{ }
+
+How a derivative is displayed in a document is determined by specifying
+values in a `key = value' list. This is done with the \texttt{\textbackslash diffdef}
+command, which also allows a name to be associated with the list. By using
+that name as an argument in the \texttt{\textbackslash diff} command,
+a derivative is formed shaped by those values. Examples will make the process
+clear.
+
+\subsection{Default values: ordinary derivatives}
+
+Table~\ref{tab:Ordinary-derivatives} lists the keys available for forming
+derivatives and the default values\footnote{Note that a mu is a `math unit', 1/18 of an em in the math font used.}
+they have been assigned. These default values have been chosen to coincide
+with those relevant for \emph{ordinary} derivatives (apart from the keys
+\texttt{denom-term-sep} and \texttt{/-denom-term-sep} which are ignored
+for ordinary derivatives but apply to the case of mixed partial derivatives
+when there is more than one variable of differentiation.) Keys with an
+opening slash, /, apply only to the slash form of the derivative; keys
+with an opening asterisk, {*}, apply only when the differentiand is appended.
+
+Note that these settings are, in general, font dependent. The values given
+are (in the author's opinion) appropriate for the default \LaTeX{} math
+fonts, or latin modern fonts. There are also likely to be variations required
+for whether a derivative is used in a display-style or text-style or script-style
+expression. That matter is discussed below in Subsection~\ref{subsec:Text-and-script-style}.
+\begin{description}
+\item [{op-symbol}] the operator symbol; for ordinary derivatives, generally
+one of \texttt{d} or \texttt{\textbackslash mathrm\{d\}}, \texttt{D} or
+\texttt{\textbackslash mathrm\{D\}}, \texttt{\textbackslash delta} or
+\texttt{\textbackslash Delta}; for partial derivatives \texttt{\textbackslash partial}
+\item [{op-symbol-alt}] if different from \textbf{op-symbol} then used in the
+denominator while \textbf{op-symbol} is used in the numerator; otherwise
+(and usually) defaults to \textbf{op-symbol}; e.g. for $\diff.nabla.{v^{i}}t$,
+\texttt{op-symbol = \textbackslash nabla} and \texttt{op-symbol-alt =
+d}
+\item [{op-order-sep}] extra horizontal space added between the op-symbol and
+the superscripted order of differentiation in higher order derivatives;
+compare $d^{2}$ with $d^{\mkern1mu 2}$, $\partial^{2}$ with $\partial^{\mkern1mu 2}$
+where the first symbol in each case has no extra space and the second has
+an extra 1 mu
+\item [{{*}-op-left}] a choice of \texttt{true} or \texttt{false} indicating
+whether the op-symbol is left-aligned or not when the differentiand is
+appended; generally it is centred; does not apply to slash forms of the
+derivative
+\item [{{*}-italic-nudge}] if \textbf{{*}-op-left} is \texttt{true}, makes an
+italic adjustment in the numerator, so that the op-symbols in numerator
+and denominator align in the same slanting column; for an upright \texttt{d}
+this would be set to \texttt{0 mu}
+\item [{{*}/-op-wrap}] a choice of \texttt{true} or \texttt{false} for slash
+forms of the derivative when the differentiand is appended, dictating whether
+the differential coefficient is wrapped in parentheses or not; the default
+is \texttt{true}, as here: $\diffp*{F(x,y)}/x$
+\item [{long-var-wrap}] to avoid ambiguity in higher order derivatives it may
+be advisable to wrap multi-token variables of differentiation in parentheses;
+the choices are
+\begin{description}
+\item [{\texttt{dv}}] no wrapping, e.g. $dx_{i}^{2}$ or $d\frac{1}{\Theta}^{2}$,
+$\partial x_{i}^{2}$ or $\partial\frac{1}{\Theta}^{2}$,
+\item [{\texttt{d(v)}}] wrap the variable only, e.g. $d(x_{i})^{2}$ or $d(\frac{1}{\Theta})^{2}$,
+$\partial(x_{i})^{2}$ or $\partial(\frac{1}{\Theta})^{2}$,
+\item [{\texttt{(dv)}}] wrap the op-symbol and variable, e.g. $(dx_{i})^{2}$
+or $(d\frac{1}{\Theta})^{2}$, $(\partial x_{i})^{2}$ or $(\partial\frac{1}{\Theta})^{2}$
+\end{description}
+\item [{denom-term-sep}] (mixed partial derivatives only) extra horizontal spacing
+inserted between the differentials in the denominator of a mixed partial
+derivative
+\item [{/-denom-term-sep}] (mixed partial derivatives only) extra horizontal
+spacing inserted between the differentials in the denominator of a slash-form
+mixed partial derivative
+\item [{left-delim}] the left member of a delimiter pair wrapping the derivative,
+the right member of which is subscripted to indicate a point of evaluation
+or variables held constant
+\item [{right-delim}] the right member of a delimiter pair wrapping the derivative
+and subscripted to indicate a point of evaluation or variables held constant
+\item [{elbowroom}] adjustment to the whitespace between the left and right
+delimiters and the enclosed derivative; negative values reduce the space
+\item [{subscr-nudge}] horizontal adjustment of the subscript's placing relative
+to the \textbf{right-delim}iter, e.g., a negative value compensates for
+the curving inwards of a large right parenthesis; may be font dependent
+\item [{/-left-delim}] for the slash form of derivative, the left member of
+a delimiter pair wrapping the derivative and subscripted to indicate a
+point of evaluation or variables held constant
+\item [{/-right-delim}] for the slash form of derivative, the right member of
+a delimiter pair wrapping the derivative, the right member of which is
+subscripted to indicate a point of evaluation or variables held constant
+\item [{/-elbowroom}] adjustment to the whitespace between the left and right
+delimiters and the enclosed slash-form derivative
+\item [{/-subscr-nudge}] for the slash form of derivative, horizontal adjustment
+of the subscript's placing relative to the /-\textbf{right-delim}iter;
+may be font dependent
+\end{description}
+
+\subsection{ISO defaults}
+
+\begin{wraptable}[9]{o}{0.4\columnwidth}%
+\centering{}\vspace{-5ex}
+\caption{{\small{}ISO default changes}\label{tab:ISO-setting-changes}}
+\abovetopsep=.5ex%
+\begin{tabular}{lr}
+\toprule
+{\small{}key} & {\small{}default}\tabularnewline
+\midrule
+{\small{}op-symbol } & \texttt{\small{}\textbackslash mathrm\{d\}}\tabularnewline
+{\small{}op-order-sep } & \texttt{\small{}0 mu}\tabularnewline
+{\small{}left-delim} & \texttt{\small{}\textbackslash left (}\tabularnewline
+{\small{}right-delim} & \texttt{\small{}\textbackslash right )}\tabularnewline
+{\small{}subscr-nudge } & \texttt{\small{}-6 mu}\tabularnewline
+\bottomrule
+\end{tabular}\end{wraptable}%
+\emph{ }You may not like the default settings that come with \texttt{diffcoeff}.
+The package does not follow ISO 80000-2 \textendash{} it does not use upright
+`d's nor does it wrap an ordinary differential coefficient in subscripted
+parentheses to indicate a point of evaluation. Both `defects' can be
+remedied by calling the package with the option \texttt{ISO}:\footnote{One can also use \texttt{ISO=true} to turn the option on and \texttt{ISO=false
+}to turn the option off. }
+\begin{lyxcode}
+\textbackslash usepackage{[}ISO{]}\{diffcoeff\}
+\end{lyxcode}
+The uppercase is essential \textendash{} an option \texttt{iso} is not
+recognised. The \texttt{ISO} option results in changes to the default settings
+of Table~\ref{tab:Ordinary-derivatives} as listed in Table~\ref{tab:ISO-setting-changes}.
+Any settings not mentioned in Table~\ref{tab:ISO-setting-changes} retain
+the values presented in Table~\ref{tab:Ordinary-derivatives}. Note that
+the subscript nudge figure specified here is \emph{not} part of the standard,
+which makes no recommendation about the subscript's positioning. But: the
+\texttt{-6 mu} figure with a default or latin modern font gives a better
+representation of what is displayed in the standard than a zero figure.
+
+Because the `d' is upright with the \texttt{ISO} option, no extra space
+is required between the symbol and the superscript in a higher order derivative.
+Hence the zero value for the \texttt{op-order-sep}. ISO recommends subscripted
+parentheses to indicate a point of evaluation. Hence the other entries
+in the table. Because a large right parenthesis (penultimate setting) bends
+inwards, to the left, a negative value for the last entry ensures the subscript
+does not become detached from the derivative, looking lost in a sea of
+whitespace.
+
+Note that the \texttt{ISO} option will also produce upright `D's in derivatives
+formed from `D'; see Subsection~\ref{subsec:D-delta-Delta} below.
+
+\subsection{Partial derivatives}
+
+\begin{wraptable}{o}{0.4\columnwidth}%
+\begin{centering}
+\vspace{-5ex}
+\caption{{\small{}Default changes: partial derivatives}\label{tab:Partial-deriv-defaults}}
+\abovetopsep=.5ex%
+\begin{tabular}{lr}
+\toprule
+{\small{}key} & {\small{}default}\tabularnewline
+\midrule
+{\small{}op-symbol } & \texttt{\small{}\textbackslash partial}\tabularnewline
+{\small{}left-delim} & \texttt{\small{}\textbackslash left (}\tabularnewline
+{\small{}right-delim} & \texttt{\small{}\textbackslash right )}\tabularnewline
+{\small{}subscr-nudge } & \texttt{\small{}-6 mu}\tabularnewline
+\bottomrule
+\end{tabular}
+\par\end{centering}
+\end{wraptable}%
+The default values given in Table~\ref{tab:Ordinary-derivatives}, when
+they are relevant, apply to \emph{ordinary} derivatives. For partial derivatives,
+the defaults are those of Table~\ref{tab:Partial-deriv-defaults}. All
+other keys take ther default values listed in Table~\ref{tab:Ordinary-derivatives}.
+The last three entries here are not an attempt at ISO compatibility but
+reflect the use of subscripted parentheses with partial derivatives to
+indicate variables held constant, for instance in the Maxwell relations
+of thermodynamics, one of which is
+\[
+\diffp SV[T]=\diffp PT[V].
+\]
+
+
+\subsection{Setting your own defaults: \texttt{\textbackslash diffdef\label{subsec:diffdef}}}
+
+Version 2 of the \texttt{diffcoeff} package provides a command, \texttt{\textbackslash diffdef},
+that enables users to set their own defaults.\texttt{ }For example, if
+you wish to use upright `d's but not follow the ISO's use of subscripted
+parentheses to indicate a point of evaluation, enter in the preamble of
+your document the command\vspace{-2ex}
+
+\begin{lyxcode}
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{lyxcode}
+\textbackslash diffdef~\{\}~~~
+\begin{lyxcode}
+\{~~~~~
+\begin{lyxcode}
+op-symbol~~~~=~\textbackslash mathrm\{d\},~~~~
+
+op-order-sep~=~0~mu
+\end{lyxcode}
+\}
+\end{lyxcode}
+\end{lyxcode}
+%
+\end{minipage}
+\end{lyxcode}
+\noindent Since a list of settings, like this one, is a comma-\emph{separated}
+list, no comma is required for the last entry. That entry is a consequence
+of the first: upright symbols do not require any extra separation between
+the `d' and the superscript in a higher order derivative.
+
+The other point to note is the empty pair of braces after the \texttt{\textbackslash diffdef}
+command. \emph{They matter}. Their emptiness is what determines that it
+is the \emph{default} values that are changed. If they contain some content,
+then that content provides a \emph{name} for the particular set of values
+in the following list. The \texttt{diffcoeff} package exploits this facility
+to cope with the wide variety of forms displayed in the Rogues' Gallery
+of Section~\ref{sec:Rogues'-gallery}.
+
+\subsection{Variant forms}
+
+For this package I needed to have a number of variant forms available to
+illustrate the wide variety of ways in which derivatives are displayed.
+The \texttt{\textbackslash diffdef} command in which the first argument
+is \emph{filled} provides one half of the means of doing this. I've given
+the single-letter name \texttt{p} to the following settings:
+
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{lyxcode}
+\textbackslash diffdef~\{~p~\}
+
+~~\{
+
+~~~~op-symbol~~~~=~\textbackslash partial~,
+
+~~~~left-delim~~~=~\textbackslash left~(~~,
+
+~~~~right-delim~~=~\textbackslash right~)~,
+
+~~~~subscr-nudge~=~-6~mu
+
+~~\}
+\end{lyxcode}
+%
+\end{minipage}
+
+The second half of providing variant forms is to insert this name, \texttt{p},
+between dots (periods, full stops) as the \emph{first} argument of the
+\texttt{\textbackslash diff} command. Thus, repeating an example at the
+end of Subsection~\ref{subsec:Partial-appending},
\begin{example}
-\textbackslash jacob\{u,v,w\}\{x,y\} ,
+\textbackslash diff.p.{*}\{\textbackslash frac PT\}U{[}V{]} = \textbackslash diff.p.{*}\{\textbackslash frac
+1T\}V{[}U{]} $\Longrightarrow\quad{\displaystyle \diff.p.*{\frac{P}{T}}U[V]=\diff.p.*{\frac{1}{T}}V[U]}$
\end{example}
-which as far as I know has no meaning.
+\noindent The effect is exactly the same as previously, when the \texttt{\textbackslash diffp}
+command was used. Indeed, \texttt{diffcoeff} identifies \texttt{\textbackslash diffp}
+with \texttt{\textbackslash diff.p.}, saving a few keystrokes and maintaining
+compatibility with version 1 of the package. In \LaTeXe{} synatx,
+\begin{lyxcode}
+\textbackslash newcommand~\{~\textbackslash diffp~\}~\{~\textbackslash diff.p.~\}
+\end{lyxcode}
+Note that this identification of \texttt{\textbackslash diffp} with \texttt{\textbackslash diff.p. }means
+there is no equivalent dot-delimited argument available for \texttt{\textbackslash diffp}.
+The dot-delimited argument applies only to \texttt{\textbackslash diff}.
-\section{Discussion of the code}
+For example, to illustrate the upright-d form of derivative, without changing
+the default math-italic form (which I prefer), one might enter in the preamble
+\begin{lyxcode}
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{lyxcode}
+\textbackslash diffdef~\{~up~\}~
-I set about creating this package when faced with trying to parse \LaTeX{}
-expressions involving derivatives for another program I was working on.
-Trying to parse \texttt{\textbackslash frac\{d<something>\}\{d<something
-else>\}}, perhaps with \texttt{\textbackslash mathrm\{d\}}'s, and a superscript
-on the first \texttt{d}, perhaps with a \texttt{\textbackslash tfrac}
-or \texttt{\textbackslash dfrac} for the \texttt{\textbackslash frac},\textbf{
-}wasn't quite hopeless, but it was certainly \emph{messy}. (I used regular
-expressions to transform the fraction into something more systematic.)
+~~\{
-\subsection{Other packages}
+~~~~op-symbol~~~~=~\textbackslash mathrm\{d\},
-Looking through the MiK\TeX{} distribution and, less assiduously, through
-CTAN, produced the following packages which provide macros for derivatives.
-(Strangely, AMS packages do not touch this subject, as far as I can see.)
-\begin{itemize}
-\item \texttt{bropd}
-\begin{itemize}
-\item \texttt{\textbackslash od{[}n{]}\{y\}\{x\}} and \texttt{\textbackslash pd{[}n{]}\{y\}\{x\}}
-for ordinary and partial derivatives of order \texttt{n} in one variable
-\item \texttt{\textbackslash pd\{u\}\{x,x,t\}} for a mixed partial derivative,
-order 2 in \texttt{x}, 1 in \texttt{t}
-\item \texttt{\textbackslash pd\{\}\{z\}\{x+y\}} for appending \texttt{(x+y)}
-\item \texttt{\textbackslash pd\{!\}\{z\}\{x+y\}} for appending \texttt{x+y}
-\end{itemize}
-\item \texttt{commath}
-\begin{itemize}
-\item \texttt{\textbackslash od{[}n{]}\{y\}\{x\}} and \texttt{\textbackslash pd{[}n{]}\{y\}\{x\}}
-for ordinary and partial derivatives of order \texttt{n} in one variable
-\item \texttt{\textbackslash md\{f\}\{5\}\{x\}\{2\}\{y\}\{3\}} for a 5th order
-mixed partial derivative
-\item \texttt{\textbackslash tmd}, \texttt{\textbackslash dmd} and similar
-commands for forcing text and display styles
-\end{itemize}
-\item \texttt{esdiff}
-\begin{itemize}
-\item \texttt{\textbackslash diff{[}n{]}\{y\}\{x\}}\textbf{ }and \texttt{\textbackslash diffp{[}n{]}\{y\}\{x\}}\textbf{
-}for ordinary and partial derivatives of order \texttt{n} in one variable
-\item \texttt{\textbackslash diffp\{f\}\{\{x\textasciicircum 2\}\{y\}\{z\textasciicircum 3\}\}}
-for a mixed partial derivative of order 6 in three variables
-\item \texttt{\textbackslash diff{*}{[}n{]}\{y\}\{x\}\{0\}} for indicating the
-point of evaluation of the derivative (using a subscript on parentheses)
-\item \texttt{\textbackslash diffp{*}\{P\}\{T\}\{V\}} to indicate a variable
-held constant
-\end{itemize}
-\item \texttt{physymb}
-\begin{itemize}
-\item \texttt{\textbackslash ud\{y\}\{x\}} and \texttt{\textbackslash pd\{y\}\{x\}}
-for ordinary and partial derivatives of first order
-\item \texttt{\textbackslash udd\{y\}\{x\}}, \texttt{\textbackslash uddd\{y\}\{x\}}
-and \texttt{\textbackslash pdd\{y\}\{x\}}, \texttt{\textbackslash pddd\{y\}\{x\}}
-for second and third order ordinary and partial derivatives
-\item higher order derivatives not catered for
-\end{itemize}
-\end{itemize}
-None of the packages quite gave what I wanted (but for all that, I suspect
-cope with well over 90\% of use cases). \texttt{esdiff} comes closest but
-failed when it came to combining algebraic and numeric orders of differentation
-in a mixed partial derivative. Also the need to em-brace variables in a
-mixed partial derivative in \texttt{esdiff}\textbf{ }was another (small)
-count against it.
-
-\subsection{diffcoeff.sty}
-\begin{itemize}
-\item The distinctive feature of \texttt{diffcoeff.sty} is that it will automatically
-form the overall order of a mixed partial derivative, including those containing
-both algebraic and numeric contributions to the order:
-\end{itemize}
+~~~~op-order-sep~=~0~mu
+
+~~\}
+\end{lyxcode}
+%
+\end{minipage}
+\end{lyxcode}
+Apart from the key = value settings, the critical feature here is the name,
+\texttt{up} (which is at your discretion and could equally be \texttt{upright}
+or \texttt{roman} or even \texttt{Fred} if you so fancied). This ensures
+that the changed settings apply only to this particular variant and do
+not `infect' the overall defaults. To use this variant, all that is needed
+is to add the name, between dots, to the \texttt{\textbackslash diff}
+command:
\begin{example}
-\textbackslash diffp{[}m-k-1,m+k{]}\{F(x,y,z)\}\{x,y,z\} $\Longrightarrow{\displaystyle \diffp[m-k-1,m+k]{F(x,y,z)}{x,y,z}}.$
+\textbackslash diff.up.yx $\Longrightarrow\quad{\displaystyle \diff.up.yx}.$
\end{example}
-\begin{itemize}
-\item Ease of use was another major consideration, trying to avoid the unnecessary
-writing of superscripts and subscripts and brace pairs. In this example,
-no superscripts are written and only the two inescapable brace pairs are
-required.
-\begin{itemize}
-\item The use of a comma list for the second mandatory argument in a partial
-derivative is another example. That makes differentiations in super- or
-subscripted symbols easier to both write and read by avoiding `entanglements'
-of braces.
-\end{itemize}
-\item I've also tried to make the options `natural' and consistent across both
-ordinary and partial derivatives. Looking at the other packages listed
-above, writing something like \texttt{\textbackslash diff{[}n{]}\{f\}\{x\}}
-(which can be trimmed to \texttt{\textbackslash diff{[}n{]}fx} in this
-instance) seems `natural' \textendash{} only \texttt{physymb} deviates
-from the pattern. It seems consistent with this pattern to use a comma
-list as an optional argument for mixed partial derivatives.
-\item I debated whether to include provision for points of evaluation and variables
-held constant into the \texttt{\textbackslash diff} and \texttt{\textbackslash diffp}
-commands. \texttt{esdiff} certainly allows this. I think a case can be
-made, in subjects like thermodynamics, to consider the parentheses and
-subscript as part of the overall symbol. The partial derivative itself
-doesn't give the full story; it is ambiguous. Hence provision for these
-extra elements was included in \texttt{\textbackslash diff} and \texttt{\textbackslash diffp}.
-It's positioning as a final optional argument also felt natural given the
-position of the resulting symbol in the displayed derivative:
-\end{itemize}
+\noindent Each variant derivative inherits all the default values that
+it does not explicitly countermand. Thus a point of evaluation is indicated
+by a vertical rule which is the \texttt{diffcoeff} default\footnote{\noindent But not the ISO recommendation.}:
\begin{example}
-\textbackslash diffp ST\{V\} $\Longrightarrow\quad{\displaystyle \diffp ST{V}}$
+\textbackslash diff.up.{*}\{\textbackslash frac\{F(x)\}\{G(x)\}\}x{[}x=1{]}
+$\Longrightarrow\quad{\displaystyle \diff.up.*{\frac{F(x)}{G(x)}}x[x=1]}$
\end{example}
-\begin{itemize}
-\item Although initially I used standard square brackets for this trailing optional
-argument, the possibility of an immediately following mathematical expression
-being enclosed in square brackets convinced me to use braces for the argument.
-An immediately following expression can now be enclosed in \texttt{{[}
-{]}}, or \texttt{\textbackslash\{ \textbackslash\}}, without ambiguity.
-\item The star option also prompted the reflection: is it needed? One can always
-leave the first mandatory argument empty and append the differentiand `by
-hand'. But once the provision for points of evaluation or variables held
-constant was incorporated into the \texttt{\textbackslash diff} and \texttt{\textbackslash diffp}
-commands, the star option became the simplest way of handling appended
-differentiands using the extra provision. (Note that it conflicts with
-the star option in \texttt{esdiff}, but I can't see the packages ever being
-used together.) And once the option is available, it provides a simple
-way to switch between differentiand in the numerator/differentiand appended.
-\item The final option added to the package was the slash option. This was prompted
-after seeing the expression $\diff*{[\log f(z)]}/z$ in a text on statistical
-mechanics. Alerted to the form, I then skimmed through various texts and
-found this form of the derivative was used sufficiently often to justify
-inclusion. The placement of the slash, between the two mandatory arguments,
-seemed more-or-less self-evident.
-\end{itemize}
+\noindent Dot-delimited arguments must always be the \emph{first} argument
+of the \texttt{\textbackslash diff} command, even preceding an asterisk
+(star) as in this example.
-\subsection{The mixed partial derivatives algorithm}
-
-It occurred to me, after I had created an algorithm for splitting a linear
-expression composed of signs, integers and variables into its numerical
-and algebraic parts, that the same algorithm could be used in a recursive
-way to simplify the algebraic part of the expression.
-
-Given an order specification like, say, \textbf{\strong{\textbf{{[}2m+k\textendash 1,2m\textendash k+1,2k,1{]}}}},
-the idea is to concatenate the terms with intervening \textbf{+} signs,
-thus \textbf{\strong{\textbf{2m+k\textendash 1+2m\textendash k+1+ 2k+1}}},
-then split this expression into numeric and algebraic parts, giving \textbf{\strong{\textbf{\textendash 1+ 1+1}}}
-for the numeric part and \textbf{\strong{\textbf{2m+k+2m\textendash k+2k}}}
-for the algebraic part. The numeric part, assumed to be a combination of
-integers, is evaluated and the result stored. For the algebraic part, remove
-throughout all instances of one of the variables, say \textbf{\strong{\textbf{m}}}.
-The result is \textbf{\strong{\textbf{2+k+2\textendash k+2k}}}. Split
-this into numeric and algebraic parts: \textbf{\strong{\textbf{2+2}}}
-for the numeric part and \textbf{\strong{\textbf{k\textendash k+2k}}}
-for the algebraic part. Evaluate the numeric part, \textbf{\strong{\textbf{+4}}},
-and you have the overall coefficient of the variable \textbf{\strong{\textbf{m}}}.
-Repeat the process for the next variable, and so on until all variables
-have been accounted for.
-
-In fact repeating the process for the next variable, \strong{k} in this
-example, immediately reveals a problem. Removing \strong{k} from \textbf{\strong{\textbf{k\textendash k+2k}}}
-leaves \strong{\textendash +2} which evaluates to \strong{\textendash 2}
-whereas the correct coefficient for \strong{k} should be \strong{+2}.
-The solution is to insert \strong{1} before any `bare' variable \textendash{}
-a variable preceded only by a sign rather than a number. In that case the
-expression we remove \strong{k} from is \strong{1k\textendash 1k+2k}
-giving the correct overall coefficient \strong{+2}.
-
-A second problem may arise if there are terms involving products of variables
-as in the order specification \strong{{[}mk\textendash 2,2m+1,2k+1{]}}.
-This splits into a numeric part \strong{\textendash 2+1+1} evaluating
-to \strong{0}, and an algebraic part \strong{mk+2m+2k}. If we choose
-\strong{m} as the first variable to remove from this expression, we get
-\strong{+2} for the numeric part (and hence the overall coefficient of
-\strong{m}) and \strong{k+2k} for the algebraic part, which is wrong,
-since that will lead to the wrong overall coefficient \strong{+3} for
-\strong{k}, and the 2-variable term \strong{mk} will not get treated
-at all. The cure is to treat \strong{mk} as a variable itself, count the
-number of tokens in each such product and start the removal process with
-the largest.
-
-\subsubsection{The splitting algorithm}
-
-Write $s$ for a sign, one of \strong{+}, \strong{\textendash{}}, and
-\strong{s} for the state of assembling a signed term; a signed term is
-a string of one or more signs. Write $d$ for a digit, one of 0123456789,
-and \strong{n} for the state of assembling a numeric term; a numeric term
-is a signed term followed by a string of one or more digits. Write $v$
-for a variable, usually a letter from the roman alphabet but in principle
-any single token that is not a sign or a digit, and \strong{a} for the
-state of assembling an algebraic term; an algebraic term is a numeric term
-followed by a string of one or more variables. Rather than referring to
-a signed-term-assembling state, we shall (obviously) simply refer to a
-\emph{signed state}, and similarly to a \emph{numeric state} and an \emph{algebraic
-state}.
-
-\begin{table}
-\noindent \centering{}\caption{\label{tab:Input-output-states}State transitions}
-\medskip{}
-\begin{tabular}{ccccc}
-\cmidrule{2-5}
- & Curr. state & Curr. token & Action & Next state\tabularnewline
-\cmidrule{2-5}
-1 & \strong{s} & $s$ & $Ts\to s'$; $T=s'$ & \strong{s}\tabularnewline
-\cmidrule{2-5}
-2 & \strong{s} & $d$ & $Td$ & \strong{n}\tabularnewline
-\cmidrule{2-5}
-3 & \strong{s} & $v$ & $Vv$; $T1v$ & \strong{a}\tabularnewline
-\cmidrule{2-5}
-4 & \strong{n} & $s$ & $\mathbf{N}T$; $T=s$ & \strong{s}\tabularnewline
-\cmidrule{2-5}
-5 & \strong{n} & $d$ & $Td$ & \strong{n}\tabularnewline
-\cmidrule{2-5}
-6 & \strong{n} & $v$ & $Vv$; $Tv$ & \strong{a}\tabularnewline
-\cmidrule{2-5}
-7 & \strong{a} & $s$ & $\mathbf{V}V,$; $V=\textrm{Ø}$; $\mathbf{A}T$; $T=s$ & \strong{s}\tabularnewline
-\cmidrule{2-5}
-8 & \strong{a} & $d$ & error & \strong{!!}\tabularnewline
-\cmidrule{2-5}
-9 & \strong{a} & $v$ & $Vv$; $Tv$ & \strong{a}\tabularnewline
-\cmidrule{2-5}
-\end{tabular}
-\end{table}
-We also want to record the variables in the extended sense of products
-of same. Call a one-token variable a prime variable. Then in this desired
-sense, a variable is a string of one or more prime variables.
-
-Let $\mathbf{E}$ be the initial expression. Let $\mathbf{A}$ be a container
-for the algebraic part of $\mathbf{E}$; let $\mathbf{N}$ be a container
-for the numeric part of $\mathbf{E}$; and let $\mathbf{V}$ be a container
-for the extended variables in $\mathbf{E}$. Let $T$ be a container in
-which to accumulate the current term, and $V$ a container in which to
-accumulate the current extended variable (if any). Initially all these
-containers are empty ($\textrm{Ø}$).
-
-We work through $\mathbf{E}$ token by token from the left. The table shows
-the alternatives.
-\begin{itemize}
-\item Row 1. The current token is a sign $s$ and the system is in a signed state
-\strong{s}. We append $s$ to the current term, $Ts$, then resolve the
-juxtaposition of signs according to the familiar rules: $++\to+$, $--\to+$,
-$+-\to-$, $-+\to-$, so that $T$ contains only the resolved sign $s'$.
-The system remains in a signed state.
-\item Row 2. The current token is a digit $d$ and the system is in a signed-
-state \strong{s}. We append $d$ to the current term, $Td$ (which will
-now consist of a sign and a digit), and the system shifts to a numeric
-state \strong{n}.
-\item Row 3. The current token is a prime variable $v$ and the system is in
-a signed state \strong{s}. We start assembling an extended variable,
-$Vv$, and append $1v$ to the current term, $T1v$, where the $1$ is
-necessary as discussed earlier (and in any case `sign variable' is not
-a recognised \emph{term} \textendash{} neither signed, numeric or algebraic).
-The system shifts to an algebraic state \strong{a}.
-\item Row 4. The current token is a sign $s$ and the system is in a numeric
-state \strong{n}. The current term is a numeric term, a sign followed
-by at least one digit, and is complete. We append it to the numeric part
-$\mathbf{N}$ of $\mathbf{E}$, $\mathbf{N}T$, then initialise $T$ to
-$s$. The system shifts to a signed state.
-\item Row 5. The current token is a digit $d$ and the system is in a numeric
-state \strong{n}. We append $d$ to the current term, $Td$, and remain
-in a numeric state.
-\item Row 6. The current token is a prime variable $v$ and the system is in
-a numeric state \strong{n}. We start assembling a variable, $Vv$, and
-also append $v$ to the current term, $Tv$. The system shifts to an algebraic
-state \strong{a}.
-\item Row 7. The current token is a sign $s$ and the system is in an algebraic
-state \strong{a}. The current term is an algebraic term, a sign followed
-by at least one digit followed by at least one prime variable, and is complete.
-We append it to the algebraic part $\mathbf{A}$ of $\mathbf{E}$, $\mathbf{A}T$,
-then initialise $T$ to $s$. We also append $V$, in which we have been
-accumulating the (extended) variable, to $\mathbf{V}$, $\mathbf{V}V,$,
-then empty $V$ in preparation for the next (extended) variable. Attention
-is drawn to the comma following $V$ also appended to $\mathbf{V}$, so
-that we can distinguish where one variable ends and the next begins. The
-system shifts to a signed state.
-\item Row 8. The current token is a digit $d$ and the system is in an algebraic
-state \strong{a}. This situation should not arise.\emph{ }We don't write
-$k2$; we write $2k$ \textendash{} number precedes variable. An error
-is generated.
-\item Row 9. The current token is a variable $v$ and the system is in an algebraic
-state \strong{a}. We append $v$ to the current extended variable, $Vv$,
-and also append $v$ to the current term, $Tv$. The system remains in
-an algebraic state \strong{a}.
-\end{itemize}
-To get things under way, an initial plus sign is put in $T$, $T=+$, and
-the system is set to the signed state \strong{s}. In order that \emph{all}
-terms of $\mathbf{E}$ are recorded in either $\mathbf{N}$ or $\mathbf{A}$,
-and all extended variables in $\mathbf{V}$, we append a plus sign to $\mathbf{E}$:
-$\mathbf{E}+$. Since an expression doesn't end with a trailing sign (we
-don't write, e.g., \textbf{\strong{\textbf{2m+k\textendash{}}}}), the
-process necessarily terminates either in row 4 or row 7 with the final
-term appended either to $\mathbf{N}$ or $\mathbf{A}$ and with $T=+$;
-if it terminates in row 7, the final extended variable is appended to $\mathbf{V}$,
-$\mathbf{V}V$ (and $V$ is emptied, although that hardly matters at this
-point).
-
-\subsubsection{An enlarged scheme?}
-
-Row 8 of our table generates an error: a digit following a variable. But
-having allowed products of variables like \texttt{mn} ($mn$), it is very
-tempting to allow \texttt{mm}, i.e. \texttt{m\textasciicircum 2} ($m^{2}$)
-and, indeed, \texttt{m\textasciicircum n} ($m^{n}$). And if we allow
-\texttt{m\textasciicircum 2} and \texttt{m\textasciicircum n}, how can
-we say no to subscripted forms like \texttt{k\_2} ($k_{2}$) and \texttt{k\_n}
-($k_{n}$)? Or, for that matter, \texttt{k\_+} ($k_{+}$) and \texttt{k\_-}
-($k_{-}$), and therefore \texttt{m\textasciicircum +} ($m^{+}$) and
-\texttt{m\textasciicircum -} ($m^{-}$)? And having extended the scheme
-in this way to exponents of \emph{variables}, surely it should also encompass
-exponents of \emph{numbers}, not only an obvious case like \texttt{2\textasciicircum 2}
-($2^{2}$) but less obviously, yet still compellingly, \texttt{2\textasciicircum n}
-($2^{n}$)?
-
-Each of these extensions produces its own problems, but they can all be
-accommodated within an enlarged scheme, as can the use of parentheses (with
-numerical coefficients). Table~\ref{tab:Input-output-states} translates
-neatly into code. Rather than add these complications to \texttt{diffcoeff.sty},
-I have transferred the enlarged scheme to \texttt{diffcoeff.sty}'s `big
-brother', \texttt{diffcoeffx.sty}. The comparable table and routine resulting
-from it in \texttt{diffcoeffx.sty} is much bigger and less obvious than
-in \texttt{diffcoeff.sty}.
-
-\subsubsection{Some code details}
-
-In the code, the states are distinguished by integers as indicated in Table~\ref{tab:State-integers}.
-Tokens are assigned similar integer indexes, as indicated in the table.
-The relevant routine is \texttt{\textbackslash\_\_diffco\_get\_curr\_index:NN}.
-The actions embodied in Table~\ref{tab:Input-output-states} are encoded
-in \texttt{\textbackslash\_\_diffco\_compare\_states:NNNNN} which is
-a direct translation of the table into expl3 code.
-
-\begin{table}[h]
-\caption{Some code details}
-
-\noindent \centering{}\subfloat[\label{tab:State-integers}State integers]{\centering{}%
-\begin{tabular}{|c|c|c|}
-\hline
-State & Index & Tokens\tabularnewline
-\hline
-\hline
-signed & 0 & $+$ $-$\tabularnewline
-\hline
-numeric & 1 & 0123456789\tabularnewline
-\hline
-algebraic & 2 & variables\tabularnewline
-\hline
-\end{tabular}}~~~\subfloat[Translations]{
-\centering{}%
-\begin{tabular}{|c|c|}
-\hline
-Symbol & Code variable\tabularnewline
-\hline
-\hline
-$s$,$d$,$v$ & \texttt{\textbackslash l\_\_diffco\_curr\_tok\_tl}\tabularnewline
-\hline
-$T$ & \texttt{\textbackslash l\_\_diffco\_curr\_term\_tl}\tabularnewline
-\hline
-$V$ & \texttt{\textbackslash l\_\_diffco\_curr\_var\_tl}\tabularnewline
-\hline
-$\mathbf{N}$ & \texttt{\textbackslash l\_\_diffco\_nos\_tl}\tabularnewline
-\hline
-$\mathbf{A}$ & \texttt{\textbackslash l\_\_diffco\_alg\_tl}\tabularnewline
-\hline
-$\mathbf{V}$ & \texttt{\textbackslash l\_\_diffco\_vars\_prop}\tabularnewline
-\hline
-\end{tabular}}
-\end{table}
-A property list is used to store the variables, organised by size \textendash{}
-the number of tokens composing an extended variable. This enables the sorting
-by size needed for the determination of the overall coefficients of variables
-by removing them in turn from the algebraic part of the expression. That
-process is conducted in the routine \texttt{\textbackslash\_\_diffco\_eval\_vars:NN}.
-The variables are recorded only on the first scan through the order specification
-expression. This is the function of the boolean \texttt{\textbackslash l\_\_diffco\_vars\_noted\_bool}
-which is set in \texttt{\textbackslash\_\_diffco\_eval\_vars:NN}. Evaluation
-of the numeric parts of expressions is provided by \texttt{\textbackslash\_\_diffco\_eval\_nos:N}.
-
-\section{Summary of main commands}
-
-\subsubsection{Ordinary derivatives}
-
-The syntax is
+As another example, suppose for the subscripted indication of variables
+held constant in a partial derivative that you want to see what things
+look like if the subscript is \emph{not }nudged in towards the right parenthesis.
+In that case define a variant form
+\begin{lyxcode}
+\textbackslash diffdef~\{~padrift~\}~\{~subscr-nudge~=~0~mu~\}
+\end{lyxcode}
+I have attached a name, \texttt{padrift},\texttt{ }to this setting,
\begin{example}
-{\small{}\textbackslash diff{[}order{]}\{differentiand\}\{variable\}\{point
-of evaluation\}}{\small\par}
+\textbackslash diff.padrift.Fx{[}y{]} $\Longrightarrow{\displaystyle \diff.padrift.Fx[y]}$
\end{example}
-for the differentiand in the numerator, and where the final argument, although
-using braces, is an \emph{optional} argument. A starred form appends the
-differentiand:
+\noindent since, to my eye, the subscript seems detached from the expression
+it qualifies and `adrift in a sea of whitespace'. Is it perhaps a typo?
+This is to be compared with the default
\begin{example}
-{\small{}\textbackslash diff{*}{[}order{]}\{differentiand\}\{variable\}\{point
-of evaluation\}}{\small\par}
+\textbackslash diffpFx{[}y{]} $\Longrightarrow{\displaystyle \diffp Fx[y]}$
\end{example}
-No space must occur between the final optional argument, if it is used,
-and the second mandatory argument.
+\noindent where the subscript is tucked in close to the right parenthesis
+and is clearly connected to it and the expression it delimits.
-There are also slash forms of both these commands:
+Some might want to distinguish notationally a point of evaluation for a
+partial derivative from variables held constant, perhaps using a vertical
+rule for the former and (the default) parentheses for the latter. It would
+suffice then to add to the preamble
+\begin{lyxcode}
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{lyxcode}
+\textbackslash diffdef~\{~pvrule~\}~\{~op-symbol~=~\textbackslash partial~\}~
+\end{lyxcode}
+%
+\end{minipage}
+\end{lyxcode}
+(or some other name of your choosing). This gives
\begin{example}
-{\small{}\textbackslash diff{[}order{]}\{differentiand\}/\{variable\}\{point
-of evaluation\}}{\small\par}
-
-{\small{}\textbackslash diff{*}{[}order{]}\{differentiand\}/\{variable\}\{point
-of evaluation\}}{\small\par}
+\textbackslash diff.pvrule.\{F(x,y)\}x{[}x=1{]}$\Longrightarrow{\displaystyle \diff.pvrule.{F(x,y)}x[x=1]}$
\end{example}
-For the starred form, the differential coefficient is enclosed in parentheses.
-Precisely similar definitions, but without the slash forms, apply to \texttt{\textbackslash Diff},
-forming a differential coefficient with $D$, \texttt{\textbackslash diffd},
-forming a differential coefficient with $\delta$, and \texttt{\textbackslash Diffd},
-forming a differential coefficient with $\Delta$.
+\subsubsection{Text-style and script-style derivatives\label{subsec:Text-and-script-style}}
-\subsubsection{Partial derivatives}
+As noted earlier, the \texttt{diffcoeff} package assumes that derivatives
+of fraction-like form will be used in display-style expressions and that
+the slash form will be used for inline use (text style). This is the usual
+practice. But if one does want to use the fraction form in an inline expression,
+say \texttt{\textbackslash diffp ST{[}V{]}} displaying as $\diffp ST[V]$,
+then some tweaking of settings is necessary: the subscript is obviously
+too close to the right parenthesis and, to my eye, there is too much `elbowroom'
+between the derivative and the enclosing parentheses:
-The syntax is
-\begin{example}
-{\small{}\textbackslash diffp{[}order spec.{]}{[}order override{]}\{differentiand\}\{variables\}\{constant
-variables\}}{\small\par}
-\end{example}
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{lyxcode}
+\textbackslash diffdef~\{~ptxt~\}~
+
+~~\{
+
+~~~~op-symbol~~~~~~=~\textbackslash partial,
+
+~~~~denom-term-sep~=~1~mu~~~~,
-for the differentiand in the numerator and where the final argument, although
-in braces, is an \emph{optional} argument. No space must occur between
-the final optional argument, if it is used, and the second mandatory argument.
-The \textbf{\strong{\textbf{order spec.}}} is a comma-separated list;
-the \strong{variables} is also a comma-separated list. A starred form
-appends the differentiand:
+~~~~left-delim~~~~~=~\textbackslash left~(~,
+
+~~~~right-delim~~~~=~\textbackslash right~),
+
+~~~~elbowroom~~~~~~=~-2~mu~~~,
+
+~~~~subscr-nudge~~~=~-3~mu~~~
+
+~~\}
+\end{lyxcode}
+%
+\end{minipage}
+
+This gives, for the same example, \texttt{\textbackslash diff.ptxt.ST{[}V{]}}
+displaying as $\diff.ptxt.ST[V]$, where the subscript is better positioned
+and there is a better fit between parentheses and derivative. For a mixed
+partial derivative, \texttt{\textbackslash diff.ptxt.\{F(x,y,z)\}\{x,y\}{[}z{]}}
+displays now as $\diff.ptxt.{F(x,y,z)}{x,y}[z]$.
+
+\subsubsection{Derivatives from D, \textbackslash delta, \textbackslash Delta\label{subsec:D-delta-Delta}}
+
+In addition to \texttt{\textbackslash diff.p.},\texttt{ diffcoeff} has
+three further \emph{built-in} variant forms that are commonly used: \texttt{\textbackslash diff.D.},
+\texttt{\textbackslash diff.delta.}, and \texttt{\textbackslash diff.Delta.},
+corresponding to derivatives formed from $D$, $\delta$ and $\Delta$
+respectively.
+
+In fluid dynamics the \emph{material }or \emph{substantive} derivative
+uses an uppercase $D$ in place of $d$. For example, the continuity equation
+is,
\begin{example}
-{\small{}\textbackslash diffp{*}{[}order{]}{[}order~override{]}\{differentiand\}\{variables\}\{constant
-variables\}}{\small\par}
+\textbackslash diff.D.\{\textbackslash rho\}t=\textbackslash diffp\textbackslash rho
+t + \textbackslash mathbf\{u\textbackslash cdot\}\textbackslash nabla\textbackslash rho
+$\Longrightarrow{\displaystyle \diff.D.\rho t=\diffp\rho t+\mathbf{u\cdot}\nabla\rho}$
\end{example}
-Slash forms exist also for these commands:
-\begin{example}
-{\small{}\textbackslash diffp{[}order spec.{]}{[}order override{]}\{differentiand\}/\{variables\}\{constant
-variables\}}{\small\par}
+\noindent where \texttt{\textbackslash diff.D.} produces the D-derivative.
+If you want upright `D's, then the \texttt{ISO} package option will produce
+that effect. Alternatively, \vspace{-2ex}
+
+\begin{lyxcode}
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{lyxcode}
+\textbackslash diffdef~\{~Up~\}~
+
+~~\{
-{\small{}\textbackslash diffp{*}{[}order{]}{[}order~override{]}\{differentiand\}/\{variables\}\{constant
-variables\}}{\small\par}
+~~~~op-symbol~~~~=~\textbackslash mathrm\{D\},
+
+~~~~op-order-sep~=~0~mu
+
+~~\}
+\end{lyxcode}
+%
+\end{minipage}
+\end{lyxcode}
+\noindent provides a variant with upright `D's.
+
+In introductory calculus texts the simple $\delta$-derivative is used.
+This is achieved with the \texttt{\textbackslash diff.delta.} command
+\begin{example}
+\textbackslash diff.delta.yx $\Longrightarrow{\displaystyle \diff.delta.yx}.$
\end{example}
-For the starred version of the slash form, the differential coefficient
-is enclosed in parentheses.
+\noindent This form also features in analytical mechanics (in the Rogues'
+Gallery, the final example at (\ref{eq:eg6})).
-\subsubsection{Settings}
+Similarly, \texttt{\textbackslash diff.Delta.} forms a derivative from
+$\Delta$:
\begin{example}
-\textbackslash diffset{[}option1=<value1>,option2=<value2>,...{]}
+\textbackslash diff.Delta.y/x $\Longrightarrow{\displaystyle \diff.Delta.y/x,}$
\end{example}
-All numerical values should be integers (\texttt{diffcoeff} interprets
-this in units of mu, 1/18 of an em). To return all options to default values,
-write
+\noindent where the slash form of the derivative is shown in this instance.
+
+Higher order forms of these derivatives, points of evaluation, appending
+the differentiand with a star argument, all follow exactly as for the `pure'
+\texttt{\textbackslash diff} command.
+
+\paragraph{The commands \textbackslash Diff, \textbackslash diffd, \textbackslash Diffd}
+
+For compatibility with version 1 of \texttt{diffcoeff}, the commands \texttt{\textbackslash Diff},
+\texttt{\textbackslash diffd} and \texttt{\textbackslash Diffd} are available
+and also produce the $D$, $\delta$ and $\Delta$ derivatives. Just as
+\texttt{\textbackslash diffp} is identified with \texttt{\textbackslash diff.p.}
+for partial derivatives, these commands are identified with \texttt{\textbackslash diff.D.},
+\texttt{\textbackslash diff.delta.}, and \texttt{\textbackslash diff.Delta}
+through commands equivalent to\footnote{In fact the actual commands in \texttt{diffcoeff.sty} use the syntax of
+the \texttt{xparse} package, e.g. \texttt{\textbackslash NewDocumentCommand
+\{ \textbackslash Diff \} \{ \} \{ }\textbackslash diff.D. \}, and similarly
+for the others.}
+\begin{lyxcode}
+\textbackslash newcommand\{\textbackslash Diff\}\{\textbackslash diff.D.\}
+
+\textbackslash newcommand\{\textbackslash diffd\}\{\textbackslash diff.delta.\}
+
+\textbackslash newcommand\{\textbackslash Diffd\}\{\textbackslash diff.Delta.\}
+\end{lyxcode}
+Unless one is using such variant forms frequently, it seems simpler to
+remember that they are available as dot-delimited arguments to the \texttt{\textbackslash diff}
+command, using the obvious name in each case, rather than having to remember
+the precise camel-case form of name of the \texttt{\textbackslash Diff},
+\texttt{\textbackslash diffd} and \texttt{\textbackslash Diffd} commands.
+
+\subsection{The \texttt{.def} file\label{subsec:The-.def-file}}
+
+This mechanism of variant formation is how I have been able to illustrate
+in the Rogues' Gallery, Section~\ref{sec:Rogues'-gallery}, the wide variety
+of different usages culled from the literature. But the thought arises:
+if a variant is to be used only once or twice, isn't this a lot of bother?
+Why not just construct the variant derivative `by hand' out of \texttt{\textbackslash frac}
+and \texttt{\textbackslash mkern} for example? The reason for making such
+definitions is that they can be transferred from document to document.
+For instance, definitions placed in the preamble can be copied to the preamble
+of another document.
+
+But that is hardly optimal. Instead, \texttt{diffcoeff} allows such definitions
+to be placed in a text file with the the extension \texttt{.def} and a
+name of your choosing. For the present document the file is called \texttt{diffcoeff-doc.def}
+and has been placed in the same directory as \texttt{diffcoeff.tex}. To
+use these definitions, the \texttt{diffcoeff} package is called with the
+command
+\begin{lyxcode}
+\textbackslash usepackage{[}def-file=diffcoeff-doc{]}\{diffcoeff\}
+\end{lyxcode}
+But even this process still means copying a definition file from directory
+to directory as one works on different documents. The solution is to make
+a definition file available for \emph{all} documents and the way to do
+that is by placing it in the texmf tree, preferably not the one created
+by your \TeX{} distribution (perhaps MiKTeX or TexLive), but your own \emph{personal}
+texmf tree.
+
+\texttt{\vspace{2ex}
+}
+
+\noindent %
+\noindent\fbox{\begin{minipage}[t]{1\columnwidth - 2\fboxsep - 2\fboxrule}%
+\textbf{Personal texmf tree? }
+
+This is a directory for `waifs and strays' of the \TeX{} system that are
+not included in standard distributions like MiK\TeX{} or \TeX Live. For
+instance, it is the place for personal packages designed for your own particular
+circumstances or preferences, and is structured like the standard MiK\TeX{}
+or \TeX Live hierarchy but placed in another location so that there is
+no chance of its being overwritten when MiK\TeX{} or \TeX Live are updated.
+However, those distributions need to be alerted to its existence. For MiK\TeX ,
+open the MiK\TeX{} console, click on \textsf{Settings} and then the \textsf{Directories}
+tab. Click the \textsf{+} button and navigate to your personal texmf tree
+to add it to the MiK\TeX{} search path. Having added it, you will then need
+to refresh the filename database by clicking on the \textsf{Tasks} menu
+and selecting the obvious entry. I am not familiar with \TeX Live but presume
+a similar process will apply there.%
+\end{minipage}}
+
+\medskip{}
+
+\noindent Provided your \LaTeX{} distribution knows about your personal
+texmf tree, then a \texttt{.def} file placed within it, will be accessible
+to all documents.
+
+\subsubsection{Structure of the \texttt{.def} file}
+
+The best way to see what a \texttt{.def} file looks like is to view \texttt{diffcoeff-doc.def
+}in a text editor.\footnote{This file should be in the same directory as \texttt{diffcoeff.pdf} and
+\texttt{diffcoeff.tex} in your \LaTeX{} distribution.}
+
+If you want your variant definitions to use defaults different from those
+supplied with the \texttt{diffcoeff} package, then the first definition
+in the \texttt{.def} file should be the one setting the new defaults, with
+an \emph{empty} first argument to the \texttt{\textbackslash diffdef}
+command:
+\begin{lyxcode}
+\noindent\begin{minipage}[t]{1\columnwidth}%
+\begin{lyxcode}
+\textbackslash diffdef~\{\}~~~
+\begin{lyxcode}
+\{~~~~~
+\begin{lyxcode}
+key-1~=~value-1,~~~~
+
+key-2~=~value-2,
+
+...
+
+key-n~=~value-n
+\end{lyxcode}
+\}
+\end{lyxcode}
+\end{lyxcode}
+%
+\end{minipage}
+\end{lyxcode}
+The key-value list is a comma-separated list; hence the last entry doesn't
+need to end with a comma. Nudge and separation values need to include the
+unit, \texttt{mu}; a numerical value alone will result in error.\texttt{ }Because
+a \texttt{.def} file\texttt{ }is a \LaTeX{} file, comments need to start
+with a \texttt{\%} character.
+
+\subsubsection{\texttt{diffcoeff.def}}
+
+Note that if the \texttt{diffcoeff} package is invoked without an explicit
+\texttt{def-file= <filename>} option statement, as here,
+\begin{lyxcode}
+\textbackslash usepackage\{diffcoeff\}
+\end{lyxcode}
+then it will search in the texmf tree (the \LaTeX{} distribution's and your
+personal one) and the document directory for a file \texttt{diffcoeff.def}
+and if found will load that. This file should contain definitions of those
+variants you are likely to use in multiple documents. In my personal texmf
+tree (which I've put at \texttt{D:\textbackslash texmf\textbackslash}
+on a Windows machine) the file \texttt{diffcoeff.def} is located in the
+directory \texttt{D:\textbackslash texmf\textbackslash tex\textbackslash latex\textbackslash diffcoeff\textbackslash}.
+(The backslashes are replaced by forward slashes on linux machines.) Variants
+likely to be of value only to a specific document should be added to the
+preamble of that document, or they can be added to \texttt{diffcoeff.def}
+and that file saved to the document directory under a \emph{different}
+name \textendash{} e.g. I've saved the variants required for the present
+document under the name \texttt{diffcoeff-doc.def}. Many of these variants
+were created solely to illustrate points in the present document and I
+have no intention of using them in my own work. Consequently my \texttt{diffcoeff.def}
+file is smaller, containing only a selection from \texttt{diffcoeff-doc.def}.
+
+\section{Rationale}
+
+Version 1 of the \texttt{diffcoeff} package arose from a need to simplify
+the parsing of differential coefficients for another program I was working
+on which was struggling to `read' all the possible permutations of \texttt{\textbackslash frac}
+or \texttt{\textbackslash tfrac} or \texttt{\textbackslash dfrac} or
+slash forms of the derivative, of \texttt{d} or \texttt{\textbackslash mathrm\{d\}}
+or \texttt{\textbackslash partial} or \texttt{D} or \texttt{\textbackslash mathrm\{D\}}
+or \texttt{\textbackslash nabla},\texttt{ }and of points of evaluation
+delimited by vertical rules or parentheses.\texttt{ }Although regular expressions
+coped with most of these cases, it was \emph{messy}.
+
+There are other packages which have commands for the derivative (e.g.,
+\texttt{bropd}, \texttt{commath},\texttt{ esdiff}, \texttt{physymb}) but
+none quite gave what I wanted \textendash{} although they probably cope
+with most users' needs. \texttt{esdiff} came closest to what I was seeking
+but failed when it came to combining algebraic and numeric orders of differentation
+in a mixed partial derivative (and made heavier use of braces than I would
+like in that case too).
+
+\subsection{\texttt{diffcoeff.sty}}
+
+I have tried to make using \texttt{diffcoeff} intuitive. Looking at the
+other packages mentioned, writing something like \texttt{\textbackslash diff{[}n{]}\{f\}\{x\}}
+(which can be trimmed to \texttt{\textbackslash diff{[}n{]}fx} for single-token
+arguments) seems `natural' \textendash{} only \texttt{physymb} deviates
+from the pattern.
+\begin{itemize}
+\item It seems consistent with this pattern to use a comma list for specifying
+the orders of differentiation of the variables in a higher order mixed
+partial derivative (and its suppression when all are of order 1)
+\item Having specified the orders, surely the program itself should calculate
+the overall order? \texttt{esdiff} does this for numerical orders; \texttt{diffcoeff}
+does this for both numeric and algebraic orders,
+\end{itemize}
\begin{example}
-\textbackslash diffset
+\textbackslash diffp{[}m-(k+1),m+(k-1){]}\{F(x,y,z)\}\{x,y,z\}
+
+$\Longrightarrow{\displaystyle \diffp[m-(k+1),m+(k-1)]{F(x,y,z)}{x,y,z}},$
\end{example}
-The options and defaults are
-\begin{description}
-\item [{\strong{roman = false}}] \textbf{\strong{\textbf{true}}} gives upright
-(roman) \textbf{\strong{\textbf{d}}} and \textbf{\strong{\textbf{D}}}
-\item [{\strong{d-delims = . |}}] delimiters which, when subscripted, indicate
-the point of evaluation of an ordinary derivative
-\item [{\strong{p-delims = ( )}}] delimiters which, when subscripted, indicate
-variables held constant for partial derivatives
-\item [{\strong{d-nudge = 0}}] adjustment for positioning the subscript to
-the preceding delimiters
-\item [{\strong{p-nudge = $-$6}}] adjustment for positioning the subscript
-to the preceding delimiters
-\item [{\strong{d-sep = 1}}] additional separation between the \textbf{$d$
-}and its superscript in the numerator of a second or higher order ordinary
-derivative
-\item [{\strong{p-sep = 1}}] additional separation between the \textbf{$\partial$}
-and its superscript in the numerator of a second or higher order partial
-derivative
-\item [{\strong{sep = 2}}] additional separation between the terms in the denominator
-of a mixed partial derivative
-\end{description}
+\begin{itemize}
+\item and where it fails, either to calculate at all or to present the result
+in a preferred form, offers the order-override option:
+\end{itemize}
+\begin{example}
+\textbackslash diffp{[}m+(k+1),m+(k-1){]}{[}2(m+k+1){]}\{F(x,y,z,w)\}\{x,y,z,w\}
-\subsection{Change history}
+$\Longrightarrow{\displaystyle \diffp[m+(k+1),m+(k-1)][2(m+k+1)]{F(x,y,z,w)}{x,y,z,w}}.$
+\end{example}
-Uploaded to CTAN 2016-06-27
+\begin{itemize}
+\item I wished to avoid the unnecessary writing of superscripts, subscripts and
+brace pairs. In the examples just given, no superscript tokens \texttt{\textasciicircum}
+are written by the user despite the higher-order differentiation in $x$
+and $y$, and only the two inescapable brace pairs are required.
+\item The use of a comma list for the second mandatory argument in a partial
+derivative \textendash{} the list of variables \textendash{} makes differentiations
+in super- or subscripted symbols (as occurs prolifically in tensor calculus)
+easier to both write and read by avoiding unnecessary brace pairs.
+\end{itemize}
+\begin{example}
+\textbackslash diffp\{A\_i\}\{ x\textasciicircum j,x\textasciicircum k
+\} $\Longrightarrow\quad{\displaystyle \diffp{A_{i}}{x^{j},x^{k}}.}$
+\end{example}
-2016-06-30 Removed the unused \texttt{extend} package option (a relic from
-earlier experiments).
+\begin{itemize}
+\item Should a point of evaluation or variables held constant be considered part
+of the derivative? Thermodynamic usage was decisive here. The partial derivative
+alone is ambiguous \textendash{} the parentheses and subscript are essential
+to understand what is being stated:
+\[
+\diffp ST[V]
+\]
+Hence provision for these extra elements was included in the derivative
+commands.
+\item Given the position of the subscripted symbol in the displayed derivative,
+it's positioning as the \emph{final} argument in the derivative commands
+feels inevitable.
+\item Version 1 of \texttt{diffcoeff} used braces for this argument to avoid
+any possible confusion with a following mathematical expression. That use
+of braces is now deprecated in \texttt{xparse}. Consequently version 2
+of \texttt{diffcoeff} uses square brackets, conforming with familiar \LaTeX{}
+practice. The only special remembering needed is avoidance of a space before
+the argument \textendash{} and if it does slip in, it won't cause a \LaTeX{}
+error. It will be treated as part of a following mathematical expression
+and displayed as such.
+\item The star option also prompted the question: is it needed? After all, one
+can always leave the first mandatory argument empty and append the differentiand
+`by hand'. But once the provision for points of evaluation or variables
+held constant was incorporated into the derivative commands, the star option
+became the simplest way of handling appended differentiands since the parentheses
+for a variable held constant must wrap around the differential operator
+\emph{and} differentiand. Once available, it provides a simple way of switching
+between (and comparing) the appearance of differentiand-in-the-numerator
+and differentiand-appended.
+\item The slash option was added to the derivative commands after seeing how
+widely such forms are used in texts at all levels. The placement of the
+slash, between the two mandatory arguments, seems more-or-less self-evident.
+\item The final option added to \texttt{\textbackslash diff} (and not present
+in version 1) was the dot-delimited name option. Once \texttt{xtemplate}
+was used as the basis of the package this seemed the most straightforward
+way of making available, ready to hand, the wealth of variants that \texttt{xtemplate}
+makes possible. (It's just a pity that the second dot is needed, and a
+single-dot naming scheme can't be used, but \texttt{xparse} forces my hand
+here.)
+\item Having added the dot-delimited name option, the use of a \texttt{.def}
+file to store variants or preferred defaults is more-or-less forced, otherwise
+one is faced with making these definitions anew for each new document (or
+locating a previous document and copying from that to the new one).
+\item To handle possible differences between display-style and text-style (and
+script-style) derivatives (see Subsection~\ref{subsec:Text-and-script-style})
+I considered using \TeX 's \texttt{\textbackslash mathchoice} command.
+This command takes four arguments, corresponding to display-, text-, script-
+and scriptscript-styles and would require forming four derivatives each
+time a derivative is used, `just in case'. In fact fraction-form derivatives
+are used overwhelmingly in display-style expressions, the slash form being
+used for inline use. Given the ease of defining a fraction-form variant
+for text-style use, and the rareness of such use, employing variants seemed
+the way to go. It is the one adopted and avoids the computational burden
+associated with the use of \texttt{\textbackslash mathchoice}.
+\end{itemize}
-2018-10-25 v.1.1 Changed the handling of error messages.
\end{document}
diff --git a/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def
new file mode 100644
index 00000000000..34a03b2c7f2
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def
@@ -0,0 +1,121 @@
+% file `diffcoeff.def'
+% variant forms of derivative
+% 2018-11-12
+% Andrew Parsloe ajparsloe@gmail.com
+%
+% paren, up, Up, wrapall, nabla, left, svrule
+% pvrule, padrift, psqbra, pDelta, pleft, ptxt, pscr
+%%%%%%%%%% ordinary %%%%%%%%%%
+% ( ) for pt of eval.
+\diffdef { paren }
+ {
+ left-delim = \left ( ,
+ right-delim = \right ),
+ subscr-nudge = -6 mu
+ }
+
+% upright
+\diffdef { up }
+ {
+ op-symbol = \mathrm{d},
+ op-order-sep = 0 mu ,
+ /-op-order-sep = 0 mu
+ }
+
+\diffdef { Up }
+ {
+ op-symbol = \mathrm{D},
+ op-order-sep = 0 mu ,
+ /-op-order-sep = 0 mu
+ }
+
+% wrap long vars: (d longvar)
+\diffdef { wrapall } {long-var-wrap = (dv)}
+
+% nabla in numerator, d in denominator
+\diffdef { nabla }
+ {
+ op-symbol = \nabla,
+ op-symbol-alt = d
+ }
+
+% align op left; no italic nudge
+\diffdef { left }
+ {
+ *-op-left = true,
+ *-italic-nudge = 0 mu
+ }
+
+% slash-form: vrule for pt of eval
+\diffdef { svrule }
+ {
+ /-left-delim = ,
+ /-right-delim = |
+ }
+
+%%%%%%%%%% partial %%%%%%%%%%
+% partial, vrule for pt of eval.
+\diffdef { pvrule } { op-symbol = \partial }
+
+% partial, no subscr nudge (adrift in a sea of white space)
+\diffdef { padrift }
+ {
+ op-symbol = \partial,
+ left-delim = \left ( ,
+ right-delim = \right ),
+ subscr-nudge = 0 mu
+ }
+
+% partial, [ ] for pt of eval.
+\diffdef { psqbra }
+ {
+ op-symbol = \partial,
+ left-delim = \left [ ,
+ right-delim = \right ],
+ subscr-nudge = 0 mu
+ }
+
+% Delta as partial deriv.
+\diffdef { pDelta }
+ {
+ op-symbol = \Delta ,
+ op-order-sep = 0 mu ,
+ /-op-order-sep = 0 mu ,
+ left-delim = \left ( ,
+ right-delim = \right ),
+ subscr-nudge = -6 mu
+ }
+
+% align op left; italic nudge
+\diffdef { pleft }
+ {
+ op-symbol = \partial,
+ *-op-left = true ,
+ *-italic-nudge = 3 mu ,
+ left-delim = \left ( ,
+ right-delim = \right ),
+ subscr-nudge = -3 mu
+ }
+
+% partial, textstyle
+\diffdef { ptxt }
+ {
+ op-symbol = \partial,
+ denom-term-sep = 1 mu ,
+ left-delim = \left ( ,
+ right-delim = \right ),
+ elbowroom = -2 mu ,
+ subscr-nudge = -3 mu
+ }
+
+% partial, scriptstyle
+\diffdef { pscr }
+ {
+ op-symbol = \partial,
+ op-order-sep = 0 mu ,
+ denom-term-sep = 0 mu ,
+ left-delim = \left ( ,
+ right-delim = \right ),
+ subscr-nudge = -3 mu
+ }
+
diff --git a/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty
index 47dd6b869a7..2a5e48a9582 100644
--- a/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty
+++ b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty
@@ -1,705 +1,679 @@
% This is file `diffcoeff.sty'.
%
-% This program is free software; you can redistribute it and/or modify it
-% under the terms of the GNU General Public License as published by the
-% Free Software Foundation; either version 2 of the License, or (at your
-% option) any later version.
+% This work may be distributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.3c
+% (2008-05-04) of this license or any later version; see
+% http://www.latex-project.org/lppl.txt
%
% Andrew Parsloe ajparsloe@gmail.com
%
\RequirePackage{expl3}
-\RequirePackage{xparse}
-\ProvidesExplPackage{diffcoeff} {2018/10/25} {1.1}
- {Write differential coefficients easily.}
-
+\RequirePackage{xparse,l3keys2e,xtemplate}
+\ProvidesExplPackage {diffcoeff} {2018/12/02} {2}
+ {Write differential coefficients consistently and easily.}
+%
+\keys_define:nn { diffcoeff }
+ {
+ ISO .bool_gset:N = \g__diffcoeff_ISO_bool,
+ def-file .tl_gset:N = \g__diffcoeff_def_tl ,
+ def-file .initial:n = diffcoeff ,
+ def-file .default:n = diffcoeff
+ }
+\ProcessKeysPackageOptions { diffcoeff }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\cs_generate_variant:Nn \tl_if_eq:nnF { no }
-\cs_generate_variant:Nn \tl_if_eq:nnT { no }
-\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
-\cs_generate_variant:Nn \prop_pop:NnNT { NV }
-
+\cs_generate_variant:Nn \tl_if_eq:nnTF { nV }
+
+\tl_new:N \l__diffcoeff_op_tl
+\tl_new:N \l__diffcoeff_op_alt_tl
+\tl_new:N \l__diffcoeff_ldelim_tl
+\tl_new:N \l__diffcoeff_rdelim_tl
+\tl_new:N \l__diffcoeff_oporder_tl
+\tl_new:N \l__diffcoeff_differentiand_tl
+\tl_new:N \l__diffcoeff_type_tl
+\tl_new:N \l__diffcoeff_order_spec_tl
+\tl_new:N \l__diffcoeff_denom_tl
+\tl_new:N \l__diffcoeff_tot_order_tl
+\tl_new:N \l__diffcoeff_curr_num_tl
+\tl_new:N \l__diffcoeff_curr_var_tl
+\tl_new:N \l__diffcoeff_paren_tl
+\tl_new:N \l__diffcoeff_trailing_tl
+
+\tl_const:Nn \c__diffcoeff_digits_tl { 1234567890 }
+
+\seq_new:N \l__diffcoeff_orders_seq
+\seq_new:N \l__diffcoeff_vars_seq
+\seq_new:N \l__diffcoeff_denom_seq
+\seq_new:N \l__diffcoeff_paren_seq
+
+\prop_new:N \l__diffcoeff_vars_prop
+
+\bool_new:N \l__diffcoeff_op_left_bool
+\bool_new:N \l__diffcoeff_single_var_bool
+\bool_new:N \l__diffcoeff_opwrap_bool
+
+\int_new:N \l__diffcoeff_format_int
+\int_new:N \l__diffcoeff_curr_tok_int
+\int_new:N \l__diffcoeff_curr_state_int
+\int_new:N \l__diffcoeff_nos_int
+\int_new:N \l__diffcoeff_parenvar_int
+
+\muskip_new:N \l__diffcoeff_oporder_muskip
+\muskip_new:N \l__diffcoeff_opnudge_muskip
+\muskip_new:N \l__diffcoeff_elbowrm_muskip
+\muskip_new:N \l__diffcoeff_subnudge_muskip
+\muskip_new:N \l__diffcoeff_varsep_muskip
+\muskip_new:N \l_tmpc_muskip
+\muskip_new:N \l_tmpd_muskip
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% variables
-\tl_new:N \g_diffco_d_ldelim_tl
-\tl_new:N \g_diffco_d_rdelim_tl
-\tl_new:N \g_diffco_p_ldelim_tl
-\tl_new:N \g_diffco_p_rdelim_tl
-
-\tl_new:N \l__diffco_rentiand_tl
-\tl_new:N \l__diffco_phantom_tl
-\tl_new:N \g_diffco_dop_tl
-\tl_new:N \l__diffco_denom_tl
-\tl_new:N \l__diffco_coeff_tl
-
-\clist_new:N \l__diffco_order_clist
-\tl_new:N \l__diffco_order_spec_tl
-
-\bool_new:N \g__diffco_erent_shape_bool
-\bool_new:N \l__diffco_no_parens_bool
-\bool_new:N \l__diffco_override_bool
-\bool_new:N \l__diffco_vars_noted_bool
+% Derivatives
+% #1 order spec(seqvar)
+% #2 order override(tlvar)
+% #3 differentiand(tlvar)
+% #4 denominator(seqvar)
+% #5 subscript(tlvar)
+\DeclareObjectType { derivative } { 5 }
+
+% defaults: ordinary deriv. values
+\DeclareTemplateInterface { derivative } { DERIV } { 5 }
+ {
+ op-symbol : tokenlist = d ,
+ op-symbol-alt : tokenlist = \KeyValue { op-symbol },
+ op-order-sep : muskip = 1 mu ,
+ /-op-order-sep : muskip = 1 mu ,
+ *-op-left : boolean = false ,
+ *-italic-nudge : muskip = 3 mu ,
+ */-op-wrap : boolean = true ,
+ long-var-wrap : choice { dv, d(v), (dv) }
+ = d(v) ,
+ denom-term-sep : muskip = 2 mu ,
+ /-denom-term-sep : muskip = 1 mu ,
+ left-delim : tokenlist = \left . ,
+ right-delim : tokenlist = \right |,
+ elbowroom : muskip = 0 mu ,
+ subscr-nudge : muskip = 0 mu ,
+ /-left-delim : tokenlist = ( ,
+ /-right-delim : tokenlist = ) ,
+ /-elbowroom : muskip = 0 mu ,
+ /-subscr-nudge : muskip = 0 mu
+ }
-\tl_new:N \l__diffco_orders_in_tl
-\tl_new:N \l__diffco_order_tl
-
-\tl_new:N \l__diffco_curr_tok_tl
-\tl_new:N \l__diffco_curr_term_tl
-
-\int_new:N \l__diffco_curr_tok_int
-\int_new:N \l__diffco_curr_state_int
-
-\prop_new:N \l__diffco_vars_prop
-\tl_new:N \l__diffco_vars_tl
-\clist_new:N \l__diffco_vars_clist
-
-\tl_new:N \l__diffco_curr_var_tl
-\tl_new:N \l__diffco_nos_tl
-\tl_new:N \l__diffco_nos_aux_tl
-
-\tl_new:N \l__diffco_alg_tl
-\tl_new:N \l__diffco_alg_aux_tl
-\tl_new:N \l__diffco_alg_expr_tl
-
-\tl_const:Nn \c__diffco_digits_tl { 1234567890 }
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\keys_define:nn { diffcoeff }
+\DeclareTemplateCode { derivative } { DERIV } { 5 }
{
- roman .bool_gset:N = \g_diffco_roman_bool,
- roman .default:n = { false },
- d-delims .code:n = {
- \tl_gset:Nx \g_diffco_d_ldelim_tl { \left \use_i:nn #1 }
- \tl_gset:Nx \g_diffco_d_rdelim_tl
- { \right \use_ii:nn #1 }
- },
- d-delims .default:n = { .| },
- p-delims .code:n = {
- \tl_gset:Nx \g_diffco_p_ldelim_tl { \left \use_i:nn #1 }
- \tl_gset:Nx \g_diffco_p_rdelim_tl
- { \right \use_ii:nn #1 }
- },
- p-delims .default:n = { () },
- d-nudge .code:n = { \tl_gset:Nn \g_diffco_d_nudge_tl { \mskip #1 mu } },
- d-nudge .default:n = { 0 },
- p-nudge .code:n = { \tl_gset:Nn \g_diffco_p_nudge_tl { \mskip #1 mu } },
- p-nudge .default:n = { -6 },
- sep .code:n = { \tl_gset:Nn \g_diffco_sep_tl { \mskip #1 mu } },
- sep .default:n = { 2 },
- d-sep .code:n = { \tl_gset:Nn \g_diffco_d_sep_tl { \mskip #1 mu } },
- d-sep .default:n = { 1 },
- p-sep .code:n = { \tl_gset:Nn \g_diffco_p_sep_tl { \mskip #1 mu } },
- p-sep .default:n = { 1 },
- }
-
-\DeclareDocumentCommand \diffset { o }
+ op-symbol = \l__diffcoeff_op_tl ,
+ op-symbol-alt = \l__diffcoeff_op_alt_tl ,
+ op-order-sep = \l__diffcoeff_oporder_muskip ,
+ /-op-order-sep = \l_tmpa_muskip ,
+ *-op-left = \l__diffcoeff_op_left_bool ,
+ *-italic-nudge = \l__diffcoeff_opnudge_muskip ,
+ */-op-wrap = \l__diffcoeff_opwrap_bool ,
+ long-var-wrap = {
+ dv = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN
+ \__diffcoeff_wrap_none:NN,
+ d(v) = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN
+ \__diffcoeff_wrap_var:NN ,
+ (dv) = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN
+ \__diffcoeff_wrap_dvar:NN,
+ unknown = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN
+ \__diffcoeff_wrap_var:NN
+ } ,
+ denom-term-sep = \l__diffcoeff_varsep_muskip ,
+ /-denom-term-sep = \l_tmpb_muskip ,
+ left-delim = \l__diffcoeff_ldelim_tl ,
+ right-delim = \l__diffcoeff_rdelim_tl ,
+ elbowroom = \l__diffcoeff_elbowrm_muskip ,
+ subscr-nudge = \l__diffcoeff_subnudge_muskip,
+ /-left-delim = \l_tmpa_tl ,
+ /-right-delim = \l_tmpb_tl ,
+ /-elbowroom = \l_tmpc_muskip ,
+ /-subscr-nudge = \l_tmpd_muskip
+ }
+ {
+ \AssignTemplateKeys
+ \int_compare:nNnT { \l__diffcoeff_format_int } > { 1 }
+ { \__diffcoeff_slash_vals: }
+ \__diffcoeff_build:NNNNN #1#2#3#4#5
+ }
+%%%%%%%%%%
+\cs_new:Npn \__diffcoeff_slash_vals:
{
- \IfValueTF { #1 }
- {
- \clist_if_empty:nTF { #1 }
- { \keys_set:nn { diffcoeff } { roman,d-delims,p-delims,
- d-nudge,p-nudge,sep,d-sep,p-sep } }
- { \keys_set:nn { diffcoeff } { #1 } }
- }
- {
- \keys_set:nn { diffcoeff } { roman,d-delims,p-delims,
- d-nudge,p-nudge,sep,d-sep,p-sep }
- }
+ \muskip_set:Nn \l__diffcoeff_oporder_muskip \l_tmpa_muskip
+ \muskip_set:Nn \l__diffcoeff_varsep_muskip \l_tmpb_muskip
+ \muskip_set:Nn \l__diffcoeff_elbowrm_muskip \l_tmpc_muskip
+ \muskip_set:Nn \l__diffcoeff_subnudge_muskip \l_tmpd_muskip
+ \tl_set:NV \l__diffcoeff_ldelim_tl \l_tmpa_tl
+ \tl_set:NV \l__diffcoeff_rdelim_tl \l_tmpb_tl
}
-
-% now set the defaults
-\diffset
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% Ordinary differential coefficient
-
-% #1 = the order
-% #2 = differentiand
-% #3 = the variable of differentiation
-% #4 = point of evaluation
-
-\NewDocumentCommand \diff{ s o m t/ m g }
+\cs_new:Npn \__diffcoeff_build:NNNNN #1#2#3#4#5
+ {
+ \bool_if:NF \l__diffcoeff_opwrap_bool
+ { \int_set:Nn \l__diffcoeff_format_int { 4 } }
+ \exp_args:NV\tl_if_novalue:nF #5
+ { \l__diffcoeff_ldelim_tl \mkern \l__diffcoeff_elbowrm_muskip }
+ \bool_if:NTF \l__diffcoeff_single_var_bool
+ { \__diffcoeff_single:NNN #2 #3 #4 }
+ {
+ \seq_mapthread_function:NNN #1 #4 \__diffcoeff_map_orders:nn
+ \__diffcoeff_mixed:NNN #2 #3 \l__diffcoeff_denom_seq
+ }
+ \exp_args:NV\tl_if_novalue:nF #5
+ {
+ \mkern \l__diffcoeff_elbowrm_muskip \l__diffcoeff_rdelim_tl
+ \exp_args:NV\tl_if_empty:nF #5
+ {
+ \c_math_subscript_token
+ { \mskip \l__diffcoeff_subnudge_muskip #5 }
+ }
+ }
+ }
+%%%%%%%%%%%%%%%%%%%%
+% (ptl) form denom from #1 orders, & #2 vars, seqs
+\cs_new:Npn \__diffcoeff_map_orders:nn #1#2
{
- \group_begin:
- % roman or italic?
- \bool_if:NF \g__diffco_erent_shape_bool
- { \__diffco_shape:N d }
-
- \IfValueTF { #2 }
- {
- \tl_set:Nn \l__diffco_order_tl { ^{ \g_diffco_d_sep_tl #2 } }
- \int_compare:nNnTF { \tl_count:n { #5 } } > { \c_one }
- { \tl_set:Nn \l__diffco_denom_tl { (#5)^{ #2 } } }
- { \tl_set:Nn \l__diffco_denom_tl { #5^{ #2 } } }
- }
- {
- \tl_set:Nn \l__diffco_order_tl { }
- \tl_if_in:nnTF { #5 } { ^ }
- { \tl_set:Nn \l__diffco_denom_tl { (#5) } }
- { \tl_set:Nn \l__diffco_denom_tl { #5 } }
- }
-
- % position of differentiand: appended (star) or in numerator (no star);
- % slash or fraction?
- \IfBooleanTF { #1 }
- { % differentiand follows diff coeff
- \__diffco_phantom:n { #3 }
- \tl_set:Nn \l__diffco_coeff_tl
+ \tl_if_eq:nnTF { #1 } { 1 }
+ { \seq_put_right:Nn \l__diffcoeff_denom_seq { \l__diffcoeff_op_alt_tl #2 } }
{
- \IfBooleanTF { #4 }
- { % slash (therefore no phantom)
- (\g_diffco_dop_tl \l__diffco_order_tl
- /
- \g_diffco_dop_tl \l__diffco_denom_tl )
- \l__diffco_rentiand_tl
- }
- { % frac
- \frac { \g_diffco_dop_tl \l__diffco_order_tl \l__diffco_phantom_tl }
- { \g_diffco_dop_tl \l__diffco_denom_tl } \l__diffco_rentiand_tl
- }
+ \int_compare:nNnTF { \tl_count:n { #2 } } = { 1 }
+ {
+ \seq_put_right:Nn \l__diffcoeff_denom_seq
+ { \l__diffcoeff_op_alt_tl #2^{ #1 } }
+ }
+ {
+ \seq_put_right:Nx \l__diffcoeff_denom_seq
+ { \__diffcoeff_wrap_longvars:NN { #1 } { #2 } }
+ }
}
- }
- { % differentiand in numerator
- \tl_set:Nn \l__diffco_coeff_tl
- {
- \IfBooleanTF { #4 }
- { % slash
- \g_diffco_dop_tl \l__diffco_order_tl #3
- /
- \g_diffco_dop_tl \l__diffco_denom_tl
- }
- { % frac
- \frac { \g_diffco_dop_tl \l__diffco_order_tl #3 }
- { \g_diffco_dop_tl \l__diffco_denom_tl }
- }
+ }
+% #1 order(tlvar) ; #2 diff'iand(tlvar); % #3 denom(tlvar)
+\cs_new:Npn \__diffcoeff_single:NNN #1#2#3
+ {
+ \__diffcoeff_numer:N { #1 }
+ \__diffcoeff_form_deriv:NNn
+ \l__diffcoeff_oporder_tl
+ \l__diffcoeff_differentiand_tl
+ { \__diffcoeff_denom_single:NN #1 #3 }
+ }
+% #1 total order
+% #2 differentiand
+% #3 denominator seq
+\cs_new:Npn \__diffcoeff_mixed:NNN #1#2#3
+ {
+ \__diffcoeff_numer:N #1
+ \__diffcoeff_form_deriv:NNn
+ \l__diffcoeff_oporder_tl
+ \l__diffcoeff_differentiand_tl
+ { \seq_use:Nn #3 { \mskip \l__diffcoeff_varsep_muskip } }
+ }
+% #1(tl) total order
+\cs_new:Npn \__diffcoeff_numer:N #1
+ {
+ \bool_if:NTF \l__diffcoeff_op_left_bool
+ {
+ \tl_set:Nn \l__diffcoeff_oporder_tl
+ { \mskip \l__diffcoeff_opnudge_muskip }
}
- }
- % pt of eval
- \IfNoValueTF { #6 }
- {
- \l__diffco_coeff_tl
- }
- { % trailing arg: pt of eval.
- \tl_if_empty:nTF { #6 }
+ { \tl_clear:N \l__diffcoeff_oporder_tl }
+ \tl_put_right:No \l__diffcoeff_oporder_tl \l__diffcoeff_op_tl
+ \exp_args:NnV \tl_if_eq:nnF { 1 } #1
{
- \l__diffco_coeff_tl
+ \tl_put_right:Nn \l__diffcoeff_oporder_tl
+ { \mskip \l__diffcoeff_oporder_muskip ^ { #1 } }
}
+ \bool_if:NT \l__diffcoeff_op_left_bool
+ { \tl_put_right:Nn \l__diffcoeff_oporder_tl { \hfill } }
+ }
+% #1 order; #2 var
+\cs_new:Npn \__diffcoeff_denom_single:NN #1#2
+ {
+ \tl_if_eq:nVTF { 1 } #1
+ { \l__diffcoeff_op_alt_tl #2 }
{
- \g_diffco_d_ldelim_tl \l__diffco_coeff_tl \g_diffco_d_rdelim_tl
- \c_math_subscript_token { \g_diffco_d_nudge_tl #6 }
+ \int_compare:nNnTF { \tl_count:N #2 } = { 1 }
+ { \l__diffcoeff_op_alt_tl #2^{ #1 } }
+ { \__diffcoeff_wrap_longvars:NN #1 #2 }
}
- }
- \group_end:
- }
-
-\NewDocumentCommand \Diff { o m m g }
- {
- \group_begin:
- \__diffco_shape:N D
- \bool_gset_true:N \g__diffco_erent_shape_bool
- \diff[#1]{#2}{#3}{#4}
- \bool_gset_false:N \g__diffco_erent_shape_bool
- \group_end:
- }
-
-\NewDocumentCommand \diffd { o m m g }
- {
- \group_begin:
- \__diffco_shape:N \delta
- \bool_gset_true:N \g__diffco_erent_shape_bool
- \diff[#1]{#2}{#3}{#4}
- \bool_gset_false:N \g__diffco_erent_shape_bool
- \group_end:
- }
-
-\NewDocumentCommand \Diffd { o m m g }
- {
- \group_begin:
- \__diffco_shape:N \Delta
- \bool_gset_true:N \g__diffco_erent_shape_bool
- \diff[#1]{#2}{#3}{#4}
- \bool_gset_false:N \g__diffco_erent_shape_bool
- \group_end:
}
-
-\cs_new_nopar:Npn \__diffco_shape:N #1
- {
- \bool_if:NTF \g_diffco_roman_bool
- { \tl_gset:Nn \g_diffco_dop_tl { \mathrm{ #1} } }
- { \tl_gset:Nn \g_diffco_dop_tl { #1 } }
- }
-%%%%%
-\cs_new:Npn \__diffco_append:nn #1#2
- {
- \g_diffco_d_ldelim_tl \l__diffco_coeff_tl \g_diffco_d_rdelim_tl
- \c_math_subscript_token { \mskip #1 mu #2 }
- }
-
-\cs_new:Npn \__diffco_phantom:n #1
- {
- \bool_if:nTF
+\cs_new:Npn \__diffcoeff_wrap_none:NN #1#2
+ { \l__diffcoeff_op_alt_tl #2^{#1} }
+\cs_new:Npn \__diffcoeff_wrap_var:NN #1#2
+ { \l__diffcoeff_op_alt_tl (#2)^{#1} }
+\cs_new:Npn \__diffcoeff_wrap_dvar:NN #1#2
+ { (\l__diffcoeff_op_alt_tl #2)^{#1} }
+
+% #1 op+order; #2 diff'iand; #3 denom
+% 0 frac; 1 frac append; 2 slash ; 3 slash append
+\cs_new:Npn \__diffcoeff_form_deriv:NNn #1#2#3
+ {
+ \int_case:nn { \l__diffcoeff_format_int }
{
- \tl_if_head_eq_meaning_p:nN { #1 } \hfill ||
- \tl_if_head_eq_meaning_p:nN { #1 } \hfil
+ { 0 } { \frac { #1 #2 } { #3 } }
+ { 1 } { \frac { #1 } { #3 } { #2 } }
+ { 2 } { #1 #2 / #3 }
+ { 3 } { ( #1 / #3 ) { #2 } }
+ { 4 } { #1 / #3 { #2 } }
+ }
+ }
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% create new instances or edit existing ones
+% #1 = name; #2 = key-value list
+\NewDocumentCommand \diffdef { > { \TrimSpaces } m m }
+ {
+ \tl_if_empty:nTF { #1 }
+ {
+ \EditTemplateDefaults { derivative }
+ { DERIV } { #2 }
+ \EditInstance { derivative } { ord } { #2 }
}
- { \l__diffco_phantom_aux:nn #1\q_stop }
{
- \bool_if:nTF
- {
- \tl_if_head_eq_meaning_p:nN { #1 } \hspace ||
- \tl_if_head_eq_meaning_p:nN { #1 } \hphantom
- }
- { \l__diffco_phantom_aux:nnn #1\q_stop }
- { \tl_set:Nn \l__diffco_rentiand_tl { #1 } }
+ \IfInstanceExistTF { derivative } { ord.#1 }
+ { \EditInstance { derivative } { ord.#1 } { #2 } }
+ {
+ \DeclareInstance { derivative } { ord.#1 }
+ { DERIV } { #2 }
+ }
}
}
+% superseded relic from version 1
+\NewDocumentCommand \diffset { o }
+ { \msg_warning:nn { diffcoeff } { obsolete } }
-\cs_new:Npn \l__diffco_phantom_aux:nn #1#2\q_stop
+% ordinary
+\DeclareInstance { derivative } { ord } { DERIV } { }
+\bool_if:NTF \g__diffcoeff_ISO_bool
{
- \tl_set:Nn \l__diffco_phantom_tl { #1 }
- \tl_set:Nn \l__diffco_rentiand_tl { #2 }
+ \diffdef {}
+ {
+ op-symbol = \mathrm{d},
+ op-order-sep = 0 mu ,
+ left-delim = \left ( ,
+ right-delim = \right ) ,
+ subscr-nudge = -6 mu
+ }
+ \diffdef { D } { op-symbol = \mathrm{D} }
}
-
-\cs_new:Npn \l__diffco_phantom_aux:nnn #1#2#3\q_stop
+ { \diffdef { D } { op-symbol = D } }
+
+% partial
+\diffdef { p }
{
- \tl_set:Nn \l__diffco_phantom_tl { #1 { #2 } }
- \tl_set:Nn \l__diffco_rentiand_tl { #3 }
+ op-symbol = \partial ,
+ left-delim = \left ( ,
+ right-delim = \right ) ,
+ subscr-nudge = -6 mu
}
-
-%%%%%%%%%%%%%%%%%%%%
-% Partial differential coefficient.
-% #1 (star) = append differentiand boolean
-% #2 = comma list of the orders of diff. in each var.;
-% #3 = order override for the numerator; #4 = differentiand;
-% #5 slash / boolean; #6 = comma list of vars of diff.;
-% #7 = list of vars held const.
-\NewDocumentCommand \diffp{ s o o m t/ m g }
+\NewDocumentCommand \diffp { } { \diff.p. }
+
+\diffdef { delta }
+ {
+ op-symbol = \delta ,
+ op-order-sep = 0 mu
+ }
+\diffdef { Delta }
+ {
+ op-symbol = \Delta ,
+ op-order-sep = 0 mu
+ }
+% for compatibility with version 1
+\NewDocumentCommand \Diff { } { \diff.D. }
+\NewDocumentCommand \diffd { } { \diff.delta. }
+\NewDocumentCommand \Diffd { } { \diff.Delta. }
+
+% user-defined variants
+\file_if_exist:nT { \g__diffcoeff_def_tl.def }
+ { \file_input:n { \g__diffcoeff_def_tl.def } }
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% derivative
+% #1(tl) = name of variant
+% #2(*) = append differentiand boolean
+% #3(clist) = orders of diff. in each var.
+% #4(tl) = order override
+% #5(tl) = differentiand
+% #6 ( / ) = slash boolean
+% #7(clist) = vars of diff. in order
+% #8(tl) = pt of eval./vars held constant
+% #9(tl) = #8 for backwards compatibility
+\NewDocumentCommand \diff{ d.. s O{1} o m t/ m !O{#9} g }
{
- \group_begin:
-
- % diff. order list
- \tl_clear:N \l__diffco_order_clist
- \IfValueT { #2 }
- {
- \clist_set:Nn \l__diffco_order_clist { #2 }
- \tl_set:Nx \l__diffco_order_spec_tl
- { [\clist_use:Nn \l__diffco_order_clist { , }]}
- }
-
- % order list override
- \IfValueT { #3 }
- {
- \bool_set_true:N \l__diffco_override_bool
- \tl_set:Nn \l__diffco_order_tl { #3 }
- }
-
- \__diffco_orders:Nn \l__diffco_order_clist { #6 }
+ \group_begin:
+ \tl_set:Nn \l__diffcoeff_differentiand_tl { #5 }
+ \tl_set:Nn \l__diffcoeff_trailing_tl { #8 }
- % position of differentiand
- \IfBooleanTF { #1 }
- { % appended
- \__diffco_phantom:n { #4 }
- \tl_set:Nn \l__diffco_coeff_tl
- {
- \IfBooleanTF { #5 }
- { % slash (therefore no phantom)
- ( \partial \__diffco_omit_order_if_i:N
- \l__diffco_order_tl
- /
- \l__diffco_denom_tl ) \l__diffco_rentiand_tl
- }
- { % frac
- \frac { \partial \__diffco_omit_order_if_i:N
- \l__diffco_order_tl \l__diffco_phantom_tl }
- { \l__diffco_denom_tl } \l__diffco_rentiand_tl
- }
- }
- }
- { % in numerator
- \tl_set:Nn \l__diffco_coeff_tl
- {
- \IfBooleanTF { #5 }
+ \tl_set:Nn \l__diffcoeff_denom_tl { #7 }
+ \seq_set_split:Nnn \l__diffcoeff_vars_seq { , } { #7 }
+
+ \seq_set_from_clist:Nn \l__diffcoeff_orders_seq { #3 }
+ \tl_set:Nn \l__diffcoeff_order_spec_tl { [#3] }
+
+ \int_set:Nn \l_tmpa_int { \seq_count:N \l__diffcoeff_vars_seq }
+ \int_set:Nn \l_tmpb_int { \seq_count:N \l__diffcoeff_orders_seq }
+ \int_compare:nNnTF { \l_tmpa_int } = { 1 }
+ { \bool_set_true:N \l__diffcoeff_single_var_bool }
+ {
+ \int_compare:nNnTF { \l_tmpa_int } < { \l_tmpb_int }
{
- \partial \__diffco_omit_order_if_i:N \l__diffco_order_tl #4
- / \l__diffco_denom_tl
+ \msg_error:nnxx { diffcoeff } { numbers-conflict }
+ { \int_use:N \l_tmpa_int } { \int_use:N \l_tmpb_int }
}
- {
- \frac { \partial
- \__diffco_omit_order_if_i:N \l__diffco_order_tl
- #4 } { \l__diffco_denom_tl }
+ { % pad orders seq if nec.
+ \int_step_inline:nnnn
+ { 1 + \l_tmpb_int } { 1 } { \l_tmpa_int }
+ { \seq_put_right:Nn \l__diffcoeff_orders_seq { 1 } }
+ \tl_set:NV \l__diffcoeff_denom_tl \l__diffcoeff_vars_seq
}
- }
- }
-
- \IfNoValueTF { #7 }
- { \l__diffco_coeff_tl }
- {
- \tl_if_empty:nTF { #7 }
- {
- \l__diffco_coeff_tl
}
- {
- \g_diffco_p_ldelim_tl \l__diffco_coeff_tl \g_diffco_p_rdelim_tl
- \c_math_subscript_token { \g_diffco_p_nudge_tl #7 }
+ % override/calc total order
+ \IfValueTF { #4 }
+ { \tl_set:Nn \l__diffcoeff_tot_order_tl { #4 } }
+ {
+ \bool_if:NTF \l__diffcoeff_single_var_bool
+ { \tl_set:Nn \l__diffcoeff_tot_order_tl { #3 } }
+ {
+ \__diffcoeff_calc_tot_order:NN \l__diffcoeff_orders_seq
+ \l__diffcoeff_tot_order_tl
+ }
}
- }
- \group_end:
- } % end of \diffp
-
-\NewDocumentCommand \jacob { m m }
- { % need extra braces in denom for clist manipulations
- \diffp{ (#1) }{ { {{(#2)}} } }
+ \IfValueT { #1 } { \tl_set:Nn \l__diffcoeff_type_tl { .#1 } }
+ \int_zero:N \l__diffcoeff_format_int
+ % append? slash?
+ \IfBooleanT #2 { \int_incr:N \l__diffcoeff_format_int }
+ \IfBooleanT #6 { \int_add:Nn \l__diffcoeff_format_int { 2 } }
+
+ \UseInstance { derivative } { ord\l__diffcoeff_type_tl }
+ \l__diffcoeff_orders_seq
+ \l__diffcoeff_tot_order_tl
+ \l__diffcoeff_differentiand_tl
+ \l__diffcoeff_denom_tl
+ \l__diffcoeff_trailing_tl
+ \group_end:
+ } % end of \diff
+%%%%%%%%%%%%%%%%%%%
+% #2(seq) expr in; #1(tlv) expr out
+\cs_new:Npn \__diffcoeff_calc_tot_order:NN #1 #2
+ {
+ \tl_clear:N \l__diffcoeff_nos_tl
+ \exp_args:Nx\__diffcoeff_digest_expr:n { \seq_use:Nn #1 { + } }
+ \prop_if_empty:NTF \l__diffcoeff_vars_prop
+ { \tl_set:NV #2 \l__diffcoeff_nos_tl }
+ { \__diffcoeff_evaluate:NN \l__diffcoeff_vars_prop #2 }
}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% #1 is the clist of diff. orders
-% #2 is the tl of variables (if commas present treat as clist)
-\cs_new:Npn \__diffco_orders:Nn #1#2
+\cs_new:Npn \__diffcoeff_digest_expr:n #1
{
- \int_zero:N \l_tmpa_int
- \tl_clear:N \l_tmpb_tl
- \clist_clear:N \l_tmpa_clist
- \clist_clear:N \l_tmpb_clist
- \clist_clear:N \l__diffco_vars_clist
-
- \clist_set:Nn \l__diffco_vars_clist { #2 }
- \clist_map_inline:Nn \l__diffco_vars_clist
- {
- \bool_set_false:N \l__diffco_no_parens_bool
-
- % get order of each variable
- \clist_pop:NNF #1 \l_tmpa_tl
- { \tl_set:Nn \l_tmpa_tl { 1 } }
-
- \tl_if_eq:noT { 1 } \l_tmpa_tl
- { \bool_set_true:N \l__diffco_no_parens_bool }
-
- \clist_put_right:NV \l_tmpa_clist \l_tmpa_tl
-
- % create the denominator
- \tl_clear:N \l_tmpb_tl
- \bool_if:nTF
- {
- \int_compare_p:nNn { \tl_count:n { ##1 } } = { \c_one }
- ||
- \l__diffco_no_parens_bool
- }
- { \tl_put_right:Nn \l_tmpb_tl { \partial ##1 } }
- { \tl_put_right:Nn \l_tmpb_tl { \partial (##1) } }
-
- \tl_if_eq:noF { 1 } \l_tmpa_tl
+ \tl_set:Nn \l__diffcoeff_curr_num_tl { + }
+ \tl_set:Nn \l__diffcoeff_paren_tl { +1 }
+ \tl_set:Nn \l__diffcoeff_nos_tl { 0 }
+ \int_zero:N \l__diffcoeff_curr_state_int
+ \int_zero:N \l__diffcoeff_curr_tok_int
+ \tl_map_inline:nn { #1+ }
{
- \tl_put_right:Nn \l_tmpb_tl { ^ }
- \tl_put_right:Nx \l_tmpb_tl { { \l_tmpa_tl } }
+ \__diffcoeff_get_curr_ndx:nN { ##1 } \l__diffcoeff_curr_tok_int
+ \__diffcoeff_transitions:nNN { ##1 }
+ \l__diffcoeff_curr_state_int \l__diffcoeff_curr_tok_int
}
-
- \clist_put_right:No \l_tmpb_clist \l_tmpb_tl
- } % end of inline map
-
- % numerator order
- \bool_if:NF \l__diffco_override_bool
- {
- \tl_set:Nx \l__diffco_orders_in_tl { \clist_use:Nn \l_tmpa_clist {+} }
- \diff_simplify_orders:NN \l__diffco_orders_in_tl \l__diffco_order_tl
- }
-
- % denominator
- \tl_set:Nx \l__diffco_denom_tl { \clist_use:Nn
- \l_tmpb_clist { \g_diffco_sep_tl } }
+ \int_set:Nn \l__diffcoeff_nos_int { \l__diffcoeff_nos_tl }
+ \tl_set:Nx \l__diffcoeff_nos_tl { \int_use:N \l__diffcoeff_nos_int }
+ \int_compare:nNnT { \l__diffcoeff_nos_int } = { 0 }
+ { \tl_clear:N \l__diffcoeff_nos_tl }
}
-
-% don't display order 1 superscript
-\cs_new:Npn \__diffco_omit_order_if_i:N #1
- {
- \tl_if_eq:noF { 1 } #1
- { ^{ \g_diffco_p_sep_tl \l__diffco_order_tl } }
- }
-%%%%%%%%%%%%%%%%%%%%%%
-% #1 is expr. in; #2 is expr. out
-\cs_new:Npn \diff_simplify_orders:NN #1 #2
- {
- \tl_clear:N \l__diffco_nos_tl
-
- \__diffco_digest_expr:NNNN \l__diffco_orders_in_tl \l__diffco_nos_tl
- \l__diffco_alg_tl \l__diffco_vars_prop
-
- \__diffco_eval_nos:N \l__diffco_nos_tl
-
- \tl_if_empty:NF \l__diffco_alg_tl
- { \__diffco_eval_vars:NN \l__diffco_alg_tl \l__diffco_vars_prop }
-
- \__diffco_manicure_result:NNN \l__diffco_nos_tl \l__diffco_alg_tl #2
+% #1 curr tok (tl); #2 <== curr tok ndx (int)
+\cs_new:Npn \__diffcoeff_get_curr_ndx:nN #1#2
+ {
+ \tl_if_in:NnTF \c__diffcoeff_digits_tl { #1 }
+ { \int_set:Nn #2 { 1 } } % digit
+ {
+ \str_case:nnF { #1 }
+ {
+ { + } { \int_set:Nn #2 { 0 } }
+ { - } { \int_set:Nn #2 { 0 } }
+ { ( } { \int_set:Nn #2 { 3 } }
+ { ) } { \int_set:Nn #2 { 4 } }
+ }
+ { \int_set:Nn #2 { 2 } } % var
+ }
}
-
-% #1 is the expression; #2 (tl) receives the numerical part;
-% #3 (tl) receives the algebraic part; #4 (prop) receives the vars
-\cs_new:Npn \__diffco_digest_expr:NNNN #1#2#3#4
- {
- \tl_put_right:Nn #1 { + }
- \tl_set:Nn \l__diffco_curr_term_tl { + }
- \int_set:Nn \l__diffco_curr_state_int { \c_zero }
- \int_set:Nn \l__diffco_curr_tok_int { \c_zero }
- \tl_clear:N #3
- \prop_clear:N #4
-
- \tl_map_inline:Nn #1
- {
- \tl_set:Nn \l__diffco_curr_tok_tl { ##1 }
- \__diffco_get_curr_index:NN ##1 \l__diffco_curr_tok_int
- \__diffco_compare_states:NNNNN \l__diffco_curr_state_int
- \l__diffco_curr_tok_int #2#3#4
- }
- \tl_if_empty:NT #2 { \tl_set:Nn #2 { 0 } }
+% #1(tl) curr tok; #2(int) curr state; #3(int) curr tok ndx
+\cs_new:Npn \__diffcoeff_transitions:nNN #1#2#3
+ {
+ \int_case:nn { #2 }
+ {
+ { 0 } % sgn + -
+ { \__diffcoeff_sgn_transitions:nNN { #1 }#2#3 }
+ { 1 } % num
+ { \__diffcoeff_num_transitions:nNN { #1 }#2#3 }
+ { 2 } % alg
+ { \__diffcoeff_alg_transitions:nNN { #1 }#2#3 }
+ { 4 } % )
+ { \__diffcoeff_rpar_transitions:nNN { #1 }#2#3 }
+ }
}
-
-% #1 contains current token (tl); #2 receives current state (int)
-\cs_new:Npn \__diffco_get_curr_index:NN #1#2
+% transitions from the signed state
+% #1(tl) curr tok; #2(int) 0, curr state; #3 curr tok ndx
+\cs_new:Npn \__diffcoeff_sgn_transitions:nNN #1#2#3
{
- \tl_if_in:NnTF \c__diffco_digits_tl { #1 }
- { % digit
- \int_set:Nn #2 { \c_one }
- }
- {
- \tl_case:NnF #1
- {
- + { \int_set_eq:NN #2 \c_zero }
- - { \int_set_eq:NN #2 \c_zero }
- ( {
- \msg_error:nnxx { diffcoeff } { unknown_token }
- { \l__diffco_order_spec_tl } { parentheses }
+ \int_case:nnTF { #3 }
+ {
+ { 0 } % tok = s
+ {
+ \tl_if_eq:nVTF { #1 } \l__diffcoeff_curr_num_tl
+ { \tl_set:Nn \l__diffcoeff_curr_num_tl { + } }
+ { \tl_set:Nn \l__diffcoeff_curr_num_tl { - } }
+ }
+ { 1 } % tok = d
+ { \tl_put_right:Nn \l__diffcoeff_curr_num_tl { #1 } }
+ { 2 } % tok = v
+ {
+ \tl_put_right:Nn \l__diffcoeff_curr_num_tl { 1 }
+ \tl_set:Nn \l__diffcoeff_curr_var_tl { #1 }
}
- ^ {
- \msg_error:nnxx { diffcoeff } { unknown_token }
- { \l__diffco_order_spec_tl } { superscript }
+ { 3 } % tok = (
+ {
+ \seq_push:NV \l__diffcoeff_paren_seq \l__diffcoeff_paren_tl
+ \tl_put_left:NV \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl
+ \tl_set:Nn \l__diffcoeff_curr_num_tl { + }
+ \int_set:Nn #3 { 0 }
}
- }
- {
- \token_if_math_subscript:NTF #1
- {
- \msg_error:nnxx { diffcoeff } { unknown_token }
- { \l__diffco_order_spec_tl } { subscript }
- }
- { \int_set_eq:NN #2 \c_two } % var
- }
- }
+ }
+ { \int_set_eq:NN #2 #3 }
+ {
+ \msg_error:nnxxx { diffcoeff } { order-specification }
+ { \l__diffcoeff_order_spec_tl } { #1 } { sign }
+ }
}
-
-% #1 (int) is curr. state; #2 (int) is curr token index;
-% #3 (tl) receives the numerical part;
-% #4 (tl) receives the algebraic part;
-% #5 (prop) receives the vars
-\cs_new:Npn \__diffco_compare_states:NNNNN #1#2#3#4#5
+% transitions from the numeric state
+% #1 = curr. tok.; #2 = 0, curr. state; #3 curr. tok. index
+\cs_new:Npn \__diffcoeff_num_transitions:nNN #1#2#3
{
- \int_case:nn { #1 }
- {
- { \c_zero } % sgn
- {
- \int_case:nn { #2 }
+ \int_case:nnTF { #3 }
+ {
+ { 0 } % tok = s
{
- { \c_zero } % tok = s
+ \__diffcoeff_store_num:NNN \l__diffcoeff_nos_tl
+ \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl
+ \tl_set:Nn \l__diffcoeff_curr_num_tl { #1 }
+ }
+ { 1 } % tok = d
+ { \tl_put_right:Nn \l__diffcoeff_curr_num_tl { #1 } }
+ { 2 } % tok = v
+ { \tl_set:Nn \l__diffcoeff_curr_var_tl { #1 } }
+ { 3 } % tok = (
+ {
+ \seq_push:NV \l__diffcoeff_paren_seq \l__diffcoeff_paren_tl
+ \tl_put_left:Nn \l__diffcoeff_paren_tl { * }
+ \tl_put_left:NV \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl
+ \tl_set:Nn \l__diffcoeff_curr_num_tl { + }
+ \int_set:Nn #3 { 0 }
+ }
+ { 4 } % tok = )
+ {
+ \__diffcoeff_store_num:NNN \l__diffcoeff_nos_tl
+ \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl
+ }
+ }
+ {
+ \int_set_eq:NN #2 #3 }
+ {
+ \msg_error:nnxxx { diffcoeff } { order-specification }
+ { \l__diffcoeff_order_spec_tl } { #1 } { number }
+ }
+ }
+% transitions from the algebraic state
+% #1 = curr. tok.; #2 = 2, curr. state; #3 curr. tok. index
+\cs_new:Npn \__diffcoeff_alg_transitions:nNN #1#2#3
+ {
+ \int_case:nnTF { #3 }
+ {
+ { 0 } % tok = s
+ {
+ \int_compare:nNnTF { \l__diffcoeff_parenvar_int } = { 0 }
{
- \tl_if_eq:NNTF \l__diffco_curr_term_tl \l__diffco_curr_tok_tl
- { \tl_set:Nn \l__diffco_curr_term_tl { + } }
- { \tl_set:Nn \l__diffco_curr_term_tl { - } }
+ \__diffcoeff_store_var:NNN \l__diffcoeff_curr_var_tl
+ \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl
+ \tl_clear:N \l__diffcoeff_curr_var_tl
+ \tl_set:Nn \l__diffcoeff_curr_num_tl { #1 }
}
- { \c_one } % tok = d
- { \__diffco_term_append:NN #1#2 }
- { \c_two } % tok = v
{
- \tl_put_right:Nn \l__diffco_curr_term_tl { 1 }
- \__diffco_term_var_append:NN #1#2
+ \tl_put_right:Nn \l__diffcoeff_curr_var_tl { #1 }
+ \int_set:Nn #3 { 2 }
}
}
- }
- { \c_one } % num
- {
- \int_case:nn { #2 }
+ { 1 } % tok = d
+ {
+ \tl_put_right:Nn \l__diffcoeff_curr_var_tl { #1 }
+ \int_set:Nn #3 { 2 }
+ }
+ { 2 } % tok = v
+ { \tl_put_right:Nn \l__diffcoeff_curr_var_tl { #1 } }
+ { 3 } % tok = (
{
- { \c_zero } % tok = s
- {
- \tl_put_right:NV #3 \l__diffco_curr_term_tl
- \tl_clear:N \l__diffco_curr_term_tl
- \__diffco_term_append:NN #1#2
- }
- { \c_one } % tok = d
- { \__diffco_term_append:NN #1 \c_one }
- { \c_two } % tok = v
- { \__diffco_term_var_append:NN #1#2 }
+ \tl_put_right:Nn \l__diffcoeff_curr_var_tl { #1 }
+ \int_set:Nn #3 { 2 }
+ \int_incr:N \l__diffcoeff_parenvar_int
}
- }
- { \c_two } % alg
- {
- \int_case:nn { #2 }
+ { 4 } % tok = )
{
- { \c_zero } % tok = s
+ \int_compare:nNnTF { \l__diffcoeff_parenvar_int } = { 0 }
{
- \tl_put_right:NV #4 \l__diffco_curr_term_tl
- \tl_clear:N \l__diffco_curr_term_tl
- \bool_if:NF \l__diffco_vars_noted_bool
- { \__diffco_store_var:NN #5 \l__diffco_curr_var_tl }
- \tl_clear:N \l__diffco_curr_var_tl
- \__diffco_term_append:NN #1#2
+ \__diffcoeff_store_var:NNN \l__diffcoeff_curr_var_tl
+ \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl
+ \tl_clear:N \l__diffcoeff_curr_var_tl
}
- { \c_one } % tok = d
- {
- \__diffco_term_var_append:NN #1 \c_two
- \msg_error:nnx { diffcoeff } { variable_digit_sequence }
- { \l__diffco_order_spec_tl }
+ {
+ \tl_put_right:Nn \l__diffcoeff_curr_var_tl { #1 }
+ \int_set:Nn #3 { 2 }
+ \int_decr:N \l__diffcoeff_parenvar_int
}
- { \c_two } % tok = v
- { \__diffco_term_var_append:NN #1 \c_two }
}
- }
- }
+ }
+ { \int_set_eq:NN #2 #3 }
+ {
+ \msg_error:nnxxx { diffcoeff } { order-specification }
+ { \l__diffcoeff_order_spec_tl } { #1 }
+ { variable }
+ }
}
-
-% #1 current state; #2 current token index
-\cs_new:Npn \__diffco_term_var_append:NN #1#2
+% transitions from the ) state
+% #1 = curr. tok.; #2 = 4, curr. state; #3 curr. tok. index
+\cs_new:Npn \__diffcoeff_rpar_transitions:nNN #1#2#3
{
- \tl_put_right:NV \l__diffco_curr_term_tl \l__diffco_curr_tok_tl
- \tl_put_right:NV \l__diffco_curr_var_tl \l__diffco_curr_tok_tl
- \int_set_eq:NN #1 #2
+ \int_compare:nNnTF { \int_mod:nn { #3 } { 4} } = { 0 }
+ {
+ \tl_set:Nn \l__diffcoeff_curr_num_tl { #1 }
+ \seq_pop:NN \l__diffcoeff_paren_seq \l__diffcoeff_paren_tl
+ \int_set_eq:NN #2 #3
+ }
+ {
+ \msg_error:nnxxx { diffcoeff } { order-specification }
+ { \l__diffcoeff_order_spec_tl } { #1 } { ) }
+ }
}
-
-% #1 current state; #2 current token index
-\cs_new:Npn \__diffco_term_append:NN #1#2
+% #1=store (tlvar); #2=num. coeff. (tlvar); #3=num.(tlvar)
+\cs_new:Npn \__diffcoeff_store_num:NNN #1#2#3
{
- \tl_put_right:NV \l__diffco_curr_term_tl \l__diffco_curr_tok_tl
- \int_set_eq:NN #1 #2
- }
-
-% #1 is prop list; #2 is tl containing var
-\cs_new:Npn \__diffco_store_var:NN #1 #2
- {
- \int_set:Nn \l_tmpa_int { \exp_args:NV \tl_count_tokens:n #2 }
- \prop_get:NVNTF #1 \l_tmpa_int \l_tmpa_tl
- {
- \tl_put_right:Nn \l_tmpa_tl { , }
- \tl_put_right:NV \l_tmpa_tl #2
- \prop_put:NVV #1 \l_tmpa_int \l_tmpa_tl
- }
- {
- \prop_put:NVV #1 \l_tmpa_int #2
- }
- }
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% evals numerical expr. in #1, which receives the
-% evaluated expr.
-\cs_new:Npn \__diffco_eval_nos:N #1
+ \tl_put_right:NV #1 #2
+ \tl_put_right:Nn #1 { * }
+ \tl_put_right:NV #1 #3
+ }
+% #1 is var. (tlvar); #2 is num. (tlvar); #3 num. coeff. (tlvar)
+\cs_new:Npn \__diffcoeff_store_var:NNN #1#2#3
{
- \int_set:Nn \l_tmpa_int { #1 }
- \tl_set:Nx #1 { \int_use:N \l_tmpa_int }
- \int_compare:nNnT { \l_tmpa_int } > { \c_zero }
- { \tl_put_left:Nn #1 { + } }
+ \prop_get:NVNF \l__diffcoeff_vars_prop #1 \l_tmpa_tl
+ { \tl_clear:N \l_tmpa_tl }
+ \__diffcoeff_store_num:NNN \l_tmpa_tl #2 #3
+ \prop_put:NVV \l__diffcoeff_vars_prop #1 \l_tmpa_tl
}
-
-% #1 (tl) has algebraic part & receives eval. expression
-% #2 (prop) contains the variables
-% The idea is to remove each var but leave coeffs, split into
-% num & alg parts, eval. the num part for the net coeff of var
-\cs_new:Npn \__diffco_eval_vars:NN #1#2
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% #1 (prop) vars (keys) & coeffs (vals); #2 total order
+\cs_new:Npn \__diffcoeff_evaluate:NN #1#2
{
- \bool_set_true:N \l__diffco_vars_noted_bool
- \prop_set_eq:NN \l_tmpa_prop #2
- \int_set_eq:NN \l_tmpa_int \c_one
- \bool_until_do:nn { \prop_if_empty_p:N #2 }
- {
- \prop_pop:NVNT #2 \l_tmpa_int \l_tmpa_tl
+ \prop_map_inline:Nn #1
+ {
+ \int_compare:nNnF { \int_eval:n { ##2 } } = { 0 }
+ {
+ \seq_put_right:Nx \l_tmpa_seq
+ { { +\int_eval:n { ##2 } } { ##1 } }
+ }
+ }
+ \seq_sort:Nn \l_tmpa_seq
{
- \tl_put_left:Nn \l_tmpa_tl { , }
- \tl_put_left:NV \l__diffco_vars_tl \l_tmpa_tl
+ \int_compare:nNnTF
+ { \tl_count:V { \use_ii:nn ##1 } } <
+ { \tl_count:V { \use_ii:nn ##2 } }
+ { \sort_return_swapped: }
+ { \sort_return_same: }
}
- \int_incr:N \l_tmpa_int
- }
-
- \clist_set:NV \l__diffco_vars_clist \l__diffco_vars_tl
- \clist_remove_duplicates:N \l__diffco_vars_clist
-
- \clist_map_inline:Nn \l__diffco_vars_clist
- {
- \tl_replace_all:Nnn #1 { ##1 } { }
- \__diffco_digest_expr:NNNN #1 \l__diffco_nos_aux_tl \l__diffco_alg_aux_tl
- \l_tmpa_prop
-
- \__diffco_eval_nos:N \l__diffco_nos_aux_tl
-
- \__diffco_cumulate_expr:NnN \l__diffco_nos_aux_tl { ##1 }
- \l__diffco_alg_expr_tl
-
- \tl_set_eq:NN #1 \l__diffco_alg_aux_tl
- \tl_clear:N \l__diffco_nos_aux_tl
- \tl_clear:N \l__diffco_alg_aux_tl
- }
-
- \tl_set_eq:NN #1 \l__diffco_alg_expr_tl
+ \tl_set:Nx \l_tmpa_tl { \seq_use:Nn \l_tmpa_seq { } }
+ \seq_set_split:NnV \l_tmpa_seq {} \l_tmpa_tl
+ \tl_clear:N \l_tmpa_tl
+ \seq_map_inline:Nn \l_tmpa_seq
+ {
+ \tl_if_eq:nnTF { +-1 } { ##1 }
+ { \tl_put_right:Nn \l_tmpa_tl { - } }
+ {
+ \tl_if_eq:nnTF { +1 } { ##1 }
+ { \tl_put_right:Nn \l_tmpa_tl { + } }
+ { \tl_put_right:Nn \l_tmpa_tl { ##1 } }
+ }
+ }
+ \tl_replace_all:Nnn \l_tmpa_tl { +- } { - }
+ \exp_args:NV \tl_if_head_eq_charcode:nNTF \l_tmpa_tl +
+ {
+ \int_compare:nNnT { \l__diffcoeff_nos_int } > { 0 }
+ { \tl_put_left:Nn \l__diffcoeff_nos_tl { + } }
+ \tl_set:Nx \l_tmpb_tl { \tl_tail:N \l_tmpa_tl }
+ \tl_concat:NNN #2 \l_tmpb_tl \l__diffcoeff_nos_tl
+ }
+ {
+ \int_compare:nNnTF { \l__diffcoeff_nos_int } > { 0 }
+ { \tl_concat:NNN #2 \l__diffcoeff_nos_tl \l_tmpa_tl }
+ { \tl_concat:NNN #2 \l_tmpa_tl \l__diffcoeff_nos_tl }
+ }
+ \tl_set_rescan:Nno #2 { } #2
}
-
-% #1 is num coeff; #2 is var; #3 is cumulating expr. (All tl.)
-\cs_new:Npn \__diffco_cumulate_expr:NnN #1#2#3
+%%%%%%%%%%%%%%%%%%%%
+% Jacobian
+\NewDocumentCommand \jacob { m t/ m }
{
- \int_case:nnF { #1 }
- {
- { 0 } { \prg_do_nothing: }
- { +1 } { \tl_put_right:Nn #3 { + #2 } }
- { -1 } { \tl_put_right:Nn #3 { - #2 } }
- }
- {
- \tl_put_right:NV #3 { #1 }
- \tl_put_right:Nn #3 { #2 }
- }
+ \group_begin:
+ \IfBooleanTF #2
+ { \partial(#1) / \partial(#3) }
+ { \frac{ \partial(#1) } { \partial(#3) } }
+ \group_end:
}
-
-% alg. part precedes num. part unless alg. starts
-% with - and nums > 0. #1 nums, #2 alg, #3 output
-\cs_new:Npn \__diffco_manicure_result:NNN #1#2#3
- { % alg < 0 ?
- \exp_args:NV \tl_if_head_eq_charcode:nNTF #2 -
- {
- \int_compare:nNnTF { #1 } > { \c_zero }
- { % nums > 0
- \tl_concat:NNN #3 #1 #2
- }
- { % nums =< 0
- \seq_set_split:NnV \l_tmpa_seq { + } #2
- \seq_pop:NN \l_tmpa_seq \l_tmpa_tl
- \tl_set:Nx \l_tmpb_tl { \seq_use:Nn \l_tmpa_seq { + } }
- \int_compare:nNnF { #1 } = { \c_zero }
- { \tl_concat:NNN \l_tmpa_tl \l_tmpa_tl #1 }
- \tl_concat:NNN #3 \l_tmpb_tl \l_tmpa_tl
- }
- }
- { % alg >= 0
- \int_compare:nNnTF { #1 } = { \c_zero }
- { \tl_set_eq:NN #3 #2 }
- { \tl_concat:NNN #3 #2 #1 }
- }
-
- % if everything cancels, output 0
- \tl_if_empty:NTF #3 { \tl_set:Nn #3 { 0 } }
- {
- % trim initial + sign
- \exp_args:NV \tl_if_head_eq_charcode:nNT #3 +
- { \tl_set:Nx #3 { \tl_tail:N #3 } }
- }
- }
-%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%
% messages
-\tl_gset:Nn \g__diffcoeff_info_text:
- { Use~the~order-override~option~to~specify~the~overall~order~of~
- differentiation. }
-
-\msg_new:nnnn { diffcoeff } { unknown_token }
- { Unimplemented~in~diffcoeff.sty:~#2~in~the~order~specification~#1~
- \msg_line_context:. }
- { \g__diffcoeff_info_text: }
-
-\msg_new:nnnn { diffcoeff } { variable_digit_sequence }
- { Unimplemented~in~diffcoeff.sty:~a~digit~follows~a~variable~in~the~order~
- specification~#1~\msg_line_context:. }
- { \g__diffcoeff_info_text: }
-
-%% version history
-% 1.1 Fix message handling mess; avoids conflict with mhchem.sty \ No newline at end of file
+\msg_new:nnn { diffcoeff } { order-specification }
+ {
+ Is~this~intended:~#3~followed~by~#2~in~the~order~
+ specification~#1~\msg_line_context:?~Diffcoeff~cannot~calculate~
+ the~overall~order~of~differentiation~in~this~case.~
+ Use~the~order-override~option~to~enter~the~overall~order.
+ }
+\msg_new:nnn { diffcoeff } { obsolete }
+ {
+ Obsolete~command:~\diffset has~been~superseded~by~the~\diffdef\
+ command.~\msg_see_documentation_text:n { diffcoeff }
+ }
+\msg_new:nnn { diffcoeff } { numbers-conflict }
+ {
+ #2~orders~specified~for~#1~variables;~\l__diffcoeff_order_spec_tl
+ \ (\msg_line_context:)~for~variables~\l__diffcoeff_denom_tl.
+ }
+% end of file diffcoeff.sty \ No newline at end of file