我想要一些用户输入文本并快速解析它以生成一些乳胶代码。目前,我正在将%
替换为\%
,将\n
替换为\n\n
,但我想知道是否还有其他替换要进行转换从纯文本到乳胶。
我不担心这里的安全性(你甚至可以编写恶意乳胶代码吗?),因为这只应该被用户用来将他们自己的文本转换成乳胶,因此他们应该被允许使用他们的在预转换的文本中拥有乳胶标记,但我想确保输出不包括偶然的乳胶命令(如果可能)。如果有一个很好的库来进行这样的转换,我会看看。
答案 0 :(得分:6)
\ { } $ ^ _ % ~ # &
在LaTeX中是特殊的,所以你应该确保将它们转义(前缀为反斜杠会对其中一些做,对于特殊情况请参见Thomas' answer)或告诉用户不要使用它们,除非他们故意想要使用LaTeX命令(或两者的混合,具体取决于字符)。
一些额外的陷阱:
ä -> \"a
)。编辑:由于这已经成为公认的答案,我还在其他答案中添加了积分,所以这是一个总结。
答案 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完全窒息。
长话短说:只有在你知道自己在做什么的情况下才会被推荐。