{"id":6703,"date":"2025-11-19T08:01:47","date_gmt":"2025-11-19T00:01:47","guid":{"rendered":"https:\/\/mynotes.org\/tech\/?p=6703"},"modified":"2025-11-21T10:11:46","modified_gmt":"2025-11-21T02:11:46","slug":"gemini%e7%9a%84deep-research%e7%94%a2%e5%87%ba%e7%a0%94%e7%a9%b6%e5%a0%b1%e5%91%8a%e4%b8%ad%e7%9a%84latex%e8%aa%9e%e6%b3%95%e8%bd%89%e6%8f%9b","status":"publish","type":"post","link":"https:\/\/mynotes.org\/tech\/2025\/11\/19\/6703.htm","title":{"rendered":"Gemini\u7684Deep Research\u7522\u51fa\u7814\u7a76\u5831\u544a\u4e2d\u7684LaTex\u8a9e\u6cd5\u8f49\u63db"},"content":{"rendered":"<p>\u5982\u679cGemini\u7684Deep Research\u7522\u51fa\u7814\u7a76\u5831\u544a\u88e1\u9762\u6709\u6578\u5b78\u516c\u5f0f\u6216\u4e0a\u4e0b\u6a19\uff0c\u7814\u7a76\u5831\u544a\u532f\u51fa\u6210Google\u6587\u4ef6\u6642\uff0c\u5c31\u6703\u6709\u5f88\u591a$&#8230;.$\u7684\u7b26\u865f\uff0c\u7121\u6cd5\u8f49\u63db\u6210\u6b63\u78ba\u683c\u5f0f\u3002<br \/>\n\u627eGemini\u89e3\u6c7a\u9019\u500b\u554f\u984c\u975e\u5e38\u4e0d\u6210\u529f\uff0c\u5c31\u63db\u6210ChatGPT\uff0c\u5927\u81f4\u4e0a\u89e3\u6c7a\u4e86\u3002<br \/>\n\u89e3\u6c7a\u7684\u65b9\u6cd5\u662f\u571f\u6cd5\u7149\u92fc\uff0c\u5c07\u6587\u7ae0\u4e2dLaTex\u7684\u8a9e\u6cd5\u4e00\u4e00\u5c0d\u7167\u53d6\u4ee3\uff0c\u7528\u7aae\u8209\u5f0f\u7684\u5beb\u6cd5\uff0c\u4e00\u500b\u4ee3\u78bc\u4e00\u500b\u4ee3\u78bc\u8a2d\u5b9a\u5728\u7a0b\u5f0f\u78bc\u88e1\u9762\u3002\u672a\u4f86\u82e5\u9047\u5230\u7a0b\u5f0f\u4e0d\u8a8d\u5f97\u7684\u4ee3\u78bc\uff0c\u5c31\u518d\u52a0\u9032\u53bb\u3002<br \/>\n\u7576\u521d\u6709\u500b\u74f6\u9838\u662f\u66ff\u63dbLaTex\u4ee3\u78bc\u6642\uff0c\u6587\u7ae0\u683c\u5f0f\u6703\u8dd1\u6389\uff0c\u4f46AI\u6700\u5f8c\u9084\u662f\u60f3\u8fa6\u6cd5\u89e3\u6c7a\u4e86\u3002<br \/>\n<strong>\u7a0b\u5f0f\u78bc\u5beb\u5728Google\u6587\u4ef6\u7684Apps Script\u88e1\u9762\uff0c\u8ddf\u8457\u4e00\u4efdGoogle\u6587\u4ef6\u8d70\u3002\u6240\u4ee5\u8907\u88fd\u9019\u4efdGoogle\u6587\u4ef6\u5c31\u53ef\u4ee5\u6709\u9019\u500b\u529f\u80fd\uff0c\u4e0d\u7528\u8f38\u5165\u7a0b\u5f0f\u78bc\u3002<br \/>\n\u9019\u662f\u53ef\u4ee5\u8907\u88fd\u53bb\u7528\u7684<a href=\"https:\/\/docs.google.com\/document\/d\/11wJ9kzp4J9uGu0SliirQ3cE_dYNmM13fF5Ek1LMfK9k\/copy\">\u6587\u4ef6\u7bc4\u672c<\/a>\uff0c\u9ede\u9078\u9023\u7d50\u5f8c\uff0c\u7db2\u9801\u756b\u9762\u5c31\u6703\u76f4\u63a5\u8981\u6c42\u4f60\u5efa\u7acb\u4e00\u500b\u526f\u672c\uff0c\u6587\u4ef6\u4e2d\u6709\u4f7f\u7528\u8aaa\u660e\u3002<\/strong><br \/>\n\u7d50\u5c3e\u6709\u6211\u548cAI\u7684\u5c0d\u8a71\uff0c\u5176\u4e2d\u6709\u5982\u4f55\u5c07APP Script\u52a0\u5165Google\u6587\u4ef6\u7684\u6d41\u7a0b\u3002\u672a\u4f86\u5982\u679c\u6709LaTex\u4ee3\u78bc\u6c92\u89e3\u6790\u5230\u7684\uff0c\u53ef\u4ee5\u628a\u7a0b\u5f0f\u78bc\u8cbc\u7d66AI\u53eb\u4ed6\u52a0\uff0c\u6216\u662f\u81ea\u5df1\u624b\u52d5\u52a0\u5728\u7a0b\u5f0f\u78bc\u88e1\u9762\u3002<br \/>\n\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a<\/p>\n<pre escaped=\"true\" lang=\"java\" line=\"1\">\r\nfunction onOpen() {\r\n  DocumentApp.getUi()\r\n    .createMenu('LaTeX \u8f49\u63db')\r\n    .addItem('\u5efa\u7acb\u8f49\u63db\u5f8c\u7684\u65b0\u6587\u4ef6\uff08\u4fdd\u7559\u683c\u5f0f\uff09', 'createLatexConvertedCopy')\r\n    .addToUi();\r\n}\r\n\r\n\/\/ 1. \u8907\u88fd\u6574\u4efd\u6587\u4ef6 \u2192 2. \u5728\u526f\u672c\u4e2d\u9010\u6bb5\u8655\u7406 $...$ \u8207 frac{...}{...}\r\nfunction createLatexConvertedCopy() {\r\n  var srcDoc = DocumentApp.getActiveDocument();\r\n  var srcId  = srcDoc.getId();\r\n\r\n  \/\/ 1. \u7528 Drive \u8907\u88fd\u6574\u4efd\u6587\u4ef6\uff08\u683c\u5f0f\u3001\u5716\u7247\u3001\u8868\u683c\u90fd\u4fdd\u7559\uff09\r\n  var file   = DriveApp.getFileById(srcId);\r\n  var copy   = file.makeCopy(srcDoc.getName() + '\uff08LaTeX \u8f49\u63db\u7248\uff09');\r\n  var newDoc = DocumentApp.openById(copy.getId());\r\n  var body   = newDoc.getBody();\r\n\r\n  \/\/ 2. \u5728\u526f\u672c\u88e1\u8655\u7406\u6240\u6709\u6bb5\u843d \/ \u6e05\u55ae \/ \u8868\u683c\u4e2d\u7684\u6587\u5b57\r\n  processElement_(body);\r\n\r\n  newDoc.saveAndClose();\r\n\r\n  DocumentApp.getUi().alert(\r\n    '\u5df2\u5efa\u7acb LaTeX \u8f49\u63db\u7248\u6587\u4ef6\uff08\u683c\u5f0f\u53ca\u5716\u7247\u4fdd\u7559\uff09\uff1a\\n' +\r\n    newDoc.getUrl()\r\n  );\r\n}\r\n\r\n\/**\r\n * \u905e\u8ff4\u8d70\u8a2a\u6574\u500b\u6587\u4ef6\u6a39\uff1a\r\n *   - Paragraph \/ ListItem \u2192 \u4ee5\u300c\u6574\u884c\u6587\u5b57\u300d\u70ba\u55ae\u4f4d\u8655\u7406\r\n *   - Table \/ Cell \u2192 \u7e7c\u7e8c\u5f80\u4e0b\u8d70\r\n *\/\r\nfunction processElement_(elem) {\r\n  var ElementType = DocumentApp.ElementType;\r\n  var type = elem.getType &amp;&amp; elem.getType();\r\n\r\n  if (type === ElementType.PARAGRAPH || type === ElementType.LIST_ITEM) {\r\n    var text = elem.editAsText();\r\n    if (text) {\r\n      convertParagraphText_(text);\r\n    }\r\n  }\r\n\r\n  if (elem.getNumChildren) {\r\n    var n = elem.getNumChildren();\r\n    for (var i = 0; i &lt; n; i++) {\r\n      processElement_(elem.getChild(i));\r\n    }\r\n  }\r\n}\r\n\r\n\/**\r\n * \u5c0d\u55ae\u4e00\u6bb5\u843d (editAsText)\uff1a\r\n *   1. \u5148\u8655\u7406\u6574\u6bb5\u88e1\u6240\u6709 $...$\r\n *   2. \u518d\u8655\u7406\u300c\u88f8\u7684\u300d frac{a}{b}\r\n *\/\r\nfunction convertParagraphText_(text) {\r\n  var full = text.getText();\r\n  if (full.indexOf('$') === -1 &amp;&amp; full.indexOf('frac{') === -1) return;\r\n\r\n  \/\/ --- \u627e\u51fa\u6240\u6709 $...$ \u7684\u4f4d\u7f6e\uff08\u7528\u539f\u59cb full \u7d22\u5f15\uff09---\r\n  var dollarMatches = [];\r\n  var re = \/\\$([^$]+)\\$\/g;\r\n  var m;\r\n  while ((m = re.exec(full)) !== null) {\r\n    dollarMatches.push({\r\n      start: m.index,\r\n      end: re.lastIndex - 1,\r\n      inner: m[1]\r\n    });\r\n  }\r\n\r\n  \/\/ \u5f9e\u5f8c\u5f80\u524d\u6539\uff0c\u907f\u514d\u7d22\u5f15\u88ab\u524d\u9762\u7684\u4fee\u6539\u5f71\u97ff\r\n  for (var i = dollarMatches.length - 1; i &gt;= 0; i--) {\r\n    var dm = dollarMatches[i];\r\n    var converted = latexToUnicode_(dm.inner);\r\n    text.deleteText(dm.start, dm.end);\r\n    if (converted.length &gt; 0) {\r\n      text.insertText(dm.start, converted);\r\n    }\r\n  }\r\n\r\n  \/\/ --- \u518d\u8655\u7406\u6c92\u6709 $ \u5305\u8d77\u4f86\u7684 frac{a}{b} ---\r\n  full = text.getText();\r\n  var fracRe = \/frac\\{([^}]+)\\}\\{([^}]+)\\}\/g;\r\n  var fracMatches = [];\r\n  while ((m = fracRe.exec(full)) !== null) {\r\n    fracMatches.push({\r\n      start: m.index,\r\n      end: fracRe.lastIndex - 1,\r\n      num: m[1],\r\n      den: m[2]\r\n    });\r\n  }\r\n\r\n  for (var j = fracMatches.length - 1; j &gt;= 0; j--) {\r\n    var fm = fracMatches[j];\r\n    var rep = '(' + fm.num + '\/' + fm.den + ')';\r\n    text.deleteText(fm.start, fm.end);\r\n    text.insertText(fm.start, rep);\r\n  }\r\n}\r\n\r\n\/**\r\n * \u8655\u7406\u4e00\u5c0f\u6bb5 LaTeX\uff08\u4e0d\u542b\u5916\u5c64 $\uff09\r\n * \u4f8b\u5982\uff1a\"V_E\", \"R_{\\\\text{ref}}\", \"\\\\mu = 3.986 \\\\times 10^{14}\"\r\n *\/\r\nfunction latexToUnicode_(latex) {\r\n  var t = latex;\r\n\r\n  \/\/ 1. \\text{ km } \u2192 km\r\n  t = t.replace(\/\\\\text\\{([^}]*)\\}\/g, '$1');\r\n\r\n  \/\/ 2. \\frac{a}{b} \u2192 (a\/b)\r\n  t = t.replace(\/\\\\frac\\{([^}]+)\\}\\{([^}]+)\\}\/g, function(match, num, den) {\r\n    return '(' + num + '\/' + den + ')';\r\n  });\r\n\r\n  \/\/ 3. LaTeX \u6307\u4ee4 \u2192 \u5c0d\u61c9\u7b26\u865f\uff08\u03bc, \u03c1, \u00d7, \u2248, \u221e...\uff09\r\n  var map = getSymbolMap_();\r\n  t = t.replace(\/\\\\[a-zA-Z]+\/g, function(cmd) {\r\n    return map[cmd] || cmd.slice(1); \/\/ \u672a\u5b9a\u7fa9 \u2192 \u53bb\u6389\u53cd\u659c\u7dda\r\n  });\r\n\r\n  \/\/ 4. _{...} \/ _x \/ ^{...} \/ ^x \u2192 Unicode \u4e0a\u4e0b\u6a19\r\n  return applySubSupUnicode_(t);\r\n}\r\n\r\n\/**\r\n * \u628a _\u3001^ \u8a9e\u6cd5\u8b8a\u6210 Unicode \u4e0a\/\u4e0b\u6a19\u5b57\u5143\r\n *\/\r\nfunction applySubSupUnicode_(str) {\r\n  var result = '';\r\n  var i = 0;\r\n\r\n  while (i &lt; str.length) {\r\n    var ch = str.charAt(i);\r\n\r\n    if ((ch === '_' || ch === '^') &amp;&amp; i + 1 &lt; str.length) {\r\n      var isSub = (ch === '_');\r\n      var next = str.charAt(i + 1);\r\n      var content = '';\r\n      var j;\r\n\r\n      if (next === '{') {\r\n        j = i + 2;\r\n        while (j &lt; str.length &amp;&amp; str.charAt(j) !== '}') {\r\n          content += str.charAt(j);\r\n          j++;\r\n        }\r\n        if (j &lt; str.length &amp;&amp; str.charAt(j) === '}') j++;\r\n      } else {\r\n        content = next;\r\n        j = i + 2;\r\n      }\r\n\r\n      result += mapToSubSup_(content, isSub);\r\n      i = j;\r\n    } else {\r\n      result += ch;\r\n      i++;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n\/**\r\n * \u628a content \u88e1\u6bcf\u500b\u5b57\u5143\u6620\u5c04\u6210\u4e0a\u6a19\/\u4e0b\u6a19\r\n * \u652f\u63f4 a\u2013z \/ A\u2013Z \/ 0\u20139\r\n *\/\r\nfunction mapToSubSup_(content, isSub) {\r\n  \/\/ \u4e0b\u6a19\u5c0d\u7167\u8868\r\n  var subMap = {\r\n    '0':'\u2080','1':'\u2081','2':'\u2082','3':'\u2083','4':'\u2084','5':'\u2085','6':'\u2086','7':'\u2087','8':'\u2088','9':'\u2089',\r\n    'a':'\u2090','b':'\u1d66','c':'\ua700','d':'\ua701','e':'\u2091','f':'\u1d6e','g':'\u1d67','h':'\u2095',\r\n    'i':'\u1d62','j':'\u2c7c','k':'\u2096','l':'\u2097','m':'\u2098','n':'\u2099','o':'\u2092','p':'\u209a',\r\n    'q':'\u146b','r':'\u1d63','s':'\u209b','t':'\u209c','u':'\u1d64','v':'\u1d65','w':'\ud835\udccc','x':'\u2093',\r\n    'y':'\u1d67','z':'\ud835\udccf',\r\n    \/\/ \u5927\u5beb\u4e0b\u6a19\uff08\u7121\u6b63\u5f0f Unicode\uff0c\u4e0b\u5217\u7528\u8fd1\u4f3c\u5b57\u5143\uff09\r\n    'A':'\u2090','B':'\u1d66','C':'\ua700','D':'\u1d6d','E':'\u2091','F':'\ud834\udd91','G':'\u1d4d',\r\n    'H':'\u2095','I':'\u1d62','J':'\u2c7c','K':'\u2096','L':'\u2097','M':'\u2098','N':'\u2099','O':'\u2092',\r\n    'P':'\u209a','Q':'\u146b','R':'\u1d63','S':'\u209b','T':'\u209c','U':'\u1d64','V':'\u1d65',\r\n    'W':'\ud835\udccc','X':'\u2093','Y':'\u1d67','Z':'\ud835\udccf'\r\n  };\r\n\r\n  \/\/ \u4e0a\u6a19\u5c0d\u7167\u8868\r\n  var supMap = {\r\n    '0':'\u2070','1':'\u00b9','2':'\u00b2','3':'\u00b3','4':'\u2074','5':'\u2075','6':'\u2076','7':'\u2077','8':'\u2078','9':'\u2079',\r\n    'a':'\u1d43','b':'\u1d47','c':'\u1d9c','d':'\u1d48','e':'\u1d49','f':'\u1da0','g':'\u1d4d','h':'\u02b0',\r\n    'i':'\u2071','j':'\u02b2','k':'\u1d4f','l':'\u02e1','m':'\u1d50','n':'\u207f','o':'\u1d52','p':'\u1d56',\r\n    'q':'\u146b','r':'\u02b3','s':'\u02e2','t':'\u1d57','u':'\u1d58','v':'\u1d5b','w':'\u02b7','x':'\u02e3',\r\n    'y':'\u02b8','z':'\u1dbb',\r\n    \/\/ \u5927\u5beb\u4e0a\u6a19\r\n    'A':'\u1d2c','B':'\u1d2e','C':'\u1d9c','D':'\u1d30','E':'\u1d31','F':'\u1da0','G':'\u1d33',\r\n    'H':'\u1d34','I':'\u1d35','J':'\u1d36','K':'\u1d37','L':'\u1d38','M':'\u1d39','N':'\u1d3a',\r\n    'O':'\u1d3c','P':'\u1d3e','Q':'\u146b','R':'\u1d3f','S':'\u02e2','T':'\u1d40','U':'\u1d41',\r\n    'V':'\u2c7d','W':'\u1d42','X':'\u02e3','Y':'\u02b8','Z':'\u1dbb'\r\n  };\r\n\r\n  var table = isSub ? subMap : supMap;\r\n  var out = '';\r\n\r\n  for (var i = 0; i &lt; content.length; i++) {\r\n    var c = content.charAt(i);\r\n    out += (table || c);\r\n  }\r\n  return out;\r\n}\r\n\r\n\/**\r\n * LaTeX \u2192 Unicode \u7b26\u865f\u8868\uff08\u53ef\u518d\u64f4\u5145\uff09\r\n *\/\r\nfunction getSymbolMap_() {\r\n  return {\r\n    \/\/ \u5e0c\u81d8\u5b57\u6bcd\r\n    '\\\\mu': '\u03bc',\r\n    '\\\\rho': '\u03c1',\r\n    '\\\\alpha': '\u03b1',\r\n    '\\\\beta': '\u03b2',\r\n    '\\\\gamma': '\u03b3',\r\n    '\\\\delta': '\u03b4',\r\n    '\\\\epsilon': '\u03b5',\r\n    '\\\\varepsilon': '\u03b5',\r\n    '\\\\theta': '\u03b8',\r\n    '\\\\lambda': '\u03bb',\r\n    '\\\\sigma': '\u03c3',\r\n    '\\\\omega': '\u03c9',\r\n    '\\\\Omega': '\u03a9',\r\n\r\n    \/\/ \u5e38\u7528\u6578\u5b78\u7b26\u865f\r\n    '\\\\infty': '\u221e',\r\n    '\\\\times': '\u00d7',\r\n    '\\\\cdot': '\u00b7',\r\n    '\\\\approx': '\u2248',\r\n    '\\\\propto': '\u221d',\r\n    '\\\\leq': '\u2264',\r\n    '\\\\geq': '\u2265',\r\n    '\\\\neq': '\u2260',\r\n    '\\\\gg': '\u226b',\r\n    '\\\\ll': '\u226a',\r\n    '\\\\pm': '\u00b1',\r\n    '\\\\sqrt': '\u221a'\r\n  };\r\n}\r\n<\/pre>\n<p><strong>\u7a0b\u5f0f\u78bc\u5beb\u5728Google\u6587\u4ef6\u7684Apps Script\u88e1\u9762\uff0c\u8ddf\u8457\u4e00\u4efdGoogle\u6587\u4ef6\u8d70\u3002\u6240\u4ee5\u8907\u88fd\u9019\u4efdGoogle\u6587\u4ef6\u5c31\u53ef\u4ee5\u6709\u9019\u500b\u529f\u80fd\uff0c\u4e0d\u7528\u8f38\u5165\u7a0b\u5f0f\u78bc\u3002<br \/>\n\u9019\u662f\u53ef\u4ee5\u8907\u88fd\u53bb\u7528\u7684<a href=\"https:\/\/docs.google.com\/document\/d\/11wJ9kzp4J9uGu0SliirQ3cE_dYNmM13fF5Ek1LMfK9k\/copy\">\u6587\u4ef6\u7bc4\u672c<\/a>\uff0c\u9ede\u9078\u9023\u7d50\u5f8c\uff0c\u7db2\u9801\u756b\u9762\u5c31\u6703\u76f4\u63a5\u8981\u6c42\u4f60\u5efa\u7acb\u4e00\u500b\u526f\u672c\uff0c\u6587\u4ef6\u4e2d\u6709\u4f7f\u7528\u8aaa\u660e\u3002<\/strong><\/p>\n<p>\u9019\u662f\u548cAI\u7684<a href=\"https:\/\/chatgpt.com\/share\/691d0144-6fa8-8009-ad58-9b735abb6a15\">\u5c0d\u8a71\u904e\u7a0b<\/a>\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5982\u679cGemini\u7684Deep Research\u7522\u51fa\u7814\u7a76\u5831\u544a\u88e1\u9762\u6709\u6578\u5b78\u516c\u5f0f\u6216\u4e0a\u4e0b\u6a19\uff0c\u7814\u7a76\u5831\u544a\u532f\u51fa\u6210Google\u6587\u4ef6 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[160,162,161],"tags":[165,164,163,84],"class_list":["post-6703","post","type-post","status-publish","format-standard","hentry","category-ai","category-google-docs","category-161","tag-chatgpt","tag-deep-research","tag-gemini","tag-google-docs"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/posts\/6703","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/comments?post=6703"}],"version-history":[{"count":5,"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/posts\/6703\/revisions"}],"predecessor-version":[{"id":6708,"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/posts\/6703\/revisions\/6708"}],"wp:attachment":[{"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/media?parent=6703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/categories?post=6703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mynotes.org\/tech\/wp-json\/wp\/v2\/tags?post=6703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}