Как можно превратить обычные кавычки (т.е. ', ") в кавычки 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", кажется, возвращает слишком много.
Спасибо.
7 ответов
В общем, эта проблема сложнее, чем кажется.
Простейшие случаи могут быть обработаны с помощью регулярных выражений, но для более общих ситуаций вам почти наверняка потребуется создать рекурсивный синтаксический анализатор: регулярное выражение будет работать только при отсутствии вложенности.
Большая проблема будет связана с выявлением одного "'"
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
условия заменяют кавычки по мере необходимости.
Я использовал регулярные выражения с последующими человеческими исправлениями для довольно простого разового, но это было бы трудоемко для продолжающейся работы.
Я хочу воспользоваться возможностью, чтобы указать на XƎ TE X, который поставляется с (очень рекомендуемым!) Дистрибутивом TeX Live.
Среди прочего, XƎ TE X напрямую поддерживает Unicode. В вашем случае это означает, что вам больше не придется иметь дело с этими (иногда утомительными) заменяющими символами: вместо использования ''´´
вы можете напрямую использовать “”
в вашем коде LA TE X
ИМХО, это большой и важный шаг. TE X - отличная система набора текста, но ей не хватает поддержки современных функций, таких как Unicode, что делает многие задачи трудными.
Вот регулярное выражение Python, которое я использую для своих латексных документов:
'([ \w-]+)'", " `\\1'
Существует скрипт Python, который применяет регулярные выражения к латексному файлу ( здесь). Работает большую часть времени. Удачного набора текста!:)
Спасибо за вклад - полезно и ценится.
Я также сталкивался с этим из 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
Вот некоторые замены регулярных выражений Perl, которые могут быть достаточно хороши для того, что вы хотите сделать.
s/"(\w)/``$1/g;
s/'(\w)/`$1/g;
s/([\w\.?!])"/$1''/g;
Код предполагает, что одинарная или двойная кавычка, за которой следует буквенно-цифровой символ, начинает кавычку. Кроме того, предполагается, что двойная кавычка после буквенно-цифрового символа или знака пунктуации заканчивает кавычку. Эти предположения, вероятно, верны большую часть времени, но могут быть и исключения.
Не используйте регулярные выражения для такого рода задач!
Может быть, вы можете получить вдохновение от SmartyPants?
Я искал ответ на эту проблему и решил немного выучить сегодня. Я поместил эту функцию 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)))