diff options
author | Norbert Preining <preining@logic.at> | 2013-05-27 01:22:20 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2013-05-27 01:22:20 +0000 |
commit | 607ddea4532c7768b2e2b44bd602fae2c98b9456 (patch) | |
tree | 6660587ab0926889411ecca7655bdcf0acda42c8 /Master/texmf-dist/source/latex/skmath | |
parent | bddefbf234bbe8889456b2e1b09cce68cf590891 (diff) |
skmath 5/27
git-svn-id: svn://tug.org/texlive/trunk@30698 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/skmath')
-rw-r--r-- | Master/texmf-dist/source/latex/skmath/skmath.tex | 782 |
1 files changed, 782 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/skmath/skmath.tex b/Master/texmf-dist/source/latex/skmath/skmath.tex new file mode 100644 index 00000000000..328f2d03fb5 --- /dev/null +++ b/Master/texmf-dist/source/latex/skmath/skmath.tex @@ -0,0 +1,782 @@ +%% skmath improved math commands +%% +%% Copyright (C) 2012-2013 by Simon Sigurdhsson <sigurdhsson@gmail.com> +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Simon Sigurdhsson. +%% +%% This work consists of the file skmath.tex +%% and the derived file skmath.sty. +\PassOptionsToPackage{intlimits,sumlimits,namelimits}{amsmath} +\documentclass[commonsets,load]{skdoc} +\usepackage{amsmath} +\usepackage{csquotes} +\ProvideDocumentCommand\d{m}{#1} +\ProvideDocumentCommand\pd{smm}{#2#3} +\ProvideDocumentCommand\abs{m}{#1} +\ProvideDocumentCommand\norm{m}{#1} +\ProvideDocumentCommand\abs{m}{#1} +\ProvideDocumentCommand\P{m}{#1} +\ProvideDocumentCommand\given{}{} +\ProvideDocumentCommand\E{m}{#1} +\ProvideDocumentCommand\var{m}{#1} +\ProvideDocumentCommand\cov{mm}{#1#2} +\ProvideDocumentCommand\N{}{} +\ProvideDocumentCommand\Z{}{} +\ProvideDocumentCommand\Q{}{} +\ProvideDocumentCommand\R{}{} +\ProvideDocumentCommand\C{}{} +\ProvideDocumentCommand\sfrac{mm}{#1#2} +\ProvideDocumentCommand\argmin{om}{#1} +\ProvideDocumentCommand\argmax{om}{#1} + +% Declare the target files +\SelfPreambleTo{\mypreamble} +\DeclareFile[key=package,preamble=\mypreamble]{skmath.sty} + +% Hack for LaTeX3 code +\ExplSyntaxOn +\cs_set_protected_nopar:Npn\ExplHack{ +\char_set_catcode_letter:n{ 58 } +\char_set_catcode_letter:n{ 95 } } +\ExplSyntaxOff + +% This is where the documentation begins +\begin{document} + % Change & version info + \version{0.3} + \changes{0.1}{Initial version} + \changes{0.1c}{Moved package from \pkg{docstrip} to \pkg{skdoc}} + \changes{0.1d}{Fixed fatal documentation and package errors} + \changes{0.1e}{Added statistics commands} + \changes{0.1g}{Documentation fixes} + \changes{0.2}{Use \pkg{expl3} functionality throughout the package} + \changes{0.3}{Added \cs{min}/\cs{max} and friends. Added \cs{pd}} + + % Metadata + \package[ctan=skmath,vcs=https://github.com/urdh/skmath]{skmath} + \author{Simon Sigurdhsson} + \email{sigurdhsson@gmail.com} + + % First page + \maketitle + \begin{abstract} + The \thepackage\ package provides improved and new math commands + for superior typesetting with less effort. + \end{abstract} + + \section{Introduction} + This package intends to provide helpful (re-)definitions of commands + related to typesetting mathematics, and specifically typesetting + them in a more intuitive, less verbose and more beautiful way. + It was originally not intended for use by the public, and as such + there may be incompatibilities with other packages of which I am + not aware, but I figured it could be useful to other people as well. + + \section{Usage} + \subsection{Options} + As of version \theversion, there is only one option: \opt{commonsets}. + By default, it is disabled but if the option is given the package will + define \cs{N}, \cs{Z}, \cs{Q}, \cs{R} and \cs{C} as blackboard + variants of the respective letters, to represent the common sets + of numbers. + + \subsection{New commands} + The package defines a number of new commands that aid in typesetting + certain mathematical formulae. + + \DescribeMacro\N + \DescribeMacro\Z + \DescribeMacro\Q + \DescribeMacro\R + \DescribeMacro\C + These commands are only available if the \opt{commonsets} + option is given. They typeset the set of natural, integer, rational, + real and complex numbers respectively. +\begin{example} +\begin{equation*} + \N, \Z, \Q, \R, \C. +\end{equation*} +\end{example} + + \DescribeMacro\norm{<expression>} + \DescribeMacro\abs{<expression>} + The commands \Macro\norm and \Macro\abs, quite expectedly, typeset + the norm ans absolute value of an expression, respectively. They + have one mandatory argument (the expression), and different norms + can be achieved by appending a subscript after the argument of + \Macro\norm. +\begin{example} +\begin{equation*} + \norm{\vec{x}}_p = + \left(\sum_{i=1}^n \abs{x_i}^p\right)% + ^{\sfrac{1}{p}} +\end{equation*} +\end{example} + + \DescribeMacro\d{<variable>} + There is also a command \Macro\d, with one mandatory argument, that + typesets the differential part of an integral. +\begin{example} +\begin{equation*} + \int_{\R}\! \frac{\sin{x}}{x} \d{x} +\end{equation*} +\end{example} + + \DescribeMacro\pd*{<function>}{<var>,\meta{var},...} + This macro typesets a partial derivative. The starred variant typesets + derivatives as subscripts, i.e. \(\pd*{f}{x^2,y}\), while the unstarred + variant typesets full fractions: +\begin{example} +\begin{equation*} + \pd{f}{x^m,y^n} +\end{equation*} +\end{example} + + As the example shows, the comma-separated list of variables also + supports superscripts to denote the number of derivatives, and the + sum of the variables is automatically calculated. + + \DescribeMacro\E{<expression>} + The command \Macro\E typesets the expectation of a random variable. +\begin{example} +\begin{equation*} + \E{\hat{\mu}} = \mu +\end{equation*} +\end{example} + + \DescribeMacro\P{<expression>\AlsoMacro\given <expression>} + The \Macro\P command typesets a probability. The \Macro\given command + can be used to typeset conditional probabilities, within \Macro\P. +\begin{example} +\begin{equation*} + \P{A\given B} = + \frac{\P{B\given A}\P{A}}{\P{B}} +\end{equation*} +\end{example} + + \DescribeMacro\var{<expression>} + \DescribeMacro\cov{<expression>}{<expression>} + The commands \Macro\var and \Macro\cov typeset the variance and + covariance of an expression. +\begin{example} +\begin{gather*} + \var{X} = \E{(X-\mu)^2}\\ + \cov{X}{Y} = \E{XY}-\E{X}\E{Y} +\end{gather*} +\end{example} + + \subsection{Improved commands} + In addition to adding new commands, this package also redefines + already existing commands in a mostly backwards-compatible way + to improve their usefulness. + + \DescribeMacro\sin[<power>]{<expression>} + \DescribeMacro\arcsin{<expression>} + \DescribeMacro\cos[<power>]{<expression>} + \DescribeMacro\arccos{<expression>} + \DescribeMacro\tan[<power>]{<expression>} + \DescribeMacro\arctan{<expression>} + \DescribeMacro\cot[<power>]{<expression>} + The trigonometric functions have been redefined + to typeset more easily. They typeset \meta{expression} as an + argument of the expression, and (if applicable) \meta{power} as + a superscript between the function and its argument, + \emph{e.g.} \(\sin[2]{\phi}\). + + \DescribeMacro\ln{<expression>} + The natural logarithm macro \Macro\ln has also been redefined to + require an argument which is typeset as the argument of the logarithm. + \DescribeMacro\log[<base>]{<expression>} + The related macro \Macro\log is redefined in a similar way, but also + accepts an optional argument denoting the base of the logarithm: + \(\log[2]{x}\). + + \DescribeMacro\exp{<expression>} + The exponential, \Macro\exp, is redefined to typeset its argument as a + superscript of \(e\) in some display styles, and as an argument of + \(\mathrm{exp}\) otherwise: + \begin{equation*} + \exp{\sqrt{2}\exp{x}} + \end{equation*} + + \DescribeMacro\min*[<domain>]{<expression>} + \DescribeMacro\argmin*[<domain>]{<expression>} + \DescribeMacro\max*[<domain>]{<expression>} + \DescribeMacro\argmax*[<domain>]{<expression>} + \DescribeMacro\sup*[<domain>]{<expression>} + \DescribeMacro\inf*[<domain>]{<expression>} + The maximum/minimum macros have been redefined in a manner similar to + the trigonometric functions. They typeset \meta{expression} inside + curly brackets (the starred version omits the brackets), with the + optional \meta{domain} typeset in a subscript after the operator + (\emph{e.g.} \(\min*[x\in\R_{+}]{f(x)}\)). Argument variants are also + provided, and the \meta{expression} is centered underneath the operator + if possible: + \begin{equation*} + \argmin*[x\in\R_{+}]{f(x)} + \end{equation*} + + \subsection{Stylistic changes} + Some commands have been redefined in a completely backwards-compatible + way to improve the end result of their typesetting. + + \DescribeMacro\frac{<numerator>}{<denominator>} + The \Macro\frac command has been changed to improve typesetting, + allowing displaystyle math in some settings. + + \DescribeMacro\bar{<expression>} + \DescribeMacro\vec{<expression>} + The \Macro\bar command has been changed to cover the entire + \meta{expression} (\emph{i.e.} \(\bar{uv}\)), and \Macro\vec has + been changed to match the \cs{vectorsym} command provided by + \pkg{isomath}. + + \section{Known issues} + A list of current issues is available in the Github repository of this + package\footnote{\url{https://github.com/urdh/skmath/issues}}, but as + of the release of \theversion, there are no known issues + %\begin{description} + % \item[\#?] ??? + %\end{description} + + If you discover any bugs in this package, please report them to the issue + tracker in the \thepackage\ Github repository. + + \Implementation\ExplHack + \section{Implementation} + The package implementation is very simple. First, we do the standard + \LaTeXe\ preamble thing, then we require some dependencies. + \changes{0.1b}{Load \pkg{amsmath} with \texttt{intlimits} option} + \changes{0.2a}{Load \pkg{amsmath} with more \texttt{limits} options} +\begin{MacroCode}{package} +\RequirePackage{expl3,l3keys2e,xparse} +\ProvidesExplPackage{skmath} + {2013/05/24}{0.3}{improved math commands} +\PassOptionsToPackage{intlimits,sumlimits,namelimits}{amsmath} +\RequirePackage{amssymb,mathtools,xfrac,isomath} +\end{MacroCode} + + We optionally provide commands to typeset common sets. + \begin{macro}{\__skmath_define_common_sets:} +\begin{MacroCode}{package} +\cs_new:Nn\__skmath_define_common_sets:{ +\end{MacroCode} + \begin{macro}{\N} + \changes{0.1b}{Moved to \textsf{xparse} command definition} +\begin{MacroCode}{package} + \NewDocumentCommand\N{}{\ensuremath{\mathbb{N}}} +\end{MacroCode} + \end{macro} + \begin{macro}{\Z} + \changes{0.1b}{Moved to \textsf{xparse} command definition} +\begin{MacroCode}{package} + \NewDocumentCommand\Z{}{\ensuremath{\mathbb{Z}}} +\end{MacroCode} + \end{macro} + \begin{macro}{\Q} + \changes{0.1b}{Moved to \textsf{xparse} command definition} +\begin{MacroCode}{package} + \NewDocumentCommand\Q{}{\ensuremath{\mathbb{Q}}} +\end{MacroCode} + \end{macro} + \begin{macro}{\R} + \changes{0.1b}{Moved to \textsf{xparse} command definition} +\begin{MacroCode}{package} + \NewDocumentCommand\R{}{\ensuremath{\mathbb{R}}} +\end{MacroCode} + \end{macro} + \begin{macro}{\C} + \changes{0.1b}{Moved to \textsf{xparse} command definition} +\begin{MacroCode}{package} + \NewDocumentCommand\C{}{\ensuremath{\mathbb{C}}} +\end{MacroCode} + \end{macro} +\begin{MacroCode}{package} +} +\end{MacroCode} + \end{macro} + + This is followed by commands to typeset the norm and absolute value. + \begin{macro}{\abs} +\begin{MacroCode}{package} +\DeclarePairedDelimiter\abs{\lvert}{\rvert} +\end{MacroCode} + \end{macro} + \begin{macro}{\norm} +\begin{MacroCode}{package} +\DeclarePairedDelimiter\norm{\lVert}{\rVert} +\end{MacroCode} + \end{macro} + + Next come the statistical commands. + \begin{macro}{\E} + \changes{0.1e}{Added \cs{E} command} + \changes{0.1f}{Fixed \enquote{Command \cs{E} already defined!} error} + \changes{0.2}{Use \cs{operatorname}} + Here, we define \cs{E} after the preamble since it may break otherwise. +\begin{MacroCode}{package} +\AtBeginDocument{ + \DeclareDocumentCommand\E{m}{% + \ensuremath{\operatorname{E}\left[#1\right]}% + } +} +\end{MacroCode} + \end{macro} + The \Macro\P command saves any old \Macro\given command, replacing + it locally with the new \Macro\given command provided by the package. + \begin{macro}{\P} + \changes{0.1e}{Added \cs{P} command} + \changes{0.2}{Use \cs{operatorname}, use \cs{cs_new_eq:NN} instead of + \cs{let}} +\begin{MacroCode}{package} +\DeclareDocumentCommand\P{m}{% + \ensuremath{\operatorname{P}% + \mkern-1.5mu\left(% + \cs_set_eq:NN\__skmath_saved_given:\given% +\end{MacroCode} + \begin{macro}{\given} + \changes{0.1e}{Added \cs{given} command} +\begin{MacroCode}{package} + \DeclareDocumentCommand\given{}{\mid}% +\end{MacroCode} + \end{macro} +\begin{MacroCode}{package} + #1% + \cs_set_eq:NN\given\__skmath_saved_given:% + \right)% + }% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\var} + \changes{0.1e}{Added \cs{var} command} + \changes{0.2}{Use \cs{operatorname}} +\begin{MacroCode}{package} + \DeclareDocumentCommand\var{m}{% + \ensuremath{\operatorname{Var}\left(#1\right)}% + } +\end{MacroCode} + \end{macro} + \begin{macro}{\cov} + \changes{0.1e}{Added \cs{cov} command} + \changes{0.2}{Use \cs{operatorname}} +\begin{MacroCode}{package} + \DeclareDocumentCommand\cov{mm}{% + \ensuremath{\operatorname{Cov}\left(#1,#2\right)}% + } +\end{MacroCode} + \end{macro} + + We replace all trigonometric functions and some other + common functions with alternatives that take an argument + (or optionally, several arguments). +\begin{MacroCode}{package} +\cs_new_eq:NN\__skmath_sin:\sin +\cs_new_eq:NN\__skmath_cos:\cos +\cs_new_eq:NN\__skmath_tan:\tan +\cs_new_eq:NN\__skmath_cot:\cot +\cs_new_eq:NN\__skmath_arcsin:\arcsin +\cs_new_eq:NN\__skmath_arccos:\arccos +\cs_new_eq:NN\__skmath_arctan:\arctan +\cs_new_eq:NN\__skmath_ln:\log +\cs_new_eq:NN\__skmath_log:\log +\cs_new_eq:NN\__skmath_exp:\exp +\cs_new_eq:NN\__skmath_min:\min +\cs_new_eq:NN\__skmath_max:\max +\cs_new_eq:NN\__skmath_sup:\sup +\cs_new_eq:NN\__skmath_inf:\inf +\end{MacroCode} + \begin{macro}{\sin} +\begin{MacroCode}{package} +\RenewDocumentCommand\sin{om}{% + \IfNoValueTF{#1} + {\ensuremath{\__skmath_sin:\left(#2\right)}} + {\ensuremath{\__skmath_sin:\c_math_superscript_token{#1}\left(#2\right)}}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\cos} +\begin{MacroCode}{package} +\RenewDocumentCommand\cos{om}{% + \IfNoValueTF{#1} + {\ensuremath{\__skmath_cos:\left(#2\right)}} + {\ensuremath{\__skmath_cos:\c_math_superscript_token{#1}\left(#2\right)}}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\tan} +\begin{MacroCode}{package} +\RenewDocumentCommand\tan{om}{% + \IfNoValueTF{#1} + {\ensuremath{\__skmath_tan:\left(#2\right)}} + {\ensuremath{\__skmath_tan:\c_math_superscript_token{#1}\left(#2\right)}}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\cot} +\begin{MacroCode}{package} +\RenewDocumentCommand\cot{om}{% + \IfNoValueTF{#1} + {\ensuremath{\__skmath_cot:\left(#2\right)}} + {\ensuremath{\__skmath_cot:\c_math_superscript_token{#1}\left(#2\right)}}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\arcsin} +\begin{MacroCode}{package} +\RenewDocumentCommand\arcsin{m}{% + \ensuremath{\__skmath_arcsin:\left(#1\right)}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\arccos} +\begin{MacroCode}{package} +\RenewDocumentCommand\arccos{m}{% + \ensuremath{\__skmath_arccos:\left(#1\right)}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\arctan} +\begin{MacroCode}{package} +\RenewDocumentCommand\arctan{m}{% + \ensuremath{\__skmath_arctan:\left(#1\right)}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\ln} +\begin{MacroCode}{package} +\RenewDocumentCommand\ln{m}{% + \ensuremath{\__skmath_ln:\left(#1\right)}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\log} +\begin{MacroCode}{package} +\RenewDocumentCommand\log{om}{% + \IfNoValueTF{#1} + {\ensuremath{\__skmath_log:\left(#2\right)}} + {\ensuremath{\__skmath_log:\c_math_subscript_token{#1}\left(#2\right)}}% +} +\end{MacroCode} + \end{macro} + \begin{macro}{\exp} + \changes{0.1b}{Moved to \textsf{xparse} command definition} +\begin{MacroCode}{package} +\RenewDocumentCommand\exp{m}{\ensuremath{\mathchoice% + {e\c_math_superscript_token{#1}}% + {\__skmath_exp:\left(#1\right)}% + {\__skmath_exp:\left(#1\right)}% + {\__skmath_exp:\left(#1\right)}% +}} +\end{MacroCode} + \end{macro} + \begin{macro*}{\__skmath_minmax_backend:nnn} +\begin{MacroCode}{package} +\cs_new_nopar:Npn\__skmath_minmax_backend:nnnn#1#2#3#4{% + \use:c{__skmath_#1:} + \IfNoValueF{#3}{ + \c_math_subscript_token{ + \mathchoice{\mathclap{#3}}{#3}{#3}{#3} + } + } + \IfBooleanTF{#2}{#4}{\left\{#4\right\}} +} +\end{MacroCode} + \end{macro*} + \begin{macro}{\min} +\begin{MacroCode}{package} +\RenewDocumentCommand\min{som}{% + \ensuremath{\__skmath_minmax_backend:nnnn{min}{#1}{#2}{#3}} +} +\end{MacroCode} + \end{macro} + \begin{macro}{\argmin} +\begin{MacroCode}{package} +\NewDocumentCommand\argmin{som}{% + \ensuremath{\arg\__skmath_minmax_backend:nnnn{min}{#1}{#2}{#3}} +} +\end{MacroCode} + \end{macro} + \begin{macro}{\max} +\begin{MacroCode}{package} +\RenewDocumentCommand\max{som}{% + \ensuremath{\__skmath_max_minbackend:nnnn{max}{#1}{#2}{#3}} +} +\end{MacroCode} + \end{macro} + \begin{macro}{\argmax} +\begin{MacroCode}{package} +\NewDocumentCommand\argmax{som}{% + \ensuremath{\arg\__skmath_minmax_backend:nnnn{max}{#1}{#2}{#3}} +} +\end{MacroCode} + \end{macro} + \begin{macro}{\sup} +\begin{MacroCode}{package} +\RenewDocumentCommand\sup{som}{% + \ensuremath{\__skmath_minmax_backend:nnnn{sup}{#1}{#2}{#3}} +} +\end{MacroCode} + \end{macro} + \begin{macro}{\inf} +\begin{MacroCode}{package} +\RenewDocumentCommand\inf{som}{% + \ensuremath{\__skmath_minmax_backend:nnnn{inf}{#1}{#2}{#3}} +} +\end{MacroCode} + \end{macro} + + The fraction command is modified to improve typesetting. + \begin{macro}{\frac} + \changes{0.1b}{Moved to \textsf{xparse} command definition} +\begin{MacroCode}{package} +\RenewDocumentCommand\frac{mm}{\genfrac{}{}{}{}% + {\displaystyle #1}{\displaystyle #2}} +\end{MacroCode} + \end{macro} + + We introduce a couple of helper macros for the \cs{pd} macro backend. + \begin{macro*}{\__skmath_if_numerical_p:n} + \begin{macro*}{\__skmath_if_numerical:nT} + \begin{macro*}{\__skmath_if_numerical:nF} + \begin{macro*}{\__skmath_if_numerical:nTF}[1] + {Token or string} +\begin{MacroCode}{package} +\prg_new_conditional:Npnn\__skmath_if_numerical:n#1{p,T,F,TF}{ + \str_case_x:nnn{#1}{ + {0}{\prg_return_true:} + {1}{\prg_return_true:} + {2}{\prg_return_true:} + {3}{\prg_return_true:} + {4}{\prg_return_true:} + {5}{\prg_return_true:} + {6}{\prg_return_true:} + {7}{\prg_return_true:} + {8}{\prg_return_true:} + {9}{\prg_return_true:} + }{\prg_return_false:} +} +\end{MacroCode} + \end{macro*} + \end{macro*} + \end{macro*} + \end{macro*} + \begin{macro*}{\__skmath_pd_vars_sum:n}[1] + {Comma-separated list of variables, possibly with superscripts} +\begin{MacroCode}{package} +\cs_new_nopar:Npn\__skmath_pd_vars_sum:n#1{ + \tl_clear:N\l_tmpa_tl + \int_zero:N\l_tmpa_int + \bool_set_true:N\l_tmpa_bool + \clist_set:Nn\l_tmpa_clist{#1} + \clist_map_inline:Nn\l_tmpa_clist{ + \seq_set_split:Nnn\l_tmpa_seq{^}{##1} + \int_compare:nT{\seq_count:N\l_tmpa_seq<\c_two}{ + \seq_put_right:Nn\l_tmpa_seq{1} + } + \seq_get_right:NN\l_tmpa_seq\l_tmpb_tl + \__skmath_if_numerical:nTF{\tl_use:N\l_tmpb_tl}{ + \int_add:Nn\l_tmpa_int{\tl_use:N\l_tmpb_tl} + }{ + \bool_set_false:N\l_tmpa_bool + \tl_if_empty:NF\l_tmpa_tl{\tl_put_right:Nn\l_tmpa_tl{+}} + \tl_put_right:Nx\l_tmpa_tl{\tl_use:N\l_tmpb_tl} + } + } + \int_compare:nT{\l_tmpa_int>\c_zero}{\int_use:N\l_tmpa_int} + \bool_if:NF\l_tmpa_bool{ + \int_compare:nT{\l_tmpa_int>\c_zero}{+} + \tl_use:N\l_tmpa_tl + } +} +\end{MacroCode} + \end{macro*} + \begin{macro*}{\__skmath_pd_if_vars_sum_above_one_p:n} + \begin{macro*}{\__skmath_pd_if_vars_sum_above_one:nT} + \begin{macro*}{\__skmath_pd_if_vars_sum_above_one:nF} + \begin{macro*}{\__skmath_pd_if_vars_sum_above_one:nTF}[1] + {Comma-separated list of variables, possibly with superscripts} +\begin{MacroCode}{package} +\prg_new_conditional:Npnn\__skmath_pd_if_vars_sum_above_one:n#1{p,T,F,TF}{ + \clist_set:Nn\l_tmpa_clist{#1} + \int_compare:nTF{\clist_count:N\l_tmpa_clist>\c_one}{ + \prg_return_true: + }{ + \clist_pop:NN\l_tmpa_clist\l_tmpa_tl + \seq_set_split:NnV\l_tmpa_seq{^}{\l_tmpa_tl} + \int_compare:nTF{\seq_count:N\l_tmpa_seq<\c_two}{ + \prg_return_false: + }{ + \prg_return_true: + } + } +} +\end{MacroCode} + \end{macro*} + \end{macro*} + \end{macro*} + \end{macro*} + \begin{macro*}{\__skmath_pd_superscript_vars:n}[1] + {Comma-separated list of variables, possibly with superscripts} +\begin{MacroCode}{package} +\cs_new_nopar:Npn\__skmath_pd_superscript_vars:n#1{ + \clist_set:Nn\l_tmpa_clist{#1} + \clist_map_inline:Nn\l_tmpa_clist{ + \partial + \seq_set_split:Nnn\l_tmpa_seq{^}{##1} + \seq_pop:NN\l_tmpa_seq\l_tmpb_tl + \tl_use:N\l_tmpb_tl + \int_compare:nT{\seq_count:N\l_tmpa_seq>0}{ + \seq_pop:NN\l_tmpa_seq\l_tmpb_tl + \c_math_superscript_token + \tl_use:N\l_tmpb_tl + } + } +} +\end{MacroCode} + \end{macro*} + \begin{macro*}{\__skmath_pd_subscript_vars:n}[1] + {Comma-separated list of variables, possibly with superscripts} +\begin{MacroCode}{package} +\cs_new_nopar:Npn\__skmath_pd_subscript_vars:n#1{ + \clist_set:Nn\l_tmpa_clist{#1} + \clist_map_inline:Nn\l_tmpa_clist{ + \seq_set_split:Nnn\l_tmpa_seq{^}{##1} + \seq_pop:NN\l_tmpa_seq\l_tmpa_tl + \int_set:Nn\l_tmpa_int{\c_one} + \int_compare:nT{\seq_count:N\l_tmpa_seq>\c_zero}{ + \seq_pop:NN\l_tmpa_seq\l_tmpb_tl + \int_set:Nn\l_tmpa_int{\tl_use:N\l_tmpb_tl} + } + \prg_replicate:nn{\l_tmpa_int}{\tl_use:N\l_tmpa_tl} + } +} +\end{MacroCode} + \end{macro*} + \begin{macro*}{\__skmath_pd_fraction:nn}[2] + {Tokens representing a mathematical function} + {Comma-separated list of variables, possibly with superscripts} +\begin{MacroCode}{package} +\cs_new_nopar:Npn\__skmath_pd_fraction:nn#1#2{ + \frac{ + \partial + \__skmath_pd_if_vars_sum_above_one:nT{#2}{ + \c_math_superscript_token{\__skmath_pd_vars_sum:n{#2}} + } + {#1} + }{ + \__skmath_pd_superscript_vars:n{#2} + } +} +\end{MacroCode} + \end{macro*} + \begin{macro*}{\__skmath_pd_subscript:nn}[2] + {Tokens representing a mathematical function} + {Comma-separated list of variables, possibly with superscripts} +\begin{MacroCode}{package} +\cs_new_nopar:Npn\__skmath_pd_subscript:nn#1#2{ + {#1}\c_math_subscript_token{ + \__skmath_pd_subscript_vars:n{#2} + } +} +\end{MacroCode} + \end{macro*} + + Definition of \cs{bar}, \cs{pd} and \cs{d} is deferred until after all + packages are loaded to avoid collisions with other packages. +\begin{MacroCode}{package} +\AtBeginDocument{% +\end{MacroCode} + The \cs{bar} command is modified to impove typesetting. + \begin{macro}{\bar} + \changes{0.1b}{Added \cs{bar} replacement} + \changes{0.1h}{Wrap in \cs{AtBeginDocument}} +\begin{MacroCode}{package} +\DeclareDocumentCommand\bar{m}{% + \ensuremath{\mkern 1.5mu\overline{\mkern-1.5mu{#1}\mkern-1.5mu}\mkern 1.5mu}} +\end{MacroCode} + \end{macro} + + This is the partial derivative macro, but most of the functionality + was defined as private macros earlier. + \begin{macro}{\pd}[3] + {Boolean distinguishing between starred and unstarred variant} + {Tokens representing a mathematical function} + {Comma-separated list of variables, possibly with superscripts} +\begin{MacroCode}{package} +\DeclareDocumentCommand\pd{smm}{ + \ensuremath{ + \IfBooleanTF{#1} + {\__skmath_pd_subscript:nn{#2}{#3}} + {\__skmath_pd_fraction:nn{#2}{#3}} + } +} +\end{MacroCode} + \end{macro} + + We introduce a command to typeset the differential part + of integrals, shamefully stolen from an answer on \TeX.SE. + \begin{macro}{\d} + \changes{0.1a}{Fixed obtuse errors} + \changes{0.1b}{Moved to \textsf{xparse} command definition} + \changes{0.2}{Use \cs{peek_meaning_ignore_spaces:NT} instead of \cs{@ifnextchar}} +\begin{MacroCode}{package} +\DeclareDocumentCommand\d{m}{\ensuremath{\,\mathrm{d}#1% + \peek_meaning_ignore_spaces:NT\d{\!}}} +\end{MacroCode} + \end{macro} +\begin{MacroCode}{package} +} +\end{MacroCode} + + Finally, we define a nicer way to denote vectors. + \begin{macro}{\vec} + \changes{0.2}{Use \cs{cs_new_eq:NN} instead of \cs{let}} +\begin{MacroCode}{package} +\cs_set_eq:NN\vec\vectorsym +\end{MacroCode} + \end{macro} + + We end by declaring an option. +\begin{MacroCode}{package} +\keys_define:nn{skmath}{ + commonsets .code:n = + {\__skmath_define_common_sets:} +} +\ProcessKeysOptions{skmath} +\end{MacroCode} + +\begin{MacroCode}{package} +\endinput +\end{MacroCode} + + \Finale + \section{Installation} + The easiest way to install this package is using the package + manager provided by your \LaTeX\ installation if such a program + is available. Failing that, provided you have obtained the package + source (\file{skmath.tex} and \file{Makefile}) from either CTAN + or Github, running \texttt{make install} inside the source directory + works well. This will extract the documentation and code from + \file{skmath.tex}, install all files into the TDS tree at + \texttt{TEXMFHOME} and run \texttt{mktexlsr}. + + If you want to extract code and documentation without installing + the package, run \texttt{make all} instead. If you insist on not + using \texttt{make}, remember that packages distributed using + \pkg{skdoc} must be extracted using \texttt{pdflatex}, \emph{not} + \texttt{tex} or \texttt{latex}. + + \PrintChanges + \PrintIndex +\end{document} |