是否可以让 LaTeX 或者类似的软件解释a/b
为\frac{a}{b}
?
写出来(x+1)/((x)(x+2))
似乎比写下来容易得多\frac{x+1}{(x)(x+2)}
。
答案1
LaTeX 是 TeX 的格式之一。TeX 有\over
原语。用法是$numerator\over denominator$
或$...{numerator\over denominator}...$
。LaTeX 宏\frac
定义(粗略地说)为\over
原语:\def\frac#1#2{{#1\over#2}}
。
LaTeX 不隐藏 TeX 基元,因此你可以编写:
Writing out $x+1\over(x)(x+2)$ seems much easier than writing $\frac{x+1}{(x)(x+2)}$.
您可以将/
字符设置为“数学活动字符”并写入:
{\catcode`/=13 \global\let /=\over}
\mathcode`/="8000
Writing out $x+1/(x)(x+2)$ seems much easier than writing $\frac{x+1}{(x)(x+2)}$.
当然,如果分数的范围小于整数公式,则必须使用{}
来给出这个范围,例如${a/b}=c$
,如Don Hosek的评论中所提到的。
答案2
很难解决使用文本替换的方法所带来的所有极端情况。一般来说,解析此类结构需要有限状态机才能正确呈现,例如
f(x)/g(x)
你描述的语法让我想起了数学,一种仅使用很少特殊符号来编写数学公式的语言。我不知道 LaTeX 中是否有 AsciiMath 的实现,但 ConTeXt 中有一个。这可能更接近您要寻找的。但是,我想引用此代码的实现者 Hans Hagen 在 TUG 2015 上的演讲(根据记忆)
“编写 AsciiMath 很有趣。你永远不知道会得到什么结果。”
\usemodule[asciimath]
\unexpanded\def\stopasciimath{\stopasciimath}
\unexpanded\def\startasciimath#1\stopasciimath{%
\startformula
\asciimath{#1}%
\stopformula
}
\starttext
\startasciimath
a/b * alpha/omega * f(x)/g(x) * (x+1)/(a*(b+c))
\stopasciimath
\stoptext
实际上,您可以在 LaTeX 中使用 ConTeXt 的 AsciiMath,而且只需付出很少的努力(但可能有限制)。
\documentclass{article}
\usepackage{amsmath}
\usepackage{unicode-math} % you have to use this for AsciiMath
\usepackage{environ}
\usepackage{luacode}
\begin{luacode*}
xml = xml or {}
lxml = lxml or {}
moduledata = moduledata or {}
statistics = statistics or { register = function() end }
require("x-asciimath")
function asciimath(str)
local texmath = moduledata.asciimath.convert(str)
assert(texmath) -- sledgehammer error handling
tex.sprint(texmath)
end
\end{luacode*}
% Some aliases from ConTeXt
\let\lparent(
\let\rparent)
\protected\def\doasciimath#1{%
%\enableautofences % No straightforward LaTeX equivalent
\mathdelimitersmode="16 % Some magic number from ConTeXt
\directlua{asciimath("\luaescapestring{\detokenize\expandafter{\expanded{#1}}}")}%
}
\NewEnviron{asciimath}{%
\begin{math}%
\doasciimath{\BODY}%
\end{math}%
}
\NewEnviron{asciidisplaymath}{%
\begin{displaymath}%
\doasciimath{\BODY}%
\end{displaymath}%
}
\begin{document}
\begin{asciimath}
a/b * alpha/omega * f(x)/g(x) * (x+1)/(a*(b+c))
\end{asciimath}
\begin{asciidisplaymath}
a/b * alpha/omega * f(x)/g(x) * (x+1)/(a*(b+c))
\end{asciidisplaymath}
\end{document}