Как к grep для всех пакетов используется в tex файле

Принятие я хочу grep все пакеты использовали в tex файле:

$ grep usepackage my.tex

сделает, с (насколько я вижу), одно исключение: Если пакет загружается этим много опций, в которых автор файла решил вставить разрывы строки, как

\usepackage[option1,
option2,
option3]{thepackage}

Там был бы способ сказать grep продолжать анализировать файл, пока он не совершает нападки }?

Идеально я только добрался бы thepackage как произведено, так, чтобы я мог возможно выполнить итерации по нему, такие как:

$ for i in `locate `my grep command`.sty`
do
grep \\\\newcommand{\\\\createstrouble} $i
done

для быстрого нахождения пакета в который команда \createstrouble определяется?

Править: Одна дальнейшая сложность: у Меня есть a \usepackage команда следующим образом:

\usepackage[pdftitle={My Title},
 pdfauthor={My Author}]{hyperref}

Править: Я понял, что этот подход не работает на мою цель, которая должна была узнать конфликтующие пакеты. Прежде всего, так, потому что пакет, загруженный \usepackage{something} получения по запросу в большем количестве пакетов через RequirePackage который не будет иметь на радаре. Лучше работать с файлом журнала, возможно с помощью \listfiles в преамбуле, производя список файлов, загруженных, и держа через texmf каталог для фактического названия команды используется различными пакетами.

2
задан 13 August 2015 в 21:54

2 ответа

Можно сделать многострочные соответствия в регулярном grep использование комбинации -P (режим PCRE) и -z флаги, например,

grep -zP '(?s)\\usepackage.+?}' file

или с pcregrep

pcregrep -M '(?s)\\usepackage.+?}' file

(?s), модификатор позволяет . соответствовать новым строкам.

<час>

Для получения просто имени пакета Вы могли попробовать или

grep -zPo '(?s)\\usepackage.*?{\K.+?(?=})' file

или

pcregrep -Mo '(?s)\\usepackage.*?{\K.+?(?=})' file


Тестирование простого выражения GREP на моей собственной рукописи TEX, я получаю следующий список пакета:

~$ grep -zPo '(?s)\\usepackage.*?{\K.+?(?=})' myfile.tex
geometry
changepage
inputenc
textcomp,marvosym
fixltx2e
amsmath,amssymb
cite
nameref,hyperref
lineno
microtype
rotating
setspace
caption
lastpage,fancyhdr,graphicx
epstopdf
2
ответ дан 2 December 2019 в 02:21

Не просто записать синтаксический анализатор TEX. Поэтому следующим решением может только быть попытка.

Используя awk дважды и uniq

awk '/usepackage/,/}$/ {gsub(/\\/,"\n",$0);printf "%s",$0}' my.tex |\
awk -F{ '{gsub(/}/,"",$NF); if ($NF != "") {print $NF}}' |\
sort -u

Пример

$ cat foo.tex
\usepackage[pdftitle={My Title},
 pdfauthor={My Author}]{hyperref}
\usepackage{ngerman}
\usepackage[scale=0.85]{geometry}

$ awk '/usepackage/,/}$/ {gsub(/\\/,"\n",$0);printf "%s",$0}' foo.tex |\
  awk -F{ '{gsub(/}/,"",$NF); if ($NF != "") {print $NF}}' |\
  sort -u
geometry
hyperref
ngerman
2
ответ дан 2 December 2019 в 02:21

Другие вопросы по тегам:

Похожие вопросы: