以编程方式将纯文本转换为乳胶代码

时间:2009-11-08 16:10:03

标签: cocoa latex

我想要一些用户输入文本并快速解析它以生成一些乳胶代码。目前,我正在将%替换为\%,将\n替换为\n\n,但我想知道是否还有其他替换要进行转换从纯文本到乳胶。

我不担心这里的安全性(你甚至可以编写恶意乳胶代码吗?),因为这只应该被用户用来将他们自己的文本转换成乳胶,因此他们应该被允许使用他们的在预转换的文本中拥有乳胶标记,但我想确保输出不包括偶然的乳胶命令(如果可能)。如果有一个很好的库来进行这样的转换,我会看看。

4 个答案:

答案 0 :(得分:6)

显然,following characters

\ { } $ ^ _ % ~ # &

在LaTeX中是特殊的,所以你应该确保将它们转义(前缀为反斜杠会对其中一些做,对于特殊情况请参见Thomas' answer)或告诉用户不要使用它们,除非他们故意想要使用LaTeX命令(或两者的混合,具体取决于字符)。

一些额外的陷阱:

  • 并非文本中的每个换行符都可以用作新段落。
  • 如果您的用户使用的语言不是英语(或拉丁语),则需要\ usepackage处理编码的内容(如utf8)或自行转换字符(例如ä -> \"a)。
  • dmckee所述,报价也需要单独处理。

编辑:由于这已经成为公认的答案,我还在其他答案中添加了积分,所以这是一个总结。

答案 1 :(得分:3)

正如海因兹所说,以下需要注意:

\ { } $ ^ _ % ~ # &

大多数都可以使用反斜杠转义,但\变为\textbackslash~变为\textasciitilde

我想你可能想单独留言。 LaTeX以与许多内容管理系统完全相同的方式处理这些内容;很多人都期望“双线突破”=“段落”。哎呀,即使stackoverflow本身也是这样。

(你不能编写恶意的LaTeX代码; LaTeX内部发生的一切都留在LaTeX中。除非你在运行latex时明确启用write18,但默认情况下它被禁用。)

答案 2 :(得分:2)

Heinzi已经显示了大部分需要转义的基本字符,但这里的难点在于确保引用正确。

  

她说“他没有这样做”。

需要转换为

She said ``He didn't do it''.

在这个简单的案例中看起来很容易,但是充满了需要小心处理的gatcha。对于适度大小的文本,我通常使用sed中生成的朴素替换并手动处理结果。如果你的“纯文本”使用卷曲引号,事情会变得更容易和更难。


此处“天真的引用替换”表示跟随后面的单词字符被(一个或两个适当的)后面的标记替换,而所有其他单词被(一个或两个)单引号替换(')。大多数情况都是散文,但你必须手工清理所有的三重引用案例。

答案 3 :(得分:1)

另一种可能的解决方案是在插入用户文本之前将所有“特殊”字符变为普通字符。这可能会避免很多麻烦,但也可能会产生新的......

您可以通过更改角色的catcode来完成此操作。 TeX Wikibook了解更多。

\catcode`\$=12

会将$变为普通角色。但是,出于某种原因,某些角色并没有像你期望的那样出现。 \成为双开引号,{变为破折号......并且在组内}重新定义{...}会使TeX完全窒息。

长话短说:只有在你知道自己在做什么的情况下才会被推荐。