Как преобразовать все дроби из вида m/n в вид\dfrac{m}{n}?

Как преобразовать все дроби из вида m/n в вид\dfrac{m}{n}?

В моем документе много дробей вида m/n. Теперь я хочу преобразовать все дроби из вида m/n в вид \dfrac{m}{n}.введите описание изображения здесь Я не могу найти способ конвертации. Единственный способ — вручную.

\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}

решение1

Вот решение на основе LuaLaTeX. Если вы вынуждены использовать pdfLaTeX, вам может не повезти. Надеюсь, что ответ все равно будет полезен другим читателям.

Основная проблема с инфиксной дробной записью, такой как a/bи 1/2, заключается в том, что к тому времени, когда TeX успевает заметить наличие символа /во входном потоке, материал, который должен был сформировать числитель, уже исчез; возврат на шаг назад для восстановления числителя был бы очень утомительным (или, возможно, даже невозможным). Подход на основе препроцессора кажется более многообещающим. К счастью, LuaTeX предоставляет process_input_bufferобратный вызов, который очень подходит для предварительной обработки.

Следующий пример кода предоставляет функцию Lua, которая выполняет преобразование infix-to-dfrac. Единственное синтаксическое требование заключается в том, что символы в числителе и знаменателе должны состоять исключительно из букв и арабских цифр. (Скобки не допускаются) Пробелы непосредственно слева или справа от символа /(косая черта) разрешены.

Учитывая замену на /, \dfracэта функция Lua должнаникогдабыть запущен на материале режима inline-math, не говоря уже о материале текстового режима, чтобы он не испортил какие-либо /символы. Поэтому код также предоставляет два макроса LaTeX -- \ReplaceOnи \ReplaceOff--, которые активируют и деактивируют функцию Lua. Я предлагаю вам вставить \ReplaceOnдирективу в начале каждой группы уравнений, содержащих инфиксные дроби, и \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}


Приложение: Чтобы автоматически расширить область действия функции Lua на весь документ, необходимо выполнить некоторые тесты, чтобы проверить, находимся ли мы в среде display-math, и выполнить преобразование infix-to-frac только в этом случае. Как это сделать, показано в следующем примере. Шесть сред display math распознаются автоматически (в дополнение к "базовым LaTeX" \[и \]командам): equation, align, alignat, flalign, gather, и multline. Обрабатываются как "звездчатые", так и "обычные" варианты этих сред.

Требования к синтаксису ввода довольно мягкие. Выражения с \[ ... \]допустимы, как и все среды отображения математики, в которых открывающие и закрывающие операторы, такие как \begin{equation}или \end{align}, находятся на отдельных строках.

В приведенном ниже коде также представлены макросы \ReplaceOffи \ReplaceOn, поскольку может возникнуть необходимость приостановить работу функции Lua «вручную», например, в случае verbatimматериала, подобного , содержащего код displaymath.

введите описание изображения здесь

% !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}

решение2

Если предоставленный файл сохранен какf.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}

затем

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

будет производить

 \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доступен по умолчанию в unix-подобных системах (linux, macos, cygwin...) и во многих местах для Windows.

Такую же замену регулярного выражения можно выполнить в любом текстовом редакторе, если командная строка sed не нужна.

Связанный контент