iOS 数学公式的展示(latex、mathjax)

一般都是用 webview 加载数学公式。

latex 公式

如果确定数学公式是 latex 的表达式,可以使用以下方式显示:

<img src="http://latex.codecogs.com/gif.latex?在这里填写你的latex代码" /> 

示例:

//latex 表达式
NSString *latex = @"a_{ij}^{2} + b^3_{2}=x^{t} + y' + x''_{12}";

NSString *latexHTML = [NSString stringWithFormat:@"<img src=\"http://latex.codecogs.com/gif.latex?%@\" />",latex];

[_webView loadHTMLString:latexHTML baseURL:nil];

加载结果:

latex.png

其他格式的数学公式

如果后台返回的是 HTML 的标签,我们也可以直接用 webview 来加载,但是需要加载一个 mathjax 插件,用这个插件来解析数学公式

示例:

//HTML 代码
<p>下列五个关系中,正确的个数为(&nbsp; &nbsp; &nbsp;)</p><p>①$\frac{7}{2} \in R$&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;②$\sqrt{2} \notin Q$&nbsp;</p><p>③$π \in Q$ ;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;④ $|-3|\notin N$&nbsp;;</p><p>⑤&nbsp;$-\sqrt{4} \in Z$.&nbsp;</p>

NSString *htmlStr = @"";//使用以上HTML代码

//加载 MathJax插件 js代码
NSString *scripStr = @"<script type='text/javascript',async src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML'>MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['(',')']]}});</script>";

htmlStr = [NSString stringWithFormat:@"%@%@",htmlStr,scripStr];

[_webView loadHTMLString:htmlStr baseURL:nil];

加载结果:

html

webview 配置

用 webview 加载数学公式的时候,因为展示的就是一张图片,如果发现图片比较小,可以为图片标签注入一些样式:

NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width','initial-scale=0.9','user-scalable=no');meta.setAttribute('user-scalable','no');document.getElementsByTagName('head')[0].appendChild(meta); var imgs = document.getElementsByTagName('img');for (var i in imgs){imgs[i].style.maxWidth='100%';imgs[i].style.height='auto';};";
        
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
        
WKUserContentController *wkUController = [[WKUserContentController alloc] init];
        
[wkUController addUserScript:wkUScript];
        
WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
        
wkWebConfig.userContentController = wkUController;
        
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:wkWebConfig];

webview 高度动态获取

加载数学公式的时候,我们可以等待公式加载完成之后,动态的通过webview的代理获取高度,从而重新布局。

具体方法:

在 webview 加载完成之后,在 WKNavigationDelegate 这个代理中的以下代理方法,运行一段 js 代码,获取高度:

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    
    [webView evaluateJavaScript:@"document.body.scrollHeight;" completionHandler:^(id _Nullable any, NSError * _Nullable error) {
        
        CGFloat webviewHeight = [[NSString stringWithFormat:@"%@",any] floatValue];
    }];
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容