
Meu documento tem muitas frações do formato m/n
. Agora quero converter todas as frações da forma m/n para a forma \dfrac{m}{n}.
Não consigo encontrar uma maneira de converter. A maneira única é manualmente.
\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}
Responder1
Aqui está uma solução baseada em LuaLaTeX. Se você for forçado a usar o pdfLaTeX, poderá estar sem sorte. Esperançosamente, porém, a resposta ainda será útil para outros leitores.
Um grande problema com a notação de fração infixa, como a/b
e 1/2
, é que no momento em que o TeX tem a chance de notar a presença de um /
símbolo no fluxo de entrada, o material que deveria formar o numerador já desapareceu; retroceder para recuperar o numerador seria muito tedioso (ou talvez até impossível). Uma abordagem baseada em pré-processador parece mais promissora. Felizmente, LuaTeX fornece process_input_buffer
retorno de chamada, que é muito adequado para pré-processamento.
O código de exemplo a seguir fornece uma função Lua que executa a conversão de infixo em dfrac. O único requisito sintático é que os caracteres do numerador e dos denominadores consistam apenas em caracteres alfabéticos e algarismos arábicos. (Não são permitidos parênteses) Espaços em branco imediatamente à esquerda ou à direita do /
símbolo (barra) são permitidos.
Dada a substituição de /
with \dfrac
, esta função Lua devenuncaser executado em material de modo matemático embutido, sem falar em material de modo texto, para que não cause estragos em nenhum /
personagem. O código, portanto, também fornece duas macros LaTeX - \ReplaceOn
e \ReplaceOff
- que ativam e desativam a função Lua. Sugiro que você insira uma \ReplaceOn
diretiva no início de cada grupo de equações que contenha frações infixas e uma \ReplaceOff
diretiva no final de cada grupo.
% !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}
Termo aditivo: Para estender o escopo da função Lua para todo o documento automaticamente, é necessário realizar alguns testes para verificar se estamos em um ambiente display-math, e realizar a conversão infix-to-frac somente se for o caso. Como fazer isso é mostrado no exemplo a seguir. Seis ambientes matemáticos de exibição são reconhecidos automaticamente (além do "LaTeX básico" \[
e \]
dos comandos): equation
, align
, alignat
, flalign
, gather
, e multline
. Ambas as variantes "com estrela" e "regular" desses ambientes são tratadas.
Os requisitos relativos à sintaxe de entrada são bastante moderados. Expressões com \[ ... \]
são permitidas, assim como todos os ambientes matemáticos de exibição nos quais as instruções de abertura e fechamento, como \begin{equation}
ou \end{align}
, estão sozinhas em linhas.
O código abaixo também fornece as macros \ReplaceOff
e \ReplaceOn
, pois pode ser necessário suspender a operação da função Lua "manualmente", digamos, no caso de um verbatim
material semelhante a -que contém código 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}
Responder2
Se o arquivo fornecido for salvo comof.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}
então
sed -e "s@ \([a-zA-Z0-9]\+\)/\([a-zA-Z0-9]\+\) @ \\\\dfrac{\\1}{\\2} @g" f1.tex > f2.tex
vai produzir
\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
está disponível por padrão em sistemas do tipo Unix (Linux, Macos, cygwin...) e disponível em vários lugares para Windows.
A mesma substituição de expressão regular também pode ser feita em qualquer editor de texto se a linha de comando sed não for desejada.