
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.
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/b
und 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_buffer
Callback 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 \dfrac
sollte 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 -- \ReplaceOn
und \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 \ReplaceOn
eine Direktive.\ReplaceOff
% !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 \ReplaceOff
und 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.
% !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}
sed
ist 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.