Как можно превратить обычные кавычки (т.е.', ") в кавычки LaTeX / TeX (т.е.`', ``'')
Вопрос
Учитывая документ, написанный с обычными кавычками, например
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)))
Просто используйте `для открытия котировок" и "для закрытия