Как можно превратить обычные кавычки (т.е.', ") в кавычки LaTeX / TeX (т.е.`', ``'')

StackOverflow https://stackoverflow.com/questions/346567

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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

Какими способами можно превратить подобные вещи в латексные кавычки с соответствующей семантикой?т. е.

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

Так что латекс производит:

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

Моя первая мысль - обратиться к регулярному выражению.Однако я не получаю никаких обращений от Google или библиотек регулярных выражений для "LaTeX quotes regular expression", и, конечно, "регулярное выражение в кавычках TeX", похоже, возвращает слишком много.

Спасибо.

Это было полезно?

Решение

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

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

Большая проблема будет связана с выявлением одиночных "'"s, которые не являются парными ---как и сокращения (the "'" в "don't" не должно быть изменено, и не должны быть сопряжены).


Давайте посмотрим, сможем ли мы написать полезное описание EBNF:

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

который ограничен сокращениями , которые имеют "'" в середине слова.Все связанные действия будут просто повторять входные данные, за исключением того, что squote и dquote термины заменяют кавычки соответствующим образом.


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

Другие советы

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

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

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

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

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

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

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

Я также сталкивался с этим, из CPAN's 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

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

Может быть, вы сможете почерпнуть немного вдохновения из Шикарные брюки?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top