From 250bec34ac809e833d21a84bc496f19a8c4a216e Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 5 Jan 2015 23:22:43 +0000 Subject: skmath (5jan15) git-svn-id: svn://tug.org/texlive/trunk@35968 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/source/latex/skmath/skmath.tex | 311 ++++++++++++++++------- 1 file changed, 226 insertions(+), 85 deletions(-) (limited to 'Master/texmf-dist/source/latex/skmath') diff --git a/Master/texmf-dist/source/latex/skmath/skmath.tex b/Master/texmf-dist/source/latex/skmath/skmath.tex index 2362e57e8a1..a63f070a2ca 100644 --- a/Master/texmf-dist/source/latex/skmath/skmath.tex +++ b/Master/texmf-dist/source/latex/skmath/skmath.tex @@ -1,7 +1,7 @@ %% skmath improved math commands %% -%% Copyright (C) 2012-2014 by Simon Sigurdhsson -%% +%% Copyright (C) 2012-2015 by Simon Sigurdhsson +%% %% 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. @@ -9,35 +9,37 @@ %% 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\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} +\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\ii{}{i} +\ProvideDocumentCommand\jj{}{j} +\ProvideDocumentCommand\sfrac{mm}{#1#2} +\ProvideDocumentCommand\argmin{om}{#1} +\ProvideDocumentCommand\argmax{om}{#1} % Declare the target files \SelfPreambleTo{\mypreamble} @@ -54,7 +56,7 @@ % This is where the documentation begins \begin{document} % Change & version info - \version{0.3b} + \version{0.4} \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} @@ -64,6 +66,7 @@ \changes{0.3}{Added \cs{min}/\cs{max} and friends. Added \cs{pd}} \changes{0.3a}{Added \cs{sinh}, \cs{cosh} and \cs{tanh}} \changes{0.3b}{Detect empty arguments in trigonometric and logarithmic functions, fix \cs{ln}} + \changes{0.4}{Added \opt{notation} option, macros for complex numbers} % Don't forget to update the version number and release date of % the package declaration in the implementation! @@ -89,20 +92,26 @@ \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 + As of version \theversion, the package provides two key-value options. + + \Option{commonsets}\WithValues{true,false}\AndDefault{false} + Optionally 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. + \Option{notation}\WithValues{iso,english,german,legacy}\AndDefault{legacy} + This option controls the style of a few typographic elements that differ + between countries and standards (such as the style of integrals, derivatives + and greek letters). + \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\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, @@ -112,13 +121,20 @@ \N, \Z, \Q, \R, \C. \end{equation*} \end{example} - + + \DescribeMacro\ii + \DescribeMacro\jj + These commands typeset the imaginary unit (either \(\ii\) as used in + mathematics or \(\jj\) as used in electrotechnology). While normal use + of the package simply results in italic characters, setting the \opt{notation} + option to \texttt{iso} will set these upright. + \DescribeMacro\norm{} \DescribeMacro\abs{} 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 + can be achieved by appending a subscript after the argument of \Macro\norm. \begin{example} \begin{equation*} @@ -127,9 +143,9 @@ ^{\sfrac{1}{p}} \end{equation*} \end{example} - + \DescribeMacro\d{} - There is also a command \Macro\d, with one mandatory argument, that + There is also a command \Macro\d, with one mandatory argument, that typesets the differential part of an integral. \begin{example} \begin{equation*} @@ -160,14 +176,14 @@ \end{example} \DescribeMacro\P{\AlsoMacro\given } - The \Macro\P command typesets a probability. The \Macro\given command + 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} +\end{example} \DescribeMacro\var{} \DescribeMacro\cov{}{} @@ -179,39 +195,39 @@ \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[]{} - \DescribeMacro\arcsin{} - \DescribeMacro\cos[]{} - \DescribeMacro\arccos{} - \DescribeMacro\tan[]{} - \DescribeMacro\arctan{} - \DescribeMacro\cot[]{} - \DescribeMacro\sinh[]{} - \DescribeMacro\cosh[]{} - \DescribeMacro\tanh[]{} + + \DescribeMacro\sin[]{} + \DescribeMacro\arcsin{} + \DescribeMacro\cos[]{} + \DescribeMacro\arccos{} + \DescribeMacro\tan[]{} + \DescribeMacro\arctan{} + \DescribeMacro\cot[]{} + \DescribeMacro\sinh[]{} + \DescribeMacro\cosh[]{} + \DescribeMacro\tanh[]{} 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}\). When the argument is empty, no parentheses are emitted: \(\cos{}\). - + \DescribeMacro\ln{} - The natural logarithm macro \Macro\ln has also been redefined to + 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[]{} - The related macro \Macro\log is redefined in a similar way, but also + 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}\). As with the trigonometric functions, no parentheses are emitted if the mandatory argument is empty: \(\log{}\). - + \DescribeMacro\exp*{} The exponential, \Macro\exp, is redefined to typeset its argument as a superscript of \(e\) in some display styles, and as an argument of @@ -242,18 +258,25 @@ \subsection{Stylistic changes} Some commands have been redefined in a completely backwards-compatible way to improve the end result of their typesetting. - + \DescribeMacro\frac{}{} The \Macro\frac command has been changed to improve typesetting, allowing displaystyle math in some settings. - + \DescribeMacro\bar{} \DescribeMacro\vec{} - The \Macro\bar command has been changed to cover the entire + 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 + been changed to match the \cs{vectorsym} command provided by \pkg{isomath}. + \DescribeMacro\Re{} + \DescribeMacro\Im{} + These commands typeset the real and imaginary part of a number. Standard use + of the package takes definitions roughly from \pkg{amsmath}, while setting + the \opt{notation} option to \texttt{iso} changes the definitions to match + ISO~80000-2. + \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 @@ -278,12 +301,109 @@ \begin{MacroCode}{package} \RequirePackage{expl3,l3keys2e,xparse} \ProvidesExplPackage{skmath} - {2014/06/13}{0.3b}{improved math commands} + {2015/01/05}{0.4}{improved math commands} \PassOptionsToPackage{intlimits,sumlimits,namelimits}{amsmath} -\RequirePackage{amssymb,mathtools,xfrac,isomath} +\RequirePackage{amssymb,mathtools,xfrac} +\end{MacroCode} + +We start by declaring internal options related to the notation styles. +First, some placeholders to detect failures. +\begin{MacroCode}{package} +\msg_new:nnnn{skmath}{undefined-macro}{The~macro~`\token_to_str:N#1'~was~undefined!} + {This~is~an~error~in~the~notation~option~handling.~Please~file~an~issue\\ + on~Github~(https://github.com/urdh/skmath/issues)~with~a~copy~of~this\\ + message~attached~as~well~as~a~list~of~the~options~passed~to~`skmath'.} +\cs_gset_nopar:Npn\__skmath_integral_d:{ + \msg_critical:nnn{skmath}{undefined-macro}{\__skmath_integral_d:} +} +\cs_gset_nopar:Npn\__skmath_natural_log_e:{ + \msg_critical:nnn{skmath}{undefined-macro}{\__skmath_natural_log_e:} +} +\cs_gset_nopar:Npn\__skmath_imaginary_unit:n#1{ + \msg_critical:nnn{skmath}{undefined-macro}{\__skmath_imaginary_unit:n} +} +\end{MacroCode} +Then, the key-value options. +\begin{MacroCode}{package} +\keys_define:nn{skmath / internal}{ + % More on this: + % * http://en.wikipedia.org/wiki/Typographical_conventions_in_mathematical_formulae + % * ISO 80000-2 + % * http://www.tug.org/TUGboat/Articles/tb18-1/tb54becc.pdf + % * http://tex.stackexchange.com/q/14821/66 + integral-d .choice:, + integral-d .value_required:, + integral-d / upright .code:n = { \cs_gset_nopar:Npn\__skmath_integral_d:{{\operator@font d}} }, + integral-d / slanted .code:n = { \cs_gset_nopar:Npn\__skmath_integral_d:{{d}} }, + isomath .bool_set:N = \g__skmath_load_isomath_bool, + isomath .value_required:, + natural-log .choice:, + natural-log .value_required:, + natural-log / upright .code:n = { \cs_gset_nopar:Npn\__skmath_natural_log_e:{{\operator@font e}} }, + natural-log / slanted .code:n = { \cs_gset_nopar:Npn\__skmath_natural_log_e:{{e}} }, + imaginary-unit .choice:, + imaginary-unit .value_required:, + imaginary-unit / upright .code:n = { \cs_gset_nopar:Npn\__skmath_imaginary_unit:n##1{{\operator@font ##1}} }, + imaginary-unit / slanted .code:n = { \cs_gset_nopar:Npn\__skmath_imaginary_unit:n##1{{##1}} }, + complex-part-symbols .bool_set_inverse:N = \g__skmath_iso_complex_parts_bool, + complex-part-symbols .value_required:, +} \end{MacroCode} - First, a utility conditional. +We also declare the \enquote{public} options. +\begin{MacroCode}{package} +\keys_define:nn{skmath}{ + commonsets .bool_set:N = \g__skmath_define_common_sets_bool, + commonsets .default:n = true, + commonsets .initial:n = false, + % TODO: write tests for the notation option + notation .choice:, + notation / iso .meta:nn = {skmath / internal}{ + integral-d = upright, + isomath = true, + natural-log = upright, + imaginary-unit = upright, + complex-part-symbols = false, + }, + notation / german .meta:nn = {skmath / internal}{ + integral-d = upright, + isomath = true, + natural-log = slanted, %??? + imaginary-unit = slanted, %??? + complex-part-symbols = true, %??? + }, + notation / english .meta:nn = {skmath / internal}{ + integral-d = slanted, + isomath = true, + natural-log = slanted, %??? + imaginary-unit = slanted, %??? + complex-part-symbols = true, %??? + }, + notation / legacy .meta:nn = {skmath / internal}{ + integral-d = upright, + isomath = true, + natural-log = slanted, + imaginary-unit = slanted, + complex-part-symbols = true, + }, + % Possibly more style sets... ? + notation .initial:n = legacy, % Or is it? Perhaps a legacy option is required. + notation .value_required:, + % Note also that the styles should probably affect isomath and/or other packages. +} +\ProcessKeysOptions{skmath} +\end{MacroCode} + +We optionally load \pkg{isomath}, depending on notation style. +\begin{MacroCode}{package} +\bool_if:NTF\g__skmath_load_isomath_bool{ + \RequirePackage{isomath} +}{ + % TODO: check if there is an alternative package we should load here. +} +\end{MacroCode} + + Then, a utility conditional\ldots \begin{macro*}{\__skmath_if_novalue_or_empty:nF}[1] {Token or string} \begin{MacroCode}{package} @@ -301,7 +421,7 @@ \end{MacroCode} \end{macro*} - And a helper macro. + \ldots and a helper macro. \begin{macro*}{\__skmath_parens:n}[1] {Argument to wrap in parentheses, unless empty} \begin{MacroCode}{package} @@ -312,9 +432,8 @@ \end{macro*} We optionally provide commands to typeset common sets. - \begin{macro}{\__skmath_define_common_sets:} \begin{MacroCode}{package} -\cs_new:Nn\__skmath_define_common_sets:{ +\bool_if:NT\g__skmath_define_common_sets_bool{ \end{MacroCode} \begin{macro}{\N} \changes{0.1b}{Moved to \textsf{xparse} command definition} @@ -348,9 +467,40 @@ \end{macro} \begin{MacroCode}{package} } +\end{MacroCode} + + Then, macros related to complex numbers are defined. + \begin{macro}{\ii} +\begin{MacroCode}{package} +\DeclareDocumentCommand\ii{}{\ensuremath{\__skmath_imaginary_unit:n{i}}} +\end{MacroCode} + \end{macro} + \begin{macro}{\jj} +\begin{MacroCode}{package} +\DeclareDocumentCommand\jj{}{\ensuremath{\__skmath_imaginary_unit:n{j}}} +\end{MacroCode} + \end{macro} + \begin{macro}{\Re} +\begin{MacroCode}{package} +\bool_if:NTF\g__skmath_iso_complex_parts_bool{ + \cs_new_eq:NN\__skmath_Re:\Re + \DeclareDocumentCommand\Re{m}{\ensuremath{\__skmath_Re:\__skmath_parens:n{#1}}} +}{ + \DeclareDocumentCommand\Re{m}{\ensuremath{{\operator@font Re}{#1}}} +} +\end{MacroCode} + \end{macro} + \begin{macro}{\Im} +\begin{MacroCode}{package} +\bool_if:NTF\g__skmath_iso_complex_parts_bool{ + \cs_new_eq:NN\__skmath_Im:\Im + \DeclareDocumentCommand\Im{m}{\ensuremath{\__skmath_Im:\__skmath_parens:n{#1}}} +}{ + \DeclareDocumentCommand\Im{m}{\ensuremath{{\operator@font Im}{#1}}} +} \end{MacroCode} \end{macro} - + This is followed by commands to typeset the norm and absolute value. \begin{macro}{\abs} \begin{MacroCode}{package} @@ -407,21 +557,21 @@ \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)}% - } +\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)}% - } +\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). @@ -553,7 +703,7 @@ \__skmath_exp:\__skmath_parens:n{#2} }{ \mathchoice - {e\c_math_superscript_token{#2}} + {\__skmath_natural_log_e:\c_math_superscript_token{#2}} {\__skmath_exp:\left(#2\right)} {\__skmath_exp:\left(#2\right)} {\__skmath_exp:\left(#2\right)} @@ -625,7 +775,7 @@ {\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} @@ -796,7 +946,7 @@ {Comma-separated list of variables, possibly with superscripts} \begin{MacroCode}{package} \DeclareDocumentCommand\pd{smm}{ - \ensuremath{ + \ensuremath{ \IfBooleanTF{#1} {\__skmath_pd_subscript:nn{#2}{#3}} {\__skmath_pd_fraction:nn{#2}{#3}} @@ -813,14 +963,14 @@ \changes{0.2}{Use \cs{peek_meaning_ignore_spaces:NT} instead of \cs{@ifnextchar}} \changes{0.3b}{Use \cs{operator@font} instead of \cs{mathrm}} \begin{MacroCode}{package} -\DeclareDocumentCommand\d{m}{\ensuremath{\,{\operator@font d}#1% +\DeclareDocumentCommand\d{m}{\ensuremath{\,\__skmath_integral_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}} @@ -829,15 +979,6 @@ \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} -- cgit v1.2.3