我想知道是什么阻碍了 MarkDown 系统的实施在(La)TeX?我知道 pandoc 会将 MarkDown 转换为 LaTeX,并增加一些功能。我也知道很多人对 LaTeX 的现状很满意,所以请不要觉得被冒犯了。
我特别想知道为什么像->
或 这样的东西=>
不能转换为\rightarrow
或\Rightarrow
以及类似的转换以及常见的 MarkDown 功能。毕竟在我看来,(La)Tex 毕竟是一种标记纯文本的方法,可以整齐地呈现给打印设备。我也知道有 LyX 和 TeXmacs,但它们已经保留了 tex 的纯文本方法。
我特别好奇如果和为什么无法在 LaTeX 中直接实现 MarkDown 功能,毕竟 TeX 是图灵完备的,不是吗?它是否以某种我没看到的方式破坏了现有系统?
有很多东西可以让文字书写更加令人愉快的在眼睛上。例如,写出这样的定理:
THEOREM: ...
PROOF: ...
Next paragraph continues after two new lines...
对于定义词条,情况也类似,您可以随意命名。再次请不要误会我的意思。(La)TeX 中有大量有用的命令。目前,(La)TeX 已经执行了其中一些转换。例如,将 --- 变成破折号或将空行视为两个段落的分隔。而且现代 (La)TeX 可以处理 unicode,因此不一定需要对希腊字母进行 ASCII 化。人们总是希望用 (La)TeX 做更多晦涩难懂的事情,但是什么阻止了系统整合这样的功能?还是我完全错过了什么,而这已经是可能的了?
答案1
LaTeX 之所以是这个 LaTeX,是因为历史原因。它并不完美。它可以支持一些 MarkDown 功能。例如,有一个 LaTeX 包wiki
,支持如下文档:
\documentclass{article}
\usepackage{wiki}
\begin{document}
\wikimarkup
==section title==
A numbered list:
# foo
# bar
# baz
===subsection title===
''important'' thing
\end{document}
另一个很好的例子是listings
包。它逐字读取输入,识别关键字,并做出正确的输出。listings
是为具有语法高亮的排版编程语言设计的。但是,同样的方法可以用于您的请求。因此,这显示了您请求的另一个示例:
\documentclass{article}
\usepackage{listings}
\lstset{literate={->}{$\rightarrow$}1 {=>}{$\Rightarrow$}1}
\begin{document}
\begin{lstlisting}
a -> b, A => B
\end{lstlisting}
\end{document}
但请记住,TeX 的核心语言不是为这种标记文本设计的。我们必须使用一些奇怪的技巧来实现 TeX 中的功能。
与大多数现代编程语言不同,TeX 使用类别代码为特殊目的而编写。如果 TeX 使用通用的词法分析,定义 markdown 系统会更容易。在 TeX 中,定义命令\THEOREM
或\PROOF
排版定理很容易。但支持类似这样的语法需要付出更多努力(尽管可能)。
THEOREM: foo
PROOF: baz
我们可以问为什么Knuth 选择这种宏语法。我认为使用标记语言语法,如 troff、SGML 和 RTF 是很自然的。而且很显然,一个纯粹的 markdown 系统(如没有 HTML 的 stackexchange)对于复杂的样式来说不够强大。所以早期的 TeX(Knuth 的个人工具)不需要支持 Markdown 语法,因此基于类别代码和宏的设计是可以的。很多人抱怨这件事,我对此没有什么好主意。
事情正在发生变化,LaTeX 现在变得更容易使用了。对于数学符号,我们可以使用unicode-math
包来编写如下数学等式:
$ ∑A_n → ±∞ $
答案2
你可能会发现这很有趣(尽管它适用于 ConTeXt,而不是 LaTeX):
答案3
这是在 ConTeXt MkIV 中有效的概念验证解决方案。
\defineenumeration[THEOREM][text={Theorem },style=italic]
\usemodule[translate]
\translateinput[THEOREM:][\THEOREM]
\translateinput[->][\rightarrow]
\enableinputtranslation
\starttext
THEOREM: Let $f : X -> Y$ be a continuous function ...
Paragram after the theorem.
\stoptext
这给出了预期的输出。使用 LuaTeX 可以在将输入输入 TeX 之前对其进行解析,如果您愿意,您可以在 lua 中编写一个 markdown 解析器。我记得 John MacFarlane 已经为 Markdown 编写了一个基于 LPEG 的解析器,因此将它与 LuaTeX 结合起来应该相对容易。
答案4
这并不是对你问题的真正回答,但我很久以前就有一个相关的想法:你想要的一些替换可以由编辑器完成。我曾经为 LaTeX 编写了一个编辑器,其中有一个替换表,这样你就可以得到以下效果。如果你输入->
,那么它会自动转换为→
,但保存为。当从文件中读取(或输入)时,你会再次在编辑器中看到\to
。对于、、等等也是如此。\to
→
∑
\sum
±
\pm
∞
\infty
主要优点:在编辑器中看起来不错,文件是纯 ASCII 文本。但是,我不知道哪些编辑器支持此功能。
您的 也有可能实现类似的事情THEOREM: ... PROOF:
,但是实现起来不那么简单。