如何将常规引号(例如', ")转换为LaTeX/TeX引号(即`','''')?

8

给定一篇使用普通引号编写的文档,例如:

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’?”

我的第一个想法是使用正则表达式。然而,我在谷歌和正则表达式库中搜索“LaTeX引号正则表达式”并没有找到任何结果,当然,“TeX引号正则表达式”似乎返回了太多结果。

谢谢。


1
正则表达式不是处理这个的正确工具。 - user3850
7个回答

5
总体而言,这个问题比看起来更难。
最简单的情况可以使用正则表达式处理,但对于更一般的情况,你几乎肯定需要构建一个递归解析器:只有在没有嵌套的情况下,正则表达式才能起作用。
大问题将与识别未成对的单个“'”有关——如缩写词(“don't”中的“'”不应更改,并且不应成对出现)。
让我们看看是否可以编写可用的EBNF说明:
input:       text+
text:        uquote|squote|dquote
squote       "'" text "'"
dquote       """ text """
uquote:      [contraction|.]+
contraction: [A-Za-z]+ "'" [A-Za-z]+

这段文字是关于IT技术的,它讲述了一个只限于缩写词中间出现 "'" 的问题。所有相关的操作都只是回显输入内容,除了 squotedquote 术语会根据情况替换引号。


我使用正则表达式加上人为修正来完成一个相当简单的一次性工作,但对于持续性的工作来说,这将需要大量的劳动力。


此外,还可以补充一点,在像emacs这样的编辑器中,当您键入"时,它会使用Tex-insert-quote来记住您的引号是否已打开(无嵌套),并且您必须手动打开单引号。 - Piotr Lesnicki

2

以下是我在 LaTeX 文档中使用的 Python 正则表达式:

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

有一个Python脚本,它在LaTeX文件中应用正则表达式(这里)。大多数情况下都有效。祝排版愉快! :)


1

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

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

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

这与我过去使用的类似。需要定期进行人工干预,但占据了大部分工作... - dmckee --- ex-moderator kitten

1

感谢您的输入 - 非常有帮助和感激。

我也发现了这个,来自 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

0

不要使用正则表达式来完成这种任务!

也许你可以从SmartyPants中获得一些灵感?


现在正在寻找Python版本。 :) - Brian M. Hunt

0

我正在寻找解决这个问题的答案,于是决定今天学习一点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)))

-4
简单地说,使用 `` 表示开头引号,'' 表示结尾引号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接