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

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

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 цитирует регулярное выражение", похоже, слишком много.

Спасибо.

Ответ 1

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

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

Большая проблема связана с идентификацией одиночных "'", которые не спариваются --- как сжатие ("'" in "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

Я хочу воспользоваться возможностью, чтобы указать на X Ǝ T E X, который поставляется с дистрибутивом (настоятельно рекомендую!) TeX Live.

Кроме того, X Ǝ T E X напрямую поддерживает Unicode. В вашем случае это означает, что вам больше не придется иметь дело с этими (иногда утомительными) символами замены: вместо использования ''´´ вы можете напрямую использовать "" в своем L A T E X.

ИМХО, это большой и важный шаг. T E X - отличная система набора, но ее отсутствие поддержки современных функций, таких как Unicode, затруднило выполнение множества задач.

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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