Нужно простое регулярное выражение для LaTeX - PullRequest
3 голосов
/ 27 января 2010

В моих файлах LaTeX у меня есть буквально тысячи вхождений следующей конструкции:

$\displaystyle{...math goes here...}$

Я бы хотел заменить их на

\mymath{...math goes here...}

Обратите внимание, что $ исчезают, но фигурные скобки остаются - если бы не конечный $, это был бы базовый поиск и замена. Если бы я только знал какое-либо регулярное выражение, я уверен, что он справится с этим без проблем. Какое регулярное выражение мне нужно, чтобы это произошло?

Заранее большое спасибо.

Редактировать: Возникли некоторые проблемы и вопросы, поэтому позвольте мне уточнить:

  1. Да, $\displaystyle{ ... }$ может встречаться несколько раз на одной и той же строке.
  2. Нет, вложенные }$ (например, $\displaystyle{...{more math}$...}$) не могут возникнуть. Я имею в виду, я полагаю, что это возможно, если вы поместите его в \mbox или что-то в этом роде, но я не могу себе представить, почему кто-то когда-либо делал это внутри конструкции $\displaystlye{}$, цель которой состоит в том, чтобы отображать математику в тексте. Во всяком случае, это не то, что я когда-либо делал или, скорее всего, буду делать.
  3. Я попытался использовать предложение perl, но, хотя оболочка не вызывала возражений, файлы остались без изменений.
  4. Я пытался использовать предложение sed, но оболочка возражала против "неожиданного токена рядом с` ("". Я никогда раньше не использовал sed (а "man sed" был тупым), но вот что я сделал: перешел к каталог, содержащий файлы .tex и напечатанный "sed s/\$\\displaystyle({[^}]+})\$/\\mymath\1/g *.tex". Не повезло. Как использовать sed, чтобы делать то, что я хочу?

Опять же, большое спасибо за оказанную помощь.

Ответы [ 3 ]

4 голосов
/ 27 января 2010

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

REGEX - конечный автомат; он не включает в себя стека он не может работать с вложенными структурами, такими как "{... здесь идет математика ...}", если есть возможность вложения такого типа, что "{more math} $" может появиться как часть строки "математика идет сюда". Вам нужно как минимум контекстно-свободная грамматика для описания этого типа конструкции - конечный автомат просто не режет!

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

Дайте ему шанс ... но остерегайтесь результатов!

4 голосов
/ 27 января 2010

СЭД:

s/\$\\displaystyle({[^}]+})\$/\\mymath\1/g
1 голос
/ 27 января 2010
perl -pi -e 's/$\\displaystyle({.*)}\$/\\mymath$1}/g' *.tex

если кратно} $ в одной строке, вам нужна не жадная версия:

perl -pi -e 's/$\\displaystyle({.*?)}\$/\\mymath$1}/g' *.tex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...