Как можно превратить обычные кавычки (т. Е. ', ") В кавычки LaTeX / TeX (т. Е.`', `` '') - PullRequest
5 голосов
/ 06 декабря 2008

Учитывая документ, написанный с обычными кавычками, например,

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", кажется, возвращает слишком много.

Спасибо.

Ответы [ 7 ]

4 голосов
/ 06 декабря 2008

В общем, эта проблема сложнее, чем кажется.

В простейших случаях можно обрабатывать с помощью регулярных выражений, но для более общих ситуаций вам почти наверняка потребуется построить рекурсивный синтаксический анализатор: регулярное выражение будет работать только при отсутствии вложенности.

Большая проблема будет связана с выявлением единичных "'" 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 заменяют кавычки соответствующим образом.


Я использовал регулярные выражения с последующими человеческими исправлениями для довольно простой разовой работы, но это было бы трудоемко для продолжающейся работы.

2 голосов
/ 27 декабря 2010

Вот регулярное выражение Python, которое я использую для своих латексных документов:

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

Существует скрипт Python, который применяет регулярное выражение к латексному файлу ( здесь ). Работает большую часть времени. Удачного набора текста! :)

1 голос
/ 06 декабря 2008

Спасибо за вклад - полезно и ценится.

Я также сталкивался с этим из Latex :: Encode.pm :

CPAN
    # 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
1 голос
/ 06 декабря 2008

Вот некоторые замены регулярных выражений Perl, которые могут быть достаточно хороши для того, что вы хотите сделать.

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

Код предполагает, что одинарная или двойная кавычка, за которой следует буквенно-цифровой символ, начинает кавычку. Также предполагается, что двойная кавычка после буквенно-цифрового символа или знака препинания завершает кавычку. Эти предположения, вероятно, верны большую часть времени, но могут быть и исключения.

0 голосов
/ 13 декабря 2011

Просто используйте `` для открытия котировок и '' для закрытия

0 голосов
/ 18 декабря 2010

Я искал ответ на эту проблему и решил немного выучить сегодня. Я поместил эту функцию 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)))
0 голосов
/ 06 декабря 2008

Не используйте регулярные выражения для такого рода задач!

Может быть, вы можете получить вдохновение от SmartyPants ?

...