Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.75 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Class Foo
  5.  */
  6. class Foo
  7. {
  8.     /**
  9.      * @var string
  10.      */
  11.     private $tpl = <<<'EOT'
  12. \documentclass{standalone}
  13.  
  14. \usepackage{amsmath}
  15. \usepackage{amsfonts}
  16. \usepackage{amssymb}
  17.  
  18. \begin{document}
  19. {\Large%
  20. ${latex}$%
  21. }
  22. \end{document}
  23. EOT;
  24.  
  25.     /**
  26.      * @param $file
  27.      * @param $mime
  28.      * @return string
  29.      */
  30.     private function generateDataUri($file, $mime)
  31.     {
  32.         $contents = file_get_contents($file);
  33.         $base64 = base64_encode($contents);
  34.         return "data:$mime;base64,$base64";
  35.     }
  36.  
  37.     /**
  38.      * @param $math
  39.      * @return string
  40.      */
  41.     public function mathToSvgDataUri($math)
  42.     {
  43.         $math = trim($math);
  44.  
  45.         $filename = md5($math);
  46.  
  47.         $tplReady = str_replace('{latex}', $math, $this->tpl);
  48.  
  49.         $path = __DIR__ . '/cache/data.tex';
  50.  
  51.         file_put_contents($path, $tplReady);
  52.  
  53.         shell_exec(
  54.             'cd ' . dirname($path)
  55.             . ' && pdflatex -shell-escape data.tex'
  56.             . ' && pdf2svg data.pdf ' . $filename . '.svg'
  57.         );
  58.  
  59.         return '<img src="' . $this->generateDataUri(__DIR__ . '/cache/' . $filename . '.svg', 'image/svg+xml') . '" />';
  60.     }
  61.  
  62.     /**
  63.      * @param $math
  64.      * @return string
  65.      */
  66.     public function mathToPngDataUri($math)
  67.     {
  68.         $math = trim($math);
  69.  
  70.         $filename = md5($math);
  71.  
  72.         $tplReady = str_replace('{latex}', $math, $this->tpl);
  73.  
  74.         $path = __DIR__ . '/cache/data.tex';
  75.  
  76.         file_put_contents($path, $tplReady);
  77.  
  78.         shell_exec(
  79.             'cd ' . dirname($path)
  80.             . ' && pdflatex -shell-escape data.tex'
  81.             . ' && convert -density 100 data.pdf -quality 100 ' . $filename . '.png'
  82.         );
  83.  
  84.         return '<img src="' . $this->generateDataUri(__DIR__ . '/cache/' . $filename . '.png', 'image/png') . '" />';
  85.     }
  86. }
  87.  
  88. header('Content-Type: text/html; charset=UTF-8');
  89.  
  90. $content = <<<'EOT'
  91. <div class="block">
  92. <p>Sei $N$ die Menge aller $n \in \mathbb{N}$ für die gilt $n>0$ und $2 \nmid n$.</p>
  93.  
  94. <p>Sei $P$ die Menge aller $p \in \mathbb{Q}$ für die gilt $0 \leq p \leq 1$.</p>
  95.  
  96. <p>Sei $P_{>0}$ die Menge $P \setminus \{0\}$.</p>
  97.  
  98. <p>Sei $n \in N$ die maximale Anzahl der Spiele der Serie („best of $n$“).</p>
  99.  
  100. <p>Sei $p \in P$ die Wahrscheinlichkeit für einen Sieg der betrachteten Mannschaft
  101.     in einem Spiel.</p>
  102.  
  103. <p>$\text{WP}_{m} : (n \in N, p \in P, m \in \mathbb{N}) \rightarrow P$ berechnet die
  104. Wahrscheinlichkeit, dass die betrachtete Mannschaft die Serie nach $m$ Spielen
  105. gewinnt. Dabei sei $m \in \mathbb{N}$, $\frac{n+1}{2} \leq m \leq n$.</p>
  106.  
  107. \[
  108. \text{WP}_{m}(n,p,m) \mapsto
  109. p \binom{m-1}{\frac{n-1}{2}} p^{\frac{n-1}{2}} (1-p)^{m-1-\frac{n-1}{2}}
  110. \]
  111.  
  112. \[
  113. \phi_n(\kappa) =
  114.                  \frac{1}{4\pi^2\kappa^2} \int_0^\infty
  115.                  \frac{\sin(\kappa R)}{\kappa R}
  116.                  \frac{\partial}{\partial R}
  117.                  \left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR
  118. \]
  119. </div>
  120. EOT;
  121.  
  122. $foo = new Foo();
  123.  
  124. ?><!DOCTYPE html>
  125.  
  126. <html lang="de">
  127.  
  128.     <head>
  129.         <meta charset="UTF-8" />
  130.         <title>Math rendering tests</title>
  131.         <style>
  132.             body {
  133.                 padding: 20px;
  134.             }
  135.             img {
  136.                 vertical-align: middle;
  137.             }
  138.             h1 {
  139.                 text-align: center;
  140.             }
  141.             .block {
  142.                 margin: 10px;
  143.                 padding: 10px;
  144.                 border: 1px solid #ccc;
  145.                 border-radius: 5px;
  146.             }
  147.         </style>
  148.         <script type="text/x-mathjax-config">
  149.             MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
  150.         </script>
  151.         <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
  152.     </head>
  153.  
  154.     <body>
  155.  
  156.         <h1>SVG (pdflatex + pdf2svg)</h1>
  157.  
  158. <?php
  159.  
  160. $content2 = preg_replace_callback('/\$([^$]+)\$/', function ($ms) use ($foo) {
  161.     return $foo->mathToSvgDataUri($ms[1]);
  162. }, $content);
  163.  
  164. $content2 = preg_replace_callback('/\\\\\[(.*?)\\\\\]/s', function ($ms) use ($foo) {
  165.     return '<p style="text-align: center;">' . $foo->mathToSvgDataUri($ms[1]) . '</p>';
  166. }, $content2);
  167.  
  168. echo $content2;
  169.  
  170. ?>
  171.         <h1>PNG (pdflatex + convert)</h1>
  172.  
  173. <?php
  174.  
  175. $content2 = preg_replace_callback('/\$([^$]+)\$/', function ($ms) use ($foo) {
  176.     return $foo->mathToPngDataUri($ms[1]);
  177. }, $content);
  178.  
  179. $content2 = preg_replace_callback('/\\\\\[(.*?)\\\\\]/s', function ($ms) use ($foo) {
  180.     return '<p style="text-align: center;">' . $foo->mathToPngDataUri($ms[1]) . '</p>';
  181. }, $content2);
  182.  
  183. echo $content2;
  184.  
  185. ?>
  186.  
  187.         <h1>Mathjax</h1>
  188.  
  189.         <?php echo $content; ?>
  190.  
  191.     </body>
  192.  
  193. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement