diff --git a/EXAMPLES.md b/EXAMPLES.md new file mode 100644 index 0000000..ce2800b --- /dev/null +++ b/EXAMPLES.md @@ -0,0 +1,173 @@ +# MathRender Examples + +## Square of sums +```LaTeX +(a_1 + a_2)^2 = a_1^2 + 2a_1a_2 + a_2^2 +``` + +![Square Formula](img/square.png) + +## Quadratic Formula +```LaTeX +x = \frac{-b \pm \sqrt{b^2-4ac}}{2a} +``` + +![Quadratic Formula](img/quadratic.png) + +## Standard Deviation +```LaTeX +\sigma = \sqrt{\frac{1}{N}\sum_{i=1}^N (x_i - \mu)^2} +``` +![Standard Deviation](img/standard.png) + +## De Morgan's laws +```LaTeX +\neg(P\land Q) \iff (\neg P)\lor(\neg Q) +``` + +![De Morgan](img/demorgan.png) + +## Log Change of Base +```LaTeX +\log_b(x) = \frac{\log_a(x)}{\log_a(b)} +``` + +![Log Base Change](img/log.png) + +## Cosine addition +```LaTeX +\cos(\theta + \varphi) = \cos(\theta)\cos(\varphi) - \sin(\theta)\sin(\varphi) +``` + +![Cos Sum](img/trig.png) + +## Limit e^k +```LaTeX +\lim_{x\to\infty}\left(1 + \frac{k}{x}\right)^x = e^k +``` + +![Limit](img/limit.png) + +## Calculus +```LaTeX +f(x) = \int\limits_{-\infty}^\infty\!\hat f(\xi)\,e^{2 \pi i \xi x}\,\mathrm{d}\xi +``` + +![Calculus](img/calculus.png) + +## Stirling Numbers of the Second Kind +```LaTeX +{n \brace k} = \frac{1}{k!}\sum_{j=0}^k (-1)^{k-j}\binom{k}{j}(k-j)^n +``` + +![Stirling Numbers](img/stirling.png) + +## Gaussian Integral +```LaTeX +\int_{-\infty}^{\infty} \! e^{-x^2} dx = \sqrt{\pi} +``` + +![Gauss Integral](img/gaussintegral.png) + +## Arithmetic mean, geometric mean inequality +```LaTeX +\frac{1}{n}\sum_{i=1}^{n}x_i \geq \sqrt[n]{\prod_{i=1}^{n}x_i} +``` + +![AM-GM](img/amgm.png) + +## Cauchy-Schwarz inequality +```LaTeX +\left(\sum_{k=1}^n a_k b_k \right)^2 \le \left(\sum_{k=1}^n a_k^2\right)\left(\sum_{k=1}^n b_k^2\right) +``` +![Cauchy Schwarz](img/cauchyschwarz.png) + +## Cauchy integral formula +```LaTeX +f^{(n)}(z_0) = \frac{n!}{2\pi i}\oint_\gamma\frac{f(z)}{(z-z_0)^{n+1}}dz +``` + +![Cauchy Integral](img/cauchyintegral.png) +## Schroedinger's Equation +```LaTeX +i\hbar\frac{\partial}{\partial t}\mathbf\Psi(\mathbf{x},t) = -\frac{\hbar}{2m}\nabla^2\mathbf\Psi(\mathbf{x},t) ++ V(\mathbf{x})\mathbf\Psi(\mathbf{x},t) +``` + +![Schroedinger](img/schroedinger.png) + +## Lorentz Equations +Use the `gather` or `displaylines` environments to center multiple +equations. +```LaTeX +\begin{gather} +\dot{x} = \sigma(y-x) \\ +\dot{y} = \rho x - y - xz \\ +\dot{z} = -\beta z + xy" +\end{gather} +``` + +![Lorentz](img/lorentz.png) + +## Cross product +```LaTeX +\vec \bf V_1 \times \vec \bf V_2 = \begin{vmatrix} +\hat \imath &\hat \jmath &\hat k \\ +\frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ +\frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 +\end{vmatrix} +``` + +![Cross Product](img/cross.png) + +## Maxwell's Equations +Use the `aligned`, `eqalign` or `split` environments to align +multiple equations. +```LaTeX +\begin{eqalign} +\nabla \cdot \vec{\bf E} & = \frac {\rho} {\varepsilon_0} \\ +\nabla \cdot \vec{\bf B} & = 0 \\ +\nabla \times \vec{\bf E} &= - \frac{\partial\vec{\bf B}}{\partial t} \\ +\nabla \times \vec{\bf B} & = \mu_0\vec{\bf J} + \mu_0\varepsilon_0 \frac{\partial\vec{\bf E}}{\partial t} +\end{eqalign} +``` + +![Maxwell's Equations](img/maxwell.png) + +## Matrix multiplication +Supported matrix environments: `matrix`, `pmatrix`, `bmatrix`, `Bmatrix`, +`vmatrix`, `Vmatrix`. +```LaTeX +\begin{pmatrix} +a & b\\ c & d +\end{pmatrix} +\begin{pmatrix} +\alpha & \beta \\ \gamma & \delta +\end{pmatrix} = +\begin{pmatrix} +a\alpha + b\gamma & a\beta + b \delta \\ +c\alpha + d\gamma & c\beta + d \delta +\end{pmatrix} +``` + +![Matrix Multiplication](img/matrixmult.png) + +## Cases +```LaTeX +f(x) = \begin{cases} +\frac{e^x}{2} & x \geq 0 \\ +1 & x < 0 +\end{cases} +``` + +![Cases](img/cases.png) + +## Splitting long equations +```LaTeX +\frak Q(\lambda,\hat{\lambda}) = +-\frac{1}{2} \mathbb P(O \mid \lambda ) \sum_s \sum_m \sum_t \gamma_m^{(s)} (t) +\\ +\quad \left( \log(2 \pi ) + \log \left| \cal C_m^{(s)} \right| + +\left( o_t - \hat{\mu}_m^{(s)} \right) ^T \cal C_m^{(s)-1} \right) +``` + +![Long equation](img/long.png) diff --git a/README.md b/README.md index bee8aec..dc575f1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,258 @@ # SwiftMath -A description of this package. +`SwiftMath` provides a full Swift implementation of [iosMath](https://travis-ci.org/kostub/iosMath) +for displaying beautifully rendered math equations in iOS and MacOS applications. It typesets formulae written +using LaTeX in a `UILabel` equivalent class. It uses the same typesetting rules as LaTeX and +so the equations are rendered exactly as LaTeX would render them. + +`SwiftMath` prepackages everything needed for direct access via the Swift Package Manager. +No need for complicated alien pods that never seem to work quite right. + +It is similar to [MathJax](https://www.mathjax.org) or +[KaTeX](https://github.com/Khan/KaTeX) for the web but for native iOS or MacOS +applications without having to use a `UIWebView` and Javascript. More +importantly, it is significantly faster than using a `UIWebView`. + +## Examples +Here are screenshots of some formulae that were rendered with this library: + +![Quadratic Formula](img/quadratic.png) + +![Calculus](img/calculus.png) + +![AM-GM](img/amgm.png) + +![Ramanujan Identity](img/ramanujan.png) + +More examples are included in [EXAMPLES](EXAMPLES.md) + +## Requirements +`SwiftMath` works on iOS 6+ or MacOS 10.8+ and requires ARC to build. It depends +on the following Apple frameworks: + +* Foundation.framework +* CoreGraphics.framework +* QuartzCore.framework +* CoreText.framework + +Additionally for iOS it requires: +* UIKit.framework + +Additionally for MacOS it requires: +* AppKit.framework + +## Installation + +### Swift Package + +`SwiftMath` is available from [SwiftMath](https://github.com/mgriebling/SwiftMath.git). +To use it in your code, just add the https://github.com/mgriebling/SwiftMath.git path to +XCode's package manager. + +## Usage + +The library provides a class `MTMathUILabel` which is a `UIView` that +supports rendering math equations. To display an equation simply create +an `MTMathUILabel` as follows: + +```swift + +import SwiftMath + +let label = MTMathUILabel() +label.latex = "x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}" + +``` +Adding `MTMathUILabel` as a sub-view of your `UIView` will render the +quadratic formula example shown above. + +The following code creates a SwiftUI component called `MathView` encapsulating the MTMathUILabel: + +```swift +import SwiftUI +import SwiftMath + +struct MathView: UIViewRepresentable { + + @Binding var equation: String + @Binding var fontSize: CGFloat + + func makeUIView(context: Context) -> MTMathUILabel { + let view = MTMathUILabel() + return view + } + + func updateUIView(_ uiView: MTMathUILabel, context: Context) { + uiView.latex = equation + uiView.fontSize = fontSize + uiView.font = MTFontManager().termesFont(withSize: fontSize) + uiView.textAlignment = .right + uiView.labelMode = .text + } +} +``` + +If you need code that works with SwiftUI running natively under MacOS you'll need the following: + +```swift +import SwiftUI +import SwiftMath + +struct MathView: NSViewRepresentable { + + @Binding var equation: String + @Binding var fontSize: CGFloat + + func makeNSView(context: Context) -> MTMathUILabel { + let view = MTMathUILabel() + return view + } + + func updateNSView(_ view: MTMathUILabel, context: Context) { + view.latex = equation + view.fontSize = fontSize + view.font = MTFontManager().termesFont(withSize: fontSize) + view.textColor = .textColor + view.textAlignment = .center + view.labelMode = .display + } +} +``` + +### Included Features +This is a list of formula types that the library currently supports: + +* Simple algebraic equations +* Fractions and continued fractions +* Exponents and subscripts +* Trigonometric formulae +* Square roots and n-th roots +* Calculus symbos - limits, derivatives, integrals +* Big operators (e.g. product, sum) +* Big delimiters (using \\left and \\right) +* Greek alphabet +* Combinatorics (\\binom, \\choose etc.) +* Geometry symbols (e.g. angle, congruence etc.) +* Ratios, proportions, percents +* Math spacing +* Overline and underline +* Math accents +* Matrices +* Equation alignment +* Change bold, roman, caligraphic and other font styles (\\bf, \\text, etc.) +* Most commonly used math symbols +* Colors + +### Example + +The [SwiftMathDemo](https://github.com/mgriebling/SwiftMathDemo) is a Swift version +of the Objective-C demo included in `iosMath` that uses `SwiftMath` as a Swift package dependency. + +### Advanced configuration + +`MTMathUILabel` supports some advanced configuration options: + +##### Math mode + +You can change the mode of the `MTMathUILabel` between Display Mode +(equivalent to `$$` or `\[` in LaTeX) and Text Mode (equivalent to `$` +or `\(` in LaTeX). The default style is Display. To switch to Text +simply: + +```swift +label.labelMode = .text +``` + +##### Text Alignment +The default alignment of the equations is left. This can be changed to +center or right as follows: + +```swift +label.textAlignment = .center +``` + +##### Font size +The default font-size is 25pt. You can change it as follows: + +```swift +label.fontSize = 30 +``` +##### Font +The default font is *Latin Modern Math*. This can be changed as: + +```swift +label.font = MTFontManager().termesFont(withSize:20) +``` + +This project has 3 fonts bundled with it, but you can use any OTF math +font. Note: I couldn't get the `iosMath` Python script to work. If +you do manage to get it working, please let me know. + +##### Color +The default color of the rendered equation is black. You can change +it to any other color as follows: + +```swift +label.textColor = .red +``` + +It is also possible to set different colors for different parts of the +equation. Just access the `displayList` field and set the `textColor` +on the underlying displays that you want to change the color of. + +##### Custom Commands +You can define your own commands that are not already predefined. This is +similar to macros is LaTeX. To define your own command use: + +```swift +MTMathAtomFactory.addLatexSymbol("lcm", value: MTMathAtomFactory.operator(withName: "lcm", limits: false)) +``` + +This creates an `\lcm` command that can be used in the LaTeX. + +##### Content Insets +The `MTMathUILabel` has `contentInsets` for finer control of placement of the +equation in relation to the view. + +If you need to set it you can do as follows: + +```swift +label.contentInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 20) +``` + +##### Error handling + +If the LaTeX text given to `MTMathUILabel` is +invalid or if it contains commands that aren't currently supported then +an error message will be displayed instead of the label. + +This error can be programmatically retrieved as `label.error`. If you +prefer not to display anything then set: + +```swift +label.displayErrorInline = true +``` + +## Future Enhancements + +Note this is not a complete implementation of LaTeX math mode. There are +some important pieces that are missing and will be included in future +updates. This includes: + +* Support for explicit big delimiters (bigl, bigr etc.) +* Addition of missing plain TeX commands + +## License + +`SwiftMath` is available under the MIT license. See the [LICENSE](./LICENSE) +file for more info. + +### Fonts +This distribution contains the following fonts. These fonts are +licensed as follows: +* Latin Modern Math: + [GUST Font License](GUST-FONT-LICENSE.txt) +* Tex Gyre Termes: + [GUST Font License](GUST-FONT-LICENSE.txt) +* [XITS Math](https://github.com/khaledhosny/xits-math): + [Open Font License](OFL.txt) diff --git a/Sources/SwiftMath/mathFonts.bundle/GUST-FONT-LICENSE.txt b/Sources/SwiftMath/mathFonts.bundle/GUST-FONT-LICENSE.txt new file mode 100755 index 0000000..60b5500 --- /dev/null +++ b/Sources/SwiftMath/mathFonts.bundle/GUST-FONT-LICENSE.txt @@ -0,0 +1,30 @@ +% This is a preliminary version (2006-09-30), barring acceptance from +% the LaTeX Project Team and other feedback, of the GUST Font License. +% (GUST is the Polish TeX Users Group, http://www.gust.org.pl) +% +% For the most recent version of this license see +% http://www.gust.org.pl/fonts/licenses/GUST-FONT-LICENSE.txt +% or +% http://tug.org/fonts/licenses/GUST-FONT-LICENSE.txt +% +% This work may be distributed and/or modified under the conditions +% of the LaTeX Project Public License, either version 1.3c of this +% license or (at your option) any later version. +% +% Please also observe the following clause: +% 1) it is requested, but not legally required, that derived works be +% distributed only after changing the names of the fonts comprising this +% work and given in an accompanying "manifest", and that the +% files comprising the Work, as listed in the manifest, also be given +% new names. Any exceptions to this request are also given in the +% manifest. +% +% We recommend the manifest be given in a separate file named +% MANIFEST-.txt, where is some unique identification +% of the font family. If a separate "readme" file accompanies the Work, +% we recommend a name of the form README-.txt. +% +% The latest version of the LaTeX Project Public License is in +% http://www.latex-project.org/lppl.txt and version 1.3c or later +% is part of all distributions of LaTeX version 2006/05/20 or later. + diff --git a/Sources/SwiftMath/mathFonts.bundle/LICENSE b/Sources/SwiftMath/mathFonts.bundle/LICENSE new file mode 100644 index 0000000..80752fd --- /dev/null +++ b/Sources/SwiftMath/mathFonts.bundle/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 MathChat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Sources/SwiftMath/mathFonts.bundle/OFL.txt b/Sources/SwiftMath/mathFonts.bundle/OFL.txt new file mode 100644 index 0000000..15435ef --- /dev/null +++ b/Sources/SwiftMath/mathFonts.bundle/OFL.txt @@ -0,0 +1,103 @@ +STIX Font License + +24 May 2010 + +Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American +Institute of Physics, the American Chemical Society, the American Mathematical +Society, the American Physical Society, Elsevier, Inc., and The Institute of +Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved +Font Name STIX Fonts, STIX Fonts (TM) is a trademark of The Institute of +Electrical and Electronics Engineers, Inc. + +Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com), +with Reserved Font Name TM Math. To obtain additional mathematical fonts, please +contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA, +Phone: (718) 575-1816. + +Portions copyright (c) 1990 by Elsevier, Inc. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +--------------------------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +--------------------------------------------------------------------------- + +PREAMBLE + +The goals of the Open Font License (OFL) are to stimulate worldwide development +of collaborative font projects, to support the font creation efforts of academic +and linguistic communities, and to provide a free and open framework in which +fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed +freely as long as they are not sold by themselves. The fonts, including any +derivative works, can be bundled, embedded, redistributed and/or sold with any +software provided that any reserved names are not used by derivative works. The +fonts and derivatives, however, cannot be released under any other type of license. +The requirement for fonts to remain under this license does not apply to any +document created using the fonts or their derivatives. + +DEFINITIONS + +"Font Software" refers to the set of files released by the Copyright Holder(s) under +this license and clearly marked as such. This may include source files, build +scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright +statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or +substituting -- in part or in whole -- any of the components of the Original Version, +by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other +person who contributed to the Font Software. + +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining a copy of the +Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell +modified and unmodified copies of the Font Software, subject to the following +conditions: + +1) Neither the Font Software nor any of its individual components, in Original or +Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed +and/or sold with any software, provided that each copy contains the above copyright +notice and this license. These can be included either as stand-alone text files, +human-readable headers or in the appropriate machine-readable metadata fields within +text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless +explicit written permission is granted by the corresponding Copyright Holder. This +restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall +not be used to promote, endorse or advertise any Modified Version, except to +acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with +their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed +entirely under this license, and must not be distributed under any other license. The +requirement for fonts to remain under this license does not apply to any document +created using the Font Software. + +TERMINATION + +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER +RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR +INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/img/amgm.png b/img/amgm.png new file mode 100644 index 0000000..a7273ae Binary files /dev/null and b/img/amgm.png differ diff --git a/img/calculus.png b/img/calculus.png new file mode 100644 index 0000000..cabbfff Binary files /dev/null and b/img/calculus.png differ diff --git a/img/cases.png b/img/cases.png new file mode 100644 index 0000000..4aab4e8 Binary files /dev/null and b/img/cases.png differ diff --git a/img/cauchyintegral.png b/img/cauchyintegral.png new file mode 100644 index 0000000..04790e0 Binary files /dev/null and b/img/cauchyintegral.png differ diff --git a/img/cauchyschwarz.png b/img/cauchyschwarz.png new file mode 100644 index 0000000..b710b5f Binary files /dev/null and b/img/cauchyschwarz.png differ diff --git a/img/cross.png b/img/cross.png new file mode 100644 index 0000000..0a6825b Binary files /dev/null and b/img/cross.png differ diff --git a/img/demorgan.png b/img/demorgan.png new file mode 100644 index 0000000..d7373b6 Binary files /dev/null and b/img/demorgan.png differ diff --git a/img/gaussintegral.png b/img/gaussintegral.png new file mode 100644 index 0000000..9e29ed7 Binary files /dev/null and b/img/gaussintegral.png differ diff --git a/img/limit.png b/img/limit.png new file mode 100644 index 0000000..ca89ae8 Binary files /dev/null and b/img/limit.png differ diff --git a/img/log.png b/img/log.png new file mode 100644 index 0000000..16d6f32 Binary files /dev/null and b/img/log.png differ diff --git a/img/long.png b/img/long.png new file mode 100644 index 0000000..3b59f96 Binary files /dev/null and b/img/long.png differ diff --git a/img/lorentz.png b/img/lorentz.png new file mode 100644 index 0000000..7d07f45 Binary files /dev/null and b/img/lorentz.png differ diff --git a/img/matrixmult.png b/img/matrixmult.png new file mode 100644 index 0000000..2f40e4c Binary files /dev/null and b/img/matrixmult.png differ diff --git a/img/maxwell.png b/img/maxwell.png new file mode 100644 index 0000000..710fb43 Binary files /dev/null and b/img/maxwell.png differ diff --git a/img/quadratic.png b/img/quadratic.png new file mode 100644 index 0000000..1b5ee0a Binary files /dev/null and b/img/quadratic.png differ diff --git a/img/ramanujan.png b/img/ramanujan.png new file mode 100644 index 0000000..9b7ea03 Binary files /dev/null and b/img/ramanujan.png differ diff --git a/img/schroedinger.png b/img/schroedinger.png new file mode 100644 index 0000000..0ef3e62 Binary files /dev/null and b/img/schroedinger.png differ diff --git a/img/square.png b/img/square.png new file mode 100644 index 0000000..7cade83 Binary files /dev/null and b/img/square.png differ diff --git a/img/st.png b/img/st.png new file mode 100644 index 0000000..5f7e3e9 Binary files /dev/null and b/img/st.png differ diff --git a/img/standard.png b/img/standard.png new file mode 100644 index 0000000..be48266 Binary files /dev/null and b/img/standard.png differ diff --git a/img/stirling.png b/img/stirling.png new file mode 100644 index 0000000..c71e9b1 Binary files /dev/null and b/img/stirling.png differ diff --git a/img/trig.png b/img/trig.png new file mode 100644 index 0000000..d0c7587 Binary files /dev/null and b/img/trig.png differ