Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在SwiftUI中用LaTeX创建数学公式文本视图?

如何在SwiftUI中用LaTeX创建数学公式文本视图?
EN

Stack Overflow用户
提问于 2020-12-01 12:15:20
回答 2查看 919关注 0票数 2

我是Swift编程新手,希望用SwiftUI创建一个应用程序。这就是我希望实现的目标:

也就是说,文本字段具有针对LaTeX的实时语法突出显示,然后其内容由mathjax呈现并显示在web视图中。

我在这个网站和GitHub上做了一些搜索,只发现相关的代码大多是Objective-C或Swift 4.x (如this)的,没有一个是用SwiftUI做的接口。然而,在我的研究过程中,我发现了一种可能可行的方法。似乎使用JavaScriptCore框架可以使用highlight.js来突出显示语法(就像Highlightr在那里做的那样,但它的代码非常复杂)。我对这种方法深信不疑,因为如果可以使用highlight.js来实现代码突出显示,那么以类似的方式,就应该能够使用其他JavaScripts (如mathjax.js )来实现其他功能。

不幸的是,由于我是Swift和SwiftUI的新手,我不知道从哪里开始。有没有人能给我一些提示?(欢迎任何帮助,不一定要使用JavaScriptCore)

EN

回答 2

Stack Overflow用户

发布于 2020-12-01 12:33:26

这里有一个可能的解决方案,它使用了一个很棒的框架,RichTextView

代码语言:javascript
运行
AI代码解释
复制
import RichTextView

struct ContentView : View {
    
    @State var string : String = "In physics, the mass-energy equivalence is stated by the equation [math]$E=mc^2$[/math], discovered in 1905 by Albert Einstein."
    
    var body : some View {
        TextField("Test", text: $string)
            .padding(.vertical, 32)
            .border(Color.red)
        
        TextView(string: $string)
            .padding(.horizontal, 16)
    }
}


struct TextView : UIViewRepresentable {
    
    @Binding var string : String
    
    func makeUIView(context: Context) -> RichTextView {
        let richTextView = RichTextView(
            input: string,
            latexParser: LatexParser(),
            font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
            textColor: UIColor.black,
            frame: CGRect.zero,
            completion: nil
        )
        
        return richTextView
        
    }

   func updateUIView(_ uiView: RichTextView, context: Context) {
        uiView.update(
            input: string,
            latexParser: LatexParser(),
            font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
            textColor: UIColor.black,
            completion: nil
        )
   }
}

你总是必须从数学开始,以/math but结束可以使用默认的Latex。有关其文档的更多信息。

票数 2
EN

Stack Overflow用户

发布于 2020-12-03 13:37:46

这是我目前的解决方案,它使用CodeViewer包来突出显示代码,使用mathjax.js来渲染数学。

代码语言:javascript
运行
AI代码解释
复制
import SwiftUI
import CodeViewer

struct LaTeXView: View {
    @State private var placeholderString: String = "Insert here"
    @State private var inputText: String = ""
    
    var body: some View {
        VStack {
            //MARK: Code editor
            CodeViewer(
                content: $inputText,
                mode: .latex,
                darkTheme: .solarized_dark,
                lightTheme: .solarized_light,
                isReadOnly: false,
                fontSize: 50
            )
            
            //MARK: for rendering math
            HTMLStringView(htmlContent: """
                <html>
                <head>
                  <meta charset="utf-8">
                  <meta name="viewport" content="width=device-width">
                  <title>MathJax example</title>
                  <script>MathJax = {
                        tex:{
                                inlineMath: [['$', '$'], ['\\(', '\\)']],
                                tags: 'ams'
                            },
                        svg:{
                                fontCache: 'global'
                            }
                        };
                  </script>
                  <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
                  <script id="MathJax-script" async
                          src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
                  </script>
                </head>
                <body>
                <p>
                \(inputText.replacingOccurrences(of: "\n\n", with: "<br>"))
                </p>
                </body>
                </html>
                """
            )
        }
    }
}

struct LaTeXView_Previews: PreviewProvider {
    static var previews: some View {
        LaTeXView()
    }
}

结果如下所示:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65090289

复制
相关文章
css 使元素居中
<div style="text-align:center;">居中显示</div>
lin_zone
2018/08/15
2.4K0
css 使元素居中
求两列表之间相同与不同元素
针对两列表找相同与不同元素问题,提出利用set()方法,通过Python输入代码实验,证明该方法是有效的,本文的方法只比较了两个列表之间的问题,未来希望能够实现更多列表同时求相同与不同元素。
算法与编程之美
2023/08/22
1550
求两列表之间相同与不同元素
怎样使元素可编辑
作者:http://lucky.myrice.com E-mail:amxh@21cn.com
Java架构师必看
2021/03/22
3160
javascript 数组排序,找到相同元素[通俗易懂]
小白前端一个,公司项目,里面有一个数组增加,删除,去重,排序,找到相同元素个数等等…
全栈程序员站长
2022/08/14
1K0
根据某列相同元素求和
下面是一个需要计算相同基因的exon的长度的文件,即根据相同的基因,先计算基因的起点到终点的距离,再对相同的基因的的exon距离求和
生信编程日常
2020/06/11
1K0
根据某列相同元素求和
常见的块状元素与内联元素
xHTML究竟有多少个标签?绝大部分人都不能得出一个正确的答案,现在就有个机会,自己数数。答案:91个,哈哈,被你找到了~
Twcat_tree
2022/11/30
5800
JS取两个数组相同的元素
function arrayIntersection ( a, b ) { var ai=0, bi=0; var result = new Array(); while ( ai < a.length && bi < b.length ) { if ( a[ai] < b[bi] ) { ai++; } else if ( a[ai] > b[bi] ) { bi++; } else /* they're equal
用户7705674
2021/09/24
6.3K0
行内元素与块元素间的转换及行内块元素
在HTML中行内元素和块元素间的区分,本质上是其标签默认存在了一个 display 属性,当 display 属性的值为 block 那么所对应的标签即为块元素,反之当值为 inline 则标签为行内元素。
摸鱼的G
2023/02/22
1.2K0
行内元素与块元素间的转换及行内块元素
jQuery 隐藏具有指定class属性值的元素
代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>前端</title> <style> .antzone{ width:200px; height:100px; background:#ccc; } </style> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script> $(document).ready(func
IT工作者
2022/02/17
5.1K0
Selenium 元素checkbox元素操作与元素等待
检测百度页面搜索按钮是否存在,存在就输入关键词“自学网 Selenium” 然后点击搜索
清风穆云
2021/08/09
1.6K0
HTML中的内联元素与块级元素
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/05/09
3.3K0
【前端】使用CSS使元素居中的几种方式
zhaokang555
2023/10/17
2260
PHP分割两个数组的相同元素和不同元素的两种方法
一、举例说明 例如有两个数组A和B(当然这个A和B也可以是key=>value形式) A = array('tt','cc','dd','mm') B = array('ad','tt','cc','qq') 希望得到的结果是: sameArr = array('tt','cc') A = array('dd','mm') B = array('ad','qq') 二、解决方案 2.1、方法一:for循环取出数据 1、for循环一个A数组; 2、使用array_search判断元素是否存在B数组中; 3
蛋未明
2018/06/07
2.3K0
list去除相同String、对象元素
一、当相同元素为String时 方法一 /** * List去重 */ private List<String> removeDuplicate(List<String> list) { LinkedHashSet<String> set = new LinkedHashSet<String>(list.size()); set.addAll(list); list.clear(); list.addAll(
崔笑颜
2020/06/08
8170
python删除序列相同的元素并保持原顺序
示例: 1 2 3 4 5 6 7 8 9 1、列表中有重复的元素 a = [1,5,2,1,9,1,5,10] 2、字典中有重复的键值对 a = [ {'x': 1,'y': 2}, {'x': 1,'y': 3}, {'x': 1,'y': 2}, {'x': 2,'y': 4} ] 针对这些,我们需要去重,并且还要保持原顺序不变,该如何操作呢? 这里我们使用函数来解决。 1、列表去重 1 2 3 4 5 6 7 8 9
dogfei
2020/07/31
8240
LeetCode 2121. 相同元素的间隔之和(前缀和)
arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和 arr[j] 之间的间隔是 |i - j| 。
Michael阿明
2022/01/07
5920
iOS求两个数组里的相同元素
这个比起直接遍历做得优一点的地方在于先把A数组中元素剔除出来(范围在B内),然后再进行遍历,这也得益于数组已经排好序。
清墨
2019/04/23
2.5K0
button元素的id与onclick的函数名字相同 导致方法失效的问题
需求需要在原先页面添加一个按钮,触发一个function,如此简单的操作,却无意间发现了一个问题。(还是对html了解的太少)
陈灬大灬海
2019/01/28
1.7K0
button元素的id与onclick的函数名字相同 导致方法失效的问题
元素的显示与隐藏
在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display visibility 和 overflow。
星辰_大海
2020/09/30
4.4K0
2021-10-17 JS使模板元素进行移动(拖拽模板元素)
原理很简单,就是将元素设置为绝对定位,然后监听鼠标按下(mousedown),移动事件(mousemove),改变元素的top、left值就行。
无道
2021/10/19
2.5K0
2021-10-17 JS使模板元素进行移动(拖拽模板元素)

相似问题

如何使附加的元素具有与当前元素相同的功能

13

如何使元素具有相同的"src“

116

如何使元素具有相同的高度

31

使子元素具有与父元素相同的宽度和边框

14

无法使子元素与父元素IE具有相同的高度

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档