【问题标题】:How can one turn regular quotes (i.e. ', ") into LaTeX/TeX quotes (i.e. `', ``'')如何将常规引号(即'、")转换为 LaTeX/TeX 引号(即`'、`'')
【发布时间】:2010-09-25 16:25:00
【问题描述】:

给定一个用普通引号写的文档,例如

Ben said "buttons, dear sir".
I replied "Did you say 'buttons'?" to him.

有什么方法可以将这些东西转换为 LaTeX 引号,并具有适当的语义。即

Ben said ``buttons, dear sir''.
I replied ``Did you say `buttons'?'' to him.

这样 LaTeX 会产生:

Ben said “buttons, dear sir”.
I replied “Did you say ‘buttons’?”

我的第一个想法是转向正则表达式。但是,我没有从 Google 或“LaTeX 引用正则表达式”的正则表达式库中获得任何点击,当然“TeX 引用正则表达式”似乎返回太多。

谢谢。

【问题讨论】:

  • 正则表达式不是解决此问题的正确工具。

标签: regex latex quotes


【解决方案1】:

一般来说,这个问题比看起来要难。

最简单的情况可以用正则表达式处理,但对于更一般的情况,您几乎肯定需要构建一个递归解析器:正则表达式只有在没有嵌套的情况下才能工作。

最大的问题将与识别未配对的单个 "'"s 相关——就像收缩一样("don't" 中的 "'" 不应更改,和不应配对)。


让我们看看我们是否可以编写一个可用的 EBNF 描述:

input:       text+
text:        uquote|squote|dquote
squote       "'" text "'"
dquote       """ text """
uquote:      [contraction|.]+
contraction: [A-Za-z]+ "'" [A-Za-z]+

这仅限于单词中间有"'" 的缩写。除了squote 和dquote 术语会酌情替换引号之外,所有关联的操作都只会回显输入。


我使用正则表达式和人工修复来完成相当简单的一次性工作,但这对于正在进行的工作来说将是劳动密集型的。

【讨论】:

  • 此外,可以在诸如 emacs 之类的编辑器中添加,当您键入 " 时,它使用 Tex-insert-quote 来记住您的引号是否已打开(无嵌套),并且您必须手动打开单个引号。
【解决方案2】:

这是我用于 Latex 文档的 python 正则表达式:

'([ \w-]+)'", " `\\1'

有一个 python 脚本将正则表达式应用于乳胶文件 (here)。大部分时间都在工作。排版快乐! :)

【讨论】:

    【解决方案3】:

    这里有一些 Perl 正则表达式替换可能足以满足您的需求。

    s/"(\w)/``$1/g;
    s/'(\w)/`$1/g;
    s/([\w\.?!])"/$1''/g;
    

    代码假定单引号或双引号后跟字母数字字符开始引号。此外,它假定字母数字字符或标点符号后面的双引号结束引号。这些假设在大多数情况下可能是正确的,但也可能有例外。

    【讨论】:

    • 这个和我以前用的差不多。时不时需要人工干预,但占用了大部分工作......
    【解决方案4】:

    感谢您的意见 - 很有帮助和赞赏。

    我也遇到过这个,来自 CPAN 的 Latex::Encode.pm:

        # A single or double quote before a word character, preceded
        # by start of line, whitespace or punctuation gets converted
        # to "`" or "``" respectively.
    
        $text =~ s{ ( ^ | [\s\p{IsPunct}] )( ['"] ) (?= \w ) }
                  { $2 eq '"' ? "$1``" : "$1`" }mgxe;
    
        # A double quote preceded by a word or punctuation character
        # and followed by whitespace or end of line gets converted to
        # "''".  (Final single quotes are represented by themselves so
        # we don't need to worry about those.)
    
        $text =~ s{ (?<= [\w\p{IsPunct}] ) " (?= \s | $ ) }
                  { "''" }mgxe
    

    【讨论】:

      【解决方案5】:

      不要对这类任务使用正则表达式!

      也许你可以从SmartyPants那里得到一些灵感?

      【讨论】:

      • ... 正在寻找 Python 版本。 :)
      【解决方案6】:

      我一直在寻找这个问题的答案,并决定今天学习一点 lisp。我把这个 lisp 函数放在我的 ~/.emacs 文件中,然后用M-x tex-set-quotes 运行:

      (defun tex-set-quotes ()  
        (interactive)  
        (latex-mode)  
        (while (search-forward "\"" nil t)  
         (replace-match "" nil t)  
         (tex-insert-quote nil)))
      

      【讨论】:

        【解决方案7】:

        简单地说,用 `` 开头的引号和 '' 结尾

        【讨论】:

          猜你喜欢
          • 2017-06-08
          • 2011-01-13
          • 1970-01-01
          • 1970-01-01
          • 2017-03-11
          • 1970-01-01
          • 1970-01-01
          • 2015-05-12
          相关资源
          最近更新 更多