Wie konvertiert man alle Brüche von der Form m/n in die Form \dfrac{m}{n}?

Wie konvertiert man alle Brüche von der Form m/n in die Form \dfrac{m}{n}?

Mein Dokument enthält viele Brüche der Form m/n. Jetzt möchte ich alle Brüche der Form m/n in die Form \dfrac{m}{n} umwandeln.Bildbeschreibung hier eingeben Ich kann keine Möglichkeit zum Konvertieren finden. Der einzige Weg ist per Hand.

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\begin{document}
\[ m/n + p/q = 2/3. \]
I want 
\[\dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3}.\]
\end{document}

Antwort1

Hier ist eine LuaLaTeX-basierte Lösung. Wenn Sie gezwungen sind, pdfLaTeX zu verwenden, haben Sie möglicherweise Pech. Hoffentlich ist die Antwort für andere Leser trotzdem nützlich.

Ein großes Problem bei der Infix-Bruchnotation, wie a/bund 1/2, besteht darin, dass bis TeX die Anwesenheit eines /Symbols im Eingabestrom bemerkt, das Material, das den Zähler bilden soll, bereits verschwunden ist; das Zurückspulen, um den Zähler wiederherzustellen, wäre sehr mühsam (oder vielleicht sogar unmöglich). Ein präprozessorbasierter Ansatz scheint vielversprechender. Glücklicherweise stellt LuaTeX den process_input_bufferCallback bereit, der sich sehr gut für die Vorverarbeitung eignet.

Der folgende Beispielcode stellt eine Lua-Funktion bereit, die die Konvertierung von Infix in Dfrac durchführt. Die einzige syntaktische Anforderung besteht darin, dass die Zeichen im Zähler und Nenner ausschließlich aus alphabetischen Zeichen und arabischen Ziffern bestehen. (Keine Klammern zulässig) Leerzeichen unmittelbar links oder rechts vom /(Schrägstrich)-Symbol sind zulässig.

Angesichts des Ersatzes von /durch \dfracsollte diese Lua-Funktionniemalskann nicht mit Material im Inline-Mathematikmodus ausgeführt werden, ganz zu schweigen von Material im Textmodus, da es sonst mit irgendwelchen /Zeichen Chaos anrichtet. Der Code stellt daher auch zwei LaTeX-Makros -- \ReplaceOnund \ReplaceOff-- bereit, die die Lua-Funktion aktivieren und deaktivieren. Ich schlage vor, dass Sie am Anfang jeder Gruppe von Gleichungen, die Infix-Brüche enthalten, eine Direktive einfügen und am Ende jeder solchen Gruppe \ReplaceOneine Direktive.\ReplaceOff

Bildbeschreibung hier eingeben

% !TEX TS-program = lualatex
\documentclass{article}

%% Lua-side code
\usepackage{luacode}
\begin{luacode*}
function sltodf ( s ) -- "slash to dfrac"
  return ( string.gsub ( s , "(%w+)%s-/%s-(%w+)" , "\\dfrac{%1}{%2}" ) )
end
\end{luacode*}
%% TeX-side code
\newcommand\ReplaceOn{\directlua{luatexbase.add_to_callback (
    "process_input_buffer", sltodf, "sltodf" )}}
\newcommand\ReplaceOff{\directlua{luatexbase.remove_from_callback (
    "process_input_buffer", "sltodf" )}}

\usepackage{amsmath} % for '\dfrac' macro

\begin{document}
\ReplaceOn
\[ m /n + pq / rs = 1 / 2 - 21/ 32 . \]  % lots of whitespace

\[m/n+pq/rs=1/2-21/32.\] % no whitespace at all

\[ 2a /3b + pq/rs = a / 5 - 61c/41d . \] % mixtures of letters and numerals

\ReplaceOff  % no more infix to frac processing

\[ m /n + pq/rs = 1 / 2 - 21/32 . \]
\end{document}


Nachtrag: Um den Umfang der Lua-Funktion automatisch auf das gesamte Dokument auszudehnen, müssen einige Tests durchgeführt werden, um zu prüfen, ob wir uns in einer Display-Math-Umgebung befinden, und die Infix-zu-Frac-Konvertierung nur dann durchzuführen, wenn dies der Fall ist. Wie das geht, wird im folgenden Beispiel gezeigt. Sechs Display-Math-Umgebungen werden automatisch erkannt (zusätzlich zu den „grundlegenden LaTeX“- \[und \]-Befehlen): equation, align, alignat, flalign, , gather, und multline. Sowohl die „mit Sternchen markierten“ als auch die „normalen“ Varianten dieser Umgebungen werden verarbeitet.

Die Anforderungen an die Eingabesyntax sind relativ gering. Ausdrücke mit \[ ... \]sind zulässig, ebenso wie alle Anzeigemathematikumgebungen, bei denen die öffnenden und schließenden Anweisungen, wie beispielsweise \begin{equation}oder \end{align}, in eigenen Zeilen stehen.

Der folgende Code stellt auch die Makros \ReplaceOffund bereit \ReplaceOn, da es erforderlich sein kann, die Ausführung der Lua-Funktion „von Hand“ anzuhalten, beispielsweise im Fall eines verbatim-ähnlichen Materials, das Displaymath-Code enthält.

Bildbeschreibung hier eingeben

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath} % for various displayed-equation environments

%% Lua-side code
\usepackage{luacode}
\begin{luacode*}
in_dispmath = false  -- set up a Boolean variable
function sltofr ( s ) -- "slash to frac" 
   -- if we find a '\[ ... \]' line, perform infix fraction replacements
   if string.find ( s , "\\%[.*\\%]" ) then
      return ( string.gsub ( s , "(%w+)%s-/%s-(%w+)" , "\\frac{%1}{%2}" ) )

   -- switch 'in_dispmath' to 'true' if at start of a displaymath env.
   elseif string.find ( s , "\\begin{equation%*?}" ) or
          string.find ( s , "\\begin{align%*?}" ) or
          string.find ( s , "\\begin{alignat%*?}" ) or
          string.find ( s , "\\begin{flalign%*?}" ) or
          string.find ( s , "\\begin{gather%*?}" ) or
          string.find ( s , "\\begin{multline%*?}" ) or
          string.find ( s , "\\%[" ) then
      in_dispmath = true

   -- switch 'in_dispmath' back to 'false' if at end of a displaymath env.
   elseif string.find ( s , "\\end{equation%*?}" ) or
          string.find ( s , "\\end{align%*?}" ) or
          string.find ( s , "\\end{alignat%*?}" ) or
          string.find ( s , "\\end{flalign%*?}" ) or
          string.find ( s , "\\end{gather%*?}" ) or
          string.find ( s , "\\end{multline%*?}" ) or
          string.find ( s , "\\%]" ) then
      in_dispmath = false

   -- if in displaymath mode, replace infix fractions with \frac expressions
   elseif in_dispmath == true then
      return ( string.gsub ( s , "(%w+)%s-/%s-(%w+)" , "\\frac{%1}{%2}" ) )
   end
end
\end{luacode*}

%% TeX-side code
% Assign the Lua function to the 'process_input_buffer' callback 
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
    "process_input_buffer", sltofr, "sltofr" )}}

% Macros to enable and disable the Lua function "by hand";
% this may be needed if the document contains verbatim sections
%   that feature displaymath-mode code
\newcommand\ReplaceOn{\directlua{luatexbase.add_to_callback (
    "process_input_buffer", sltofr, "sltofr" )}}
\newcommand\ReplaceOff{\directlua{luatexbase.remove_from_callback (
    "process_input_buffer", "sltofr" )}}

\begin{document}
\[ 2m /3n + pq / rs = 1 / 2 - 33/ 55 . \]

\[
2m/3n+pq/rs=1/2-33/55.
\] 

\[1/2+1/2=1\]\[1/3+1/3+1/3=1\]
\begin{align*} 
1/2+1/2         &=1\\ 
1/3+1/3 + 1 / 3 &= 1
\end{align*}

When not in display math mode, no processing: ``and/or'', $a/b$, $1/2$

\ReplaceOff  % get ready for some verbatim material
\begin{verbatim}
\begin{align*} 
1/2+1/2         &=1\\ 
1/3+1/3 + 1 / 3 &= 1
\end{align*}
\end{verbatim}

\ReplaceOn % back to 'normal' (replacement) mode
\begin{align*} 
1/2+1/2         &=1\\ 
1/3+1/3 + 1 / 3 &= 1
\end{align*}
\end{document}

Antwort2

Wenn die bereitgestellte Datei alsf.tex

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\begin{document}
\[ m/n + p/q = 2/3 . \]
I want 
\[\dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3}.\]
\end{document}

Dann

sed -e "s@ \([a-zA-Z0-9]\+\)/\([a-zA-Z0-9]\+\) @ \\\\dfrac{\\1}{\\2} @g"  f1.tex  > f2.tex 

wird herstellen

 \documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\begin{document}
\[ \dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3} . \]
I want 
\[\dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3}.\]
\end{document}

sedist standardmäßig in Unix-ähnlichen Systemen (Linux, macOS, Cygwin …) verfügbar und an vielen Stellen für Windows erhältlich.

Das gleiche Ersetzen durch reguläre Ausdrücke könnte auch in jedem Texteditor durchgeführt werden, wenn die Befehlszeilen-Funktion sed nicht gewünscht ist.

verwandte Informationen