代码之家  ›  专栏  ›  技术社区  ›  Noah

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

  •  2
  • Noah  · 技术社区  · 15 年前

    我想获取一些用户输入的文本,并快速解析它以生成一些乳胶代码。目前,我正在更换 % 具有 \% \n 具有 \n\n ,但我想知道是否还有其他替代品,我应该做,使从纯文本转换为乳胶。

    我并不担心这里的安全(你能写恶意的乳胶代码吗?),因为这只能由用户用于将自己的文本转换为乳胶,因此可能允许他们在预转换的文本中使用自己的乳胶标记,但我想确保输出不包括意外的乳胶命令(如果可能)。如果有一个好的图书馆可以进行这样的转换,我会去看看。

    4 回复  |  直到 15 年前
        1
  •  6
  •   alex    7 年前

    显然, following characters

    \ { } $ ^ _ % ~ # &
    

    乳胶是很特别的,所以你应该确保避开它们(用反斜杠加前缀可以解决其中的一些问题,参见 Thomas' answer 对于特殊情况),或者告诉用户不要使用它们,除非他们有意使用乳胶命令(或者两者混合使用,具体取决于字符)。

    一些额外的陷阱:

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

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

        2
  •  3
  •   Thomas    15 年前

    正如海因茨所说,需要注意以下几点:

    \ { } $ ^ _ % ~ # &
    

    大多数可以用反斜杠转义,但是 \ 变成 \textbackslash ~ 变成 \textasciitilde .

    我想你可能想让换行符单独存在。LaTex以与许多内容管理系统完全相同的方式处理这些内容;许多人已经开始期待“Double Line Break”=“Paragraph Break”。天哪,即使stackoverflow本身也是这样工作的。

    (你不能写恶意的乳胶代码;乳胶内发生的一切都留在乳胶内。除非在运行时显式启用write18 latex ,但默认情况下禁用。)

        3
  •  2
  •   Community CDub    7 年前

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

    她说“他没有做”。

    需要转换为

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

    在这个微不足道的案例中,这看起来很容易,但却充满了需要小心处理的GATCHA。对于中等大小的文本,我通常使用SED中生成的简单替换,并手工处理结果。如果您的“纯文本”使用了大引号,那么事情就会变得越来越简单。


    这里“幼稚的引号替换”是指引号 跟着 按字字符替换为(一个或两个,视情况而定)反勾号,所有其他字符替换为(一个或两个)单引号。( ' )。这在散文中捕捉到了大多数情况,但是您必须手工清理所有三重引号的情况。

        4
  •  1
  •   Thomas    15 年前

    另一种可能的解决方案是在插入用户文本之前,将所有“特殊”字符转换为普通字符。这也许可以避免许多头痛,但也可能产生新的头痛…

    您可以通过更改字符的catcode来完成此操作。这个 TeX Wikibook 知道更多。

    \catcode`\$=12
    

    将转弯 $ 变成普通人。然而,出于某种原因,有些角色并不像你想象的那样出现。 \ 变成双引号, { 变成破折号…重新定义 } 在一个组内( {...} )使Tex完全窒息。

    长话短说:只有当你知道自己在做什么时才推荐。