Re: off-topic (?) Javascript um Latex Dokumente zu de-macro-en
"Albrecht Backhaus" (via tex-d-l Mailing List) <[email protected]>
| Newsgroups | gmane.comp.tex.german |
|---|---|
| Message-ID | <[email protected]> |
------------------------------------------------------------------------ *Von:/From:* Uwe Brauer <[email protected]> *Gesendet:/Sent:* Sonntag, 19.11.2023 - 08:55 *An:/To:* <[email protected]> *Betreff:/Subject:* Re: off-topic (?) Javascript um Latex Dokumente zu de-macro-en >> de-macro-en >> Eigentlich macht ein solches Script ja nichts anderes als "Suchen und >> Ersetzen". Das ist eine Funktionalität die ein guter Editor >> vollständig (auch mit regex-Unterstützung) und über alle Dateien eines >> tex-Projektes hinweg standardmässig beherrschen sollte. >> Wofür bräuchte man dann so ein Script ? > Also ich benutze GNU emacs, den wahrscheinlich leistungsfähgigen Editor > (bitte keine eigene Diskussion), da er es einfach macht, elisp > Erweiterungen zu schreiben > > Klar kann ich einfache Ersetzungen zb \al --> \alpha selbst vornehmen. > > Ich habe sogar ein Lisp Kommando geschrieben, daß > > $$ > \int f dx=0 > $$ > zu > \begin{equation} > \label{eq:1} > \int > \end{equation} > konvertiert > (Die label Ergänzung, hat allerdings ein anderer Benutzer hinzugefügt) > > Schon schwieriger wird es bei Macros mit Argumenten. > > Aber vielleicht hilft ein kleines Beispiel weiter, um das Problem zu > verdeutlichen. Und das ist wirklich eher kleiner, meistens haben solche > Arbeiten die doppelte oder dreifache Anzahl von Macros > > --8<---------------cut here---------------start------------->8--- > > \newcommand{\eqdef}{\overset{\mbox{\tiny{def}}}{=}} > \newcommand{\gzerozeronorm}[1]{\underline{S}_{g_{00}+1;#1}} > \newcommand{\gzerostarnorm}[1]{\underline{S}_{g_{0*};#1}} > \newcommand{\hstarstarnorm}[1]{\underline{S}_{h_{**};#1}} > \newcommand{\gnorm}[1]{\underline{S}_{g;#1}} > \newcommand{\fluidnorm}[1]{\underline{S}_{\partial \Phi;#1}} > \newcommand{\totalnorm}[1]{\underline{\mathbf{S}}_{#1}} > \newcommand{\supgzerozeronorm}[1]{S_{g_{00}+1;#1}} > \newcommand{\supgzerostarnorm}[1]{S_{g_{0*};#1}} > \newcommand{\suphstarstarnorm}[1]{S_{h_{**};#1}} > \newcommand{\supgnorm}[1]{S_{g;#1}} > \newcommand{\supfluidnorm}[1]{S_{\partial \Phi;#1}} > \newcommand{\suptotalnorm}[1]{\mathbf{S}_{#1}} > \newcommand{\gzerozeroenergy}[1]{\underline{E}_{g_{00}+1;#1}} > \newcommand{\gzerostarenergy}[1]{\underline{E}_{g_{0*};#1}} > \newcommand{\hstarstarenergy}[1]{\underline{E}_{h_{**};#1}} > \newcommand{\genergy}[1]{\underline{E}_{g;#1}} > \newcommand{\fluidenergy}[1]{\underline{E}_{\partial \Phi;#1}} > \newcommand{\totalenergy}[1]{\underline{\mathbf{E}}_{#1}} > \newcommand{\supgzerozeroenergy}[1]{E_{g_{00}+1;#1}} > \newcommand{\supgzerostarenergy}[1]{E_{g_{0*};#1}} > \newcommand{\suphstarstarenergy}[1]{E_{h_{**};#1}} > \newcommand{\supgenergy}[1]{E_{g;#1}} > \newcommand{\supfluidenergy}[1]{E_{\partial \Phi;#1}} > \newcommand{\suptotalenergy}[1]{\mathbf{E}_{#1}} > \newcommand{\Vb}{\bar{\mathbf{V}}} > \newcommand{\Ent}{\eta} > \newcommand{\speed}{c_s} > \newcommand{\bard}{\bar{\partial}} > \newcommand{\ginfty}[2]{{^{(\infty)}g^{#1 #2}}} > \newcommand{\decayparameter}{\varkappa} > --8<---------------cut here---------------end--------------->8--- > > So dieses Script, konvertiert ohne weiter Konfiguration alle diese > Macros in praktisch Null-Komma-Nix. > > > Mich würde schon interessieren, wie das genauso schnell und komfortable > in einem Editor gehen soll. > > Gruß > > Uwe Brauer > Ich benutze von Zeit zu Zeit den EmEditor. Der kann Suchen & Ersetzen im Batch-Verfahren. Man kann z.B. eine tsv-Datei einlesen, die pro Zeile einen Suchbegriff und den dazugehörende Ersetzungsbegriff enthält und so auch eine grosse Anzahl von Ersetzungen in einem Rutsch durchführen. Ansonsten kannst Du einfach die nachfolgende lokale html-Datei auf Deinem Rechner speichern und mit dem Browser aufrufen. Das ist die gleiche Funktionalität wie von https://jsfiddle.net/zoho/ed84y/. Ob das Script letztendlich stimmt und alles tut was Du möchtest - keine Ahnung ... ---------- start index.html ------------- <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="Expand Macros"> <meta name="author" content="diverse"> <title>Expand Macxros</title> <style> html, body { height: 90%; } button { display: block; } textarea { float: left; width: 48%; height: 80%; } </style> </head> <body> <button id="run">Expand Macros</button> <textarea id="input"> \documentclass{amsart} \usepackage{amsmath,amssymb} \newcommand{\N}{\mathbb{N}} \DeclareMathOperator{\End}{End} \begin{document} In this lecture we'll study the ring of Endomorphisms of an Abelian group $A$. Let's denote this ring by $\End(A)$. Throughout the lecture, $\N$ will denote the set of natural numbers. \end{document} </textarea> <textarea id="output">Output</textarea> <script> function expandMacros(tex) { function nestBrackets(level) { var level = level || 5, re = c = "(?:[^\\r\\n\\{\\}]|\\\\[\\{\\}]|\\r?\\n(?!\\r?\\n))*?"; while (level--) re = c + "(?:\\{" + re + "\}" + c + ")*?"; return " *(\\{" + re + "\\}|[^\\{])"; } function getRegExp(name, macro) { var num = macro.num, def = macro.def, re = ""; while (num--) re += nestBrackets(); re = "\\" + name + "(?![a-zA-Z\\}])" + re; return new RegExp(re, "g"); } function trimString(s) { return s.replace(/^ +| +$/g, '').replace(/^\{|\}$/g, ""); } function extractMacros() { var cs = "\\\\\\w+", re; // \def, \gdef, \edef and \xdef re = new RegExp("\\\\[gex]?def\\*? *(" + cs + ") *(#\\d)*" + nestBrackets(), "g"); tex = tex.replace(re, function(match){ var m = arguments; var macro = { num: m[2] ? Math.min(m[2].length / 2, 9) : 0, def: trimString(m[3]) }; macros[trimString(m[1])] = macro; return ""; }); // \newcommand, \newcommand*, \renewcommand and \renewcommand* re = new RegExp("\\\\(?:re)?newcommand\\*? *(" + cs + "|\\{" + cs + "\}) *(\\[(\\d)\\])?" + nestBrackets(), "g"); tex = tex.replace(re, function(match){ var m = arguments; var macro = { num: m[3] || 0, def: trimString(m[4]) }; macros[trimString(m[1])] = macro; return ""; }); // \DeclareMathOperator and \DeclareMathOperator* inside amsmath re = new RegExp("\\\\DeclareMathOperator(\\*?) *(" + cs + "|\\{" + cs + "\}) *" + nestBrackets(), "g"); tex = tex.replace(re, function(match){ var m = arguments; var macro = { num: 0, def: "\\operatorname" + m[1] + "{" + trimString(m[3]) + "}" }; macros[trimString(m[2])] = macro; return ""; }); } function replaceMacros() { var i = 0, m, re, num; for (name in macros) { m = macros[name]; re = getRegExp(name, m), num = m.num; //console.log(re); tex = tex.replace(re, function(match){ //console.log(arguments); var args = [], result = m.def, k; for (k = 1; k <= num; k++) { args[k] = trimString(arguments[k]); } //console.log(args); for (k = 1; k <= num; k++) { result = result.replace(new RegExp("#" + k, "g"), args[k]); } return result; }); } } var macros = {}; extractMacros(); replaceMacros(); return tex; } document.getElementById("run").onclick = function() { var input = document.getElementById("input"), output = document.getElementById("output"); output.value = expandMacros(input.value); } </script> </body> </html> ---------- ende index.html ------------- Gruss, Albrecht -- FAQ: http://texfragen.de/ Durchsuchbares Archiv: https://www.listserv.dfn.de/sympa/arc/tex-d-l Unsubscribe/Verwaltung: https://www.listserv.dfn.de/sympa/info/tex-d-l