我正在尝试寻找一个工具将 TeX 转换为如下所示的内容:
{\frac{-x}{y}}
到
((-x)/(y))
或者
{\frac{1}{x\ln(b)}}
到
((1)/(xln(b)))
我为它构建了一个非常简单的转换器,但它在某些特殊情况下遇到了麻烦,我想知道是否有任何工具可以做到这一点。
答案1
如果您可以自由使用 LuaLaTeX,以下解决方案可能会让您感兴趣。它设置了一个名为的 LaTeX 宏,\TexToText
该宏调用一个名为的 Lua 函数tex2text
来完成大部分工作。执行四个单独的步骤tex2text
:
- 将符号转换
\frac
为内联数学符号 - 数学“栅栏”符号的下拉尺寸说明
- 删除
\
其他 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}