自动化办公004—有效解决ChatGPT数学公式无法复制到Office、MarkDown的问题

news2024/11/13 15:04:20

ChatGPT在输出数学公式的时候是正常的,但是粘贴到word、粘贴到MarkDown笔记里就直接变成了一堆代码,其实是有办法解决的,本篇文章主要解决一下无法复制问题


在这里插入图片描述

目录

    • 一、问题复现
    • 二、效果展示
      • 1. 测试案例
      • 2. 开始转换
        • (1)运行程序
        • (2)将ChatGPT的内容粘贴进来
        • (3)点击转换为MarkDown
        • (4)点击复制就可以了
        • (5)点击转化为LaTeX
        • (6)其他操作
    • 三、代码展示
    • 四、关于EXE运行程序

一、问题复现

ChatGPT输出的信息是这样的(很工正):

在这里插入图片描述

复制到word中是这样的:

在这里插入图片描述
复制到MakeDown中是这样的:
在这里插入图片描述

如何让复制出来的效果跟ChatGPT展示的效果一样是个问题,今天主要来解决这个。

二、效果展示

(代码文章里放有,当然,我也打包了exe程序放在文章末尾,有需要自取)

1. 测试案例

接下来我们从ChatGPT中复制过来这么一段文字,包含字符和数学算式:

如果要将您提供的数学公式格式化为内联的LaTeX样式,可以这样写:

在极坐标系中,两个极坐标点相加的含义是将它们表示的向量相加。每个极坐标点可以用一个长度(模)和一个方向角(角度或弧度)来描述。

具体地说,如果有两个极坐标点 \( (r_1, \theta_1) \) 和 \( (r_2, \theta_2) \),它们分别表示长度为 \( r_1 \) 和 \( r_2 \),方向角为 \( \theta_1 \) 和 \( \theta_2 \) 的向量。

将这两个向量相加得到的结果向量的极坐标可以通过以下公式计算:
\[ (r_1, \theta_1) + (r_2, \theta_2) = \left( \sqrt{r_1^2 + r_2^2 + 2r_1r_2\cos(\theta_2 - \theta_1)}, \ \theta_1 + \tan^{-1} \left( \frac{r_2\sin(\theta_2 - \theta_1)}{r_1 + r_2\cos(\theta_2 - \theta_1)} \right) \right) \]

这里,\( \sqrt{r_1^2 + r_2^2 + 2r_1r_2\cos(\theta_2 - \theta_1)} \) 是结果向量的长度,\( \theta_1 + \tan^{-1} \left( \frac{r_2\sin(\theta_2 - \theta_1)}{r_1 + r_2\cos(\theta_2 - \theta_1)} \right) \) 是结果向量的方向角。

因此,两个极坐标点相加的含义是将它们表示的两个向量进行向量加法,得到一个新的向量,其长度和方向角是根据上述公式计算得到的。
这样,您可以在LaTeX中内联地显示这个公式。

很明显,复制过来直接就成了这样,文字、代码、符号一堆。

2. 开始转换

(1)运行程序

我设置了一个输入框、两个转换按钮、一个重置按钮、一个输出框、一个复制按钮,对了左下角有信息提示,简单提示一下按钮的功能,当然,最后点击复制后,如果复制成功,可以在左下角看到提示。

在这里插入图片描述

(2)将ChatGPT的内容粘贴进来

注意,是使用ChatGPT左下角的复制选项,不要手动框选复制,框选复制的公式没法恢复。

在这里插入图片描述
复制后就可以在程序的输入框里边复制,像这样:

在这里插入图片描述

(3)点击转换为MarkDown

点击之后就可以在下边的文本框里看到转换后的文字信息,为了方便大家对应原文本里的公式,我并没有把公式单独列出来。

在这里插入图片描述

(4)点击复制就可以了

因为我用的CSDN编辑器是MarkDown的,在这里就直接复制进来让大家看下效果:


将这两个向量相加得到的结果向量的极坐标可以通过以下公式计算:
( r 1 , θ 1 ) + ( r 2 , θ 2 ) = ( r 1 2 + r 2 2 + 2 r 1 r 2 cos ⁡ ( θ 2 − θ 1 ) ,   θ 1 + tan ⁡ − 1 ( r 2 sin ⁡ ( θ 2 − θ 1 ) r 1 + r 2 cos ⁡ ( θ 2 − θ 1 ) ) ) (r_1, \theta_1) + (r_2, \theta_2) = \left( \sqrt{r_1^2 + r_2^2 + 2r_1r_2\cos(\theta_2 - \theta_1)}, \ \theta_1 + \tan^{-1} \left( \frac{r_2\sin(\theta_2 - \theta_1)}{r_1 + r_2\cos(\theta_2 - \theta_1)} \right) \right) (r1,θ1)+(r2,θ2)=(r12+r22+2r1r2cos(θ2θ1) , θ1+tan1(r1+r2cos(θ2θ1)r2sin(θ2θ1)))

这里,

r 1 2 + r 2 2 + 2 r 1 r 2 cos ⁡ ( θ 2 − θ 1 ) \sqrt{r_1^2 + r_2^2 + 2r_1r_2\cos(\theta_2 - \theta_1)} r12+r22+2r1r2cos(θ2θ1)

是结果向量的长度,

θ 1 + tan ⁡ − 1 ( r 2 sin ⁡ ( θ 2 − θ 1 ) r 1 + r 2 cos ⁡ ( θ 2 − θ 1 ) ) \theta_1 + \tan^{-1} \left( \frac{r_2\sin(\theta_2 - \theta_1)}{r_1 + r_2\cos(\theta_2 - \theta_1)} \right) θ1+tan1(r1+r2cos(θ2θ1)r2sin(θ2θ1))

是结果向量的方向角。

因此,两个极坐标点相加的含义是将它们表示的两个向量进行向量加法,得到一个新的向量,其长度和方向角是根据上述公式计算得到的。


忙活了大半天,结果很完美。

(5)点击转化为LaTeX

如果想将公式复制到Word、PPT、Excel,需要使用这个功能,比如我这里有句话:

如果要将您提供的数学公式格式化为内联的LaTeX样式,可以这样写:
\((r_1, \theta_1) + (r_2, \theta_2) = \left(r_1^2 + r_2^2 + 2r_1r_2 \cos(\theta_2 - \theta_1), \ \theta_1 + \tan^{-1} \left(\frac{r_1 + r_2 \cos(\theta_2 - \theta_1)}{r_2 \sin(\theta_2 - \theta_1)} \right)\right)\)
这样,您可以在LaTeX中内联地显示这个公式。

复制进去后是这样的:

在这里插入图片描述
点击“转化为LaTeX”可以看到这些内容:

在这里插入图片描述

选择复制我们需要的部分:

在这里插入图片描述

打开word后按下Alt + =(word里边的LaTeX编辑器),会出来一个这个:

在这里插入图片描述

将复制的内容粘贴进去,按下回车就好了:

在这里插入图片描述
在这里插入图片描述

在PPT和Excel中插入LaTeX时需要使用一些插件,如MathType(官网),然后根据操作将LaTex代码插入进去就可以了(若有问题见文章末尾联系渠道)。

(6)其他操作

当然,这个重置按钮可是我精心为大家设置的,如果经常需要转化,可以在每次转化前点一下重置按钮,非常方便。

在这里插入图片描述在这里插入图片描述

三、代码展示

这里放一下我调试好的代码,若想在这个基础上继续完善欢迎自取。

import re
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QTextEdit, QPushButton, QWidget, \
    QStatusBar
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtGui import QFont


class FormulaConverterApp(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("ChatGPT公式内容转换")
        self.setGeometry(100, 100, 720, 540)

        self.statusBar = QStatusBar()
        self.setStatusBar(self.statusBar)
        self.statusBar.setFont(QFont("微软雅黑", 12))

        # Set up the main layout
        main_layout = QVBoxLayout()
        main_layout.setContentsMargins(20, 20, 20, 20)  # Set margins around the layout
        main_layout.setSpacing(5)  # Set spacing between widgets in the layout

        # Input field
        self.input_field = QTextEdit("请复制ChatGPT的公式粘贴在这里")
        self.input_field.setFixedHeight(150)
        self.input_field.setFont(QFont("微软雅黑", 12))
        self.input_field.setStyleSheet("color: black;")
        self.input_field.installEventFilter(self)
        self.set_shadow_effect(self.input_field)
        main_layout.addWidget(self.input_field)

        # Buttons
        button_layout = QHBoxLayout()
        button_layout.setSpacing(5)  # Set spacing between buttons

        self.md_button = QPushButton("转换为Markdown")
        self.md_button.clicked.connect(self.convert_to_markdown)
        self.md_button.setToolTip("可以直接粘贴到MarkDown笔记")
        self.set_shadow_effect(self.md_button)
        button_layout.addWidget(self.md_button)

        self.latex_button = QPushButton("转化为LaTeX")
        self.latex_button.clicked.connect(self.convert_to_latex)
        self.latex_button.setToolTip("可以直接粘贴到Word、PPT、Excel")
        self.set_shadow_effect(self.latex_button)
        button_layout.addWidget(self.latex_button)

        self.reset_button = QPushButton("重置")
        self.reset_button.clicked.connect(self.reset_input)
        self.reset_button.setToolTip("清空输入")
        self.set_shadow_effect(self.reset_button)
        button_layout.addWidget(self.reset_button)

        main_layout.addLayout(button_layout)

        # Text display
        self.text_display = QTextEdit("转换后的信息将在这里展示")
        self.text_display.setFixedHeight(150)
        self.text_display.setFont(QFont("微软雅黑", 12))
        self.text_display.setStyleSheet("color: black;")
        self.text_display.installEventFilter(self)
        self.set_shadow_effect(self.text_display)
        main_layout.addWidget(self.text_display)

        # Copy button
        self.copy_button = QPushButton("复制")
        self.copy_button.clicked.connect(self.copy_to_clipboard)
        self.set_shadow_effect(self.copy_button)
        main_layout.addWidget(self.copy_button)

        # Set the main widget and layout
        container = QWidget()
        container.setLayout(main_layout)
        self.setCentralWidget(container)

        # Connect button hover events to status bar messages
        self.md_button.installEventFilter(self)
        self.latex_button.installEventFilter(self)
        self.reset_button.installEventFilter(self)

        # Apply styles
        self.apply_styles()

    def apply_styles(self):
        self.setStyleSheet("""
            QMainWindow {
                background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 #87CEEB, stop:1 #1E90FF);
            }
            QTextEdit {
                color: black;
                font-family: "微软雅黑";
                font-size: 10pt;
                border: none;
                background-color: #f0f0f0;
                padding: 20px;
                border-radius: 10px;
            }
            QPushButton {
                font-family: "微软雅黑";
                font-size: 12pt;
                height: 40px;
                border: none;
                background-color: #f0f0f0;
                padding: 10px;
                border-radius: 10px;
            }
            QPushButton:hover {
                background-color: #dcdcdc;
            }
            QPushButton:pressed {
                background-color: #c0c0c0;
            }
            QPushButton:focus {
                outline: none;
            }
        """)

    def eventFilter(self, source, event):
        if event.type() == QEvent.Enter:
            if source == self.md_button:
                self.statusBar.showMessage("第五提示:可以直接粘贴到MarkDown笔记")
            elif source == self.latex_button:
                self.statusBar.showMessage("第五提示:可以直接粘贴到Word、PPT、Excel")
            elif source == self.reset_button:
                self.statusBar.showMessage("第五提示:清空输入")
        elif event.type() == QEvent.Leave:
            self.statusBar.clearMessage()
        elif event.type() == QEvent.FocusIn:
            if source in [self.input_field, self.text_display]:
                if source.toPlainText() in ["请复制ChatGPT的公式粘贴在这里", "转换后的信息将在这里展示"]:
                    source.clear()
                    source.setStyleSheet("color: black;")
        elif event.type() == QEvent.FocusOut:
            if source == self.input_field and source.toPlainText().strip() == "":
                source.setText("请复制ChatGPT的公式粘贴在这里")
                source.setStyleSheet("color: black;")
            elif source == self.text_display and source.toPlainText().strip() == "":
                source.setText("转换后的信息将在这里展示")
                source.setStyleSheet("color: black;")
        return super().eventFilter(source, event)

    def set_shadow_effect(self, widget):
        widget.setGraphicsEffect(None)
        shadow = """
            border: 2px solid #c0c0c0;
            border-radius: 10px;
            background-color: #f0f0f0;
            box-shadow: 3px 3px 10px #aaaaaa;
        """
        widget.setStyleSheet(widget.styleSheet() + shadow)

    def contains_chinese_characters(self, input_str):
        for char in input_str:
            if '\u4e00' <= char <= '\u9fff':
                return True
        return False

    def convert_to_markdown(self):
        input_str = self.input_field.toPlainText().strip()
        # 初始化结果列表
        segments = []

        # 拆分字符串,保留 \( 和 \) 以及 \[ 和 \] 之间的内容和其他文本
        while True:
            # 找到 \( 和 \) 的位置
            start_index_round = input_str.find(r'\(')
            end_index_round = input_str.find(r'\)')

            # 找到 \[ 和 \] 的位置
            start_index_square = input_str.find(r'\[')
            end_index_square = input_str.find(r'\]')

            # 选择最先出现的起始标记
            if start_index_round == -1 and start_index_square == -1:
                break
            elif start_index_round == -1 or (start_index_square != -1 and start_index_square < start_index_round):
                start_index = start_index_square
                end_index = end_index_square
                delimiter_len = len(r'\[')
            else:
                start_index = start_index_round
                end_index = end_index_round
                delimiter_len = len(r'\(')

            if end_index == -1:
                break

            # 添加起始标记前的文本
            segments.append(input_str[:start_index])

            # 添加标记之间的 LaTeX 片段
            segments.append(input_str[start_index + delimiter_len:end_index])

            # 更新 input_str
            input_str = input_str[end_index + delimiter_len:]

        # 添加剩余的文本(如果有)
        if input_str:
            segments.append(input_str)

        str = ""
        # 输出每个片段
        for i, segment in enumerate(segments):

            if self.contains_chinese_characters(segment):
                str += (f"{segment.strip()}")
            else:
                if len(segment) < 20:
                    str += (f"${segment.strip()}$")
                else:
                    str += (f"$${segment.strip()}$$")
        self.text_display.setText(str)

    def convert_to_latex(self):

        input_str = self.input_field.toPlainText().strip()
        # 初始化结果列表
        segments = []

        # 拆分字符串,保留 \( 和 \) 以及 \[ 和 \] 之间的内容和其他文本
        while True:
            # 找到 \( 和 \) 的位置
            start_index_round = input_str.find(r'\(')
            end_index_round = input_str.find(r'\)')

            # 找到 \[ 和 \] 的位置
            start_index_square = input_str.find(r'\[')
            end_index_square = input_str.find(r'\]')

            # 选择最先出现的起始标记
            if start_index_round == -1 and start_index_square == -1:
                break
            elif start_index_round == -1 or (start_index_square != -1 and start_index_square < start_index_round):
                start_index = start_index_square
                end_index = end_index_square
                delimiter_len = len(r'\[')
            else:
                start_index = start_index_round
                end_index = end_index_round
                delimiter_len = len(r'\(')

            if end_index == -1:
                break

            # 添加起始标记前的文本
            segments.append(input_str[:start_index])

            # 添加标记之间的 LaTeX 片段
            segments.append(input_str[start_index + delimiter_len:end_index])

            # 更新 input_str
            input_str = input_str[end_index + delimiter_len:]

        # 添加剩余的文本(如果有)
        if input_str:
            segments.append(input_str)

        str = ""
        # 输出每个片段
        for i, segment in enumerate(segments):

            if self.contains_chinese_characters(segment):
                str += (f"{segment.strip()}")
            else:
                if len(segment) < 20:
                    str += (f"{segment.strip()}")
                else:
                    str += (f"{segment.strip()}")
        self.text_display.setText(str)

    def reset_input(self):
        self.input_field.setText("请复制ChatGPT的公式粘贴在这里")
        self.input_field.setStyleSheet("color: black;")
        self.text_display.setText("转换后的信息将在这里展示")
        self.text_display.setStyleSheet("color: black;")

    def copy_to_clipboard(self):
        clipboard = QApplication.clipboard()
        clipboard.setText(self.text_display.toPlainText())
        self.statusBar.showMessage("第五提示:复制成功!", 2000)  # Show message for 2 seconds


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = FormulaConverterApp()
    window.show()
    sys.exit(app.exec_())

四、关于EXE运行程序

为了方便操作,我这里直接将代码打包成了exe可运行程序,找到客F回复“ZD004”直接领取就行,当然,若有其他问题也可以随时留言,我看到后一定第一时间回复。

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1911471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【保姆级介绍下C语言中的运算符的优先级】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🧇C语言中的运算符的优先级 🧇C语言中的运算符的优先级决定了表达…

2024-07-09 Linux 使用gpio-keyboard标准方式获取按键事件实例代码

一、kernel dts 配置修改&#xff1a; diff --git a/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-evb1-v11.dts b/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-evb1-v11.dts index d0d059a3b..584f3a00a 100755 --- a/sysdrv/source/kernel/arch/arm/boot/dts/rv110…

Hospital Management Startup 1.0 SQL 注入漏洞(CVE-2022-23366)

前言 CVE-2022-23366是一个影响HMS v1.0的SQL注入漏洞。该漏洞存在于patientlogin.php文件中&#xff0c;允许攻击者通过特定的SQL注入来获取或修改数据库中的敏感信息。 具体来说&#xff0c;攻击者可以通过向patientlogin.php发送恶意构造的SQL语句来绕过身份验证&#xff…

LabVIEW开发阀门自动校准装置

1. 装置概述与目标 在工业和实验室环境中&#xff0c;阀门的准确性和稳定性对于流体控制和实验数据的可靠性非常重要。LabVIEW可以作为开发阀门自动校准装置的理想工具&#xff0c;提供高度可定制化的解决方案。 2. 硬件与设备选择 型号选择&#xff1a;为了实现阀门自动校准…

三维点云配准 -- ICP 算法原理及推导

三维点云配准 -- ICP 算法原理及推导 - 知乎 (zhihu.com) 三维点云配准 -- ICP 算法 | Yilins Blog Alex Segal - Research - Generalized-ICP (ox.ac.uk)

Redisson分布式锁、可重入锁

介绍Redisson 什么是 Redisson&#xff1f;来自于官网上的描述内容如下&#xff01; Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的 redis 常用数据结构命令服务&#xff0c;还提供了…

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

第十八节 LLaVA如何按需构建LORA训练(视觉、语言、映射多个组合训练)

文章目录 前言一、基于llava源码构建新的参数1、添加lora_vit参数2、训练命令脚本设置二、修改源码,构建lora训练1、修改源码-lora训练2、LLM模型lora加载3、VIT模型加载4、权重冻结操作5、结果显示三、实验结果前言 如果看了我前面文章,想必你基本对整个代码有了更深认识。…

技术速递|VS Code Java 6月更新 - 项目设置功能增强!大量 Spring 新特性

作者&#xff1a;Nick Zhu 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Visual Studio Code for Java 的六月更新&#xff01;在这篇博客中&#xff0c;我们将分享项目设置项目的重要更新以及一系列 Spring 的功能改进&#xff0c;让我们开始吧&#xff01; 项目设…

gitlab-runner安装部署CI/CD

手动安装 卸载旧版&#xff1a; gitlab-runner --version gitlab-runner stop yum remove gitlab-runner下载gitlab对应版本的runner # https://docs.gitlab.com/runner/install/bleeding-edge.html#download-any-other-tagged-releasecurl -L --output /usr/bin/gitlab-run…

工业一体机为数字化工厂带来高效作业指导

随着工业4.0的浪潮席卷全球&#xff0c;数字化工厂的概念深入人心。在这一背景下&#xff0c;工业一体机作为数字化转型的重要一环&#xff0c;凭借其强大的功能和灵活的应用&#xff0c;为工厂实现高效作业指导提供了强大的助力。 一、工业一体机的优势&#xff1a;赋能数字化…

解锁算力新极限,Xilinx UltraScale+赋能的高性能低延时FPGA加速卡

01、产品概述 AiHPC-V9P 是一款基于 AMD Virtex UltraScale FPGA VU9P 的 PCIe Gen3.0 x16 接口智能网卡&#xff0c;具有最大2*200GbE /或者16*10GbE(典型应用&#xff09;接入容量的高性能低延时智能网卡。 对外接口支持两组QSFP-DD 最高25Gb/s x8Lane 光口接入&#xf…

机场公厕厕位指引屏,布线简单,安装便捷

在人潮涌动的机场&#xff0c;公厕不仅是旅客的必需设施&#xff0c;更是衡量机场服务质量的重要指标。然而&#xff0c;传统机场公厕往往存在信息不透明、清洁维护滞后、高峰期拥挤等问题&#xff0c;严重影响了旅客的使用体验。近年来&#xff0c;随着智慧机场理念的兴起&…

【第24章】MyBatis-Plus之SQL注入器

文章目录 前言一、概述1. 使用场景2. 功能 二、注入器配置三、自定义全局方法攻略1. 定义SQL2. 注册自定义方法3.定义BaseMapper4.配置SqlInjector 四、注意事项五、更多示例六、实战1. 定义SQL2. 注册自定义方法3.定义BaseMapper4.配置SqlInjector5. 测试类6. 结果 总结 前言 …

如何使用IDEA快速清理无效代码(荣耀典藏版)

大家好&#xff0c;我是月夜枫。 今天分享一下IDEA中很有实用价值的Analyze&#xff0c;那么Analyze是用来做什么的呢&#xff1f; 主要用来清理没有引用的代码&#xff0c;包括方法、实体类以及没有使用的Mapper和Service等。 为了是项目更加整洁&#xff0c;可以使用Idea中…

(十六)视图变换 正交投影 透视投影

视图变换 代码实验 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream> #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h"//GLM #include <glm/glm.hpp> #include <glm/gtc/m…

SECS/GEM快速完成半导体设备通讯

金南瓜帮助国内大量从事半导体前道设备开发研制、生产的设备厂商&#xff0c;通过快速提供稳定可靠的SECS/GEM、GEM300产品&#xff0c;为客户在激光退火、湿法设备&#xff08;清洗、镀膜等&#xff09;、离子注入、MOCVD、PVD等客户专注于核心工艺提升&#xff0c;提升企业的…

【Python进阶】继承进阶和私有权限

目录 一、继承进阶 1、方法重写 2、调用父类方法 3、多层继承 二、私有权限 1、私有属性 2、私有方法 面向对象基础&#xff1a;小白也能看懂的Python基础教程&#xff08;8&#xff09;-CSDN博客 一、继承进阶 1、方法重写 当父类的同名方法达不到子类的要求&#x…

AR增强现实汽车装配仿真培训系统开发降低投入费用

随着互联网的无处不在&#xff0c;AR增强现实技术正逐步融入我们生活的每一个角落。深圳华锐视点作为一家引领行业潮流的AR内容开发的技术型公司&#xff0c;正以其卓越的技术实力和专业的服务团队&#xff0c;推动着国内AR技术向更加成熟和多元化的方向迈进。 深圳华锐视点提供…

2024年文化研究与数字媒体国际会议 (CRDM 2024)

2024年文化研究与数字媒体国际会议 (CRDM 2024) 2024 International Conference on Cultural Research and Digital Media 【重要信息】 大会地点&#xff1a;珠海 大会官网&#xff1a;http://www.iccrdm.com 投稿邮箱&#xff1a;iccrdmsub-conf.com 【注意&#xff1a;稿将…