Преобразование TeX в текстовый формат?
Sep 30 2020
Я пытаюсь найти инструмент для преобразования TeX во что-то вроде следующего:
{\frac{-x}{y}}
к
((-x)/(y))
или же
{\frac{1}{x\ln(b)}}
к
((1)/(xln(b)))
Я построил для него очень простой конвертер, но у него есть проблемы с некоторыми крайними случаями, и мне было интересно, есть ли какие-нибудь инструменты, которые уже сделали это.
Ответы
3 Mico Sep 30 2020 at 16:25
Если вы можете свободно использовать LuaLaTeX, вам может быть интересно следующее решение. Он устанавливает вызываемый макрос LaTeX, \TexToTextкоторый вызывает функцию Lua, вызываемую tex2textдля выполнения большей части работы. Четыре отдельных шага выполняются tex2text:
- преобразовать
\fracнотацию в нотацию inline-math - инструкции по выбору размеров для математических символов "ограды"
- удалите
\символ (обратная косая черта) перед другими именами макросов TeX (например,\expи\ln) - заключите последнее выражение в круглые скобки.
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % for 'luacode' env. and '\luastringN' macro
\begin{luacode}
-- Aux. function to trim first and last char. of a string:
function trim ( s )
return s:sub(2,-2)
end
-- Aux. function to get rid of \frac wrapper
function frac2text ( s )
s = s:gsub ( "\\frac%s-(%b{})%s-(%b{})",
function (u,v)
return "("..trim(u)..")/("..trim(v)..")"
end )
return s
end
-- The main Lua function:
function tex2text ( s )
-- Call frac2text function:
s = frac2text ( s )
-- Drop fence-sizing macros:
s = s:gsub ( "\\left" , "" )
s = s:gsub ( "\\right" , "" )
s = s:gsub ( "\\[Bb]igg?[lmr]?" , "" )
-- Remove leading backslash char from all other macros:
s = s:gsub ( "\\(%a+)" , "%1\\ignorespacesafterend" )
-- Encase the result in a pair of parentheses:
return "(" .. s .. ")"
end
\end{luacode}
\newcommand\TexToText[1]{\directlua{tex.sprint(tex2text(\luastringN{#1}))}}
\begin{document}
\TexToText{\ln(\exp(0))} \quad
\TexToText{\frac{-x}{y}} \quad
\TexToText{\frac{1}{x\ln(b)}}
\end{document}