Принятие я хочу 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
каталог для фактического названия команды используется различными пакетами.
Можно сделать многострочные соответствия в регулярном 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
Не просто записать синтаксический анализатор 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