Настройка texmf в Linux

При изучении пакета для tex [[http://www.ctan.org/tex-archive/macros/latex/contrib/curve]] натолкнулся на проблему установки собранного пакета в [TEXMF] директорию, она была мне попросту неизвестна. Городить огород с собственноручно придуманными путями тоже не очень хотелось, но решение нашлось и оно оказалось достаточно простым.

Во-первых, необходимо воспользоваться утилитой //kpsepath//, которая идёт в комплекте с основной поставкой tex. Для удобства, я воспользовался командой //tr//, о которой рассказывал в [[http://blog.arkoniak.com/?p=221|Разделение строки на составляющие в шелле]]

{{{ lang=bash line=1
> kpsepath tex | tr “:” “\n”
/home/skoffer/.texlive/texmf-config/tex/kpsewhich//
/home/skoffer/.texlive/texmf-var/tex/kpsewhich//
/home/skoffer/texmf/tex/kpsewhich//
!!//etc/texmf/tex/kpsewhich//
!!//var/lib/texmf/tex/kpsewhich//
!!/usr/share/../local/share/texmf/tex/kpsewhich//
!!/usr/share/texmf-site/tex/kpsewhich//
!!/usr/share/texmf-dist/tex/kpsewhich//
/home/skoffer/.texlive/texmf-config/tex/generic//
/home/skoffer/.texlive/texmf-var/tex/generic//
/home/skoffer/texmf/tex/generic//
!!//etc/texmf/tex/generic//
!!//var/lib/texmf/tex/generic//
!!/usr/share/../local/share/texmf/tex/generic//
!!/usr/share/texmf-site/tex/generic//
!!/usr/share/texmf-dist/tex/generic//
/home/skoffer/.texlive/texmf-config/tex///
/home/skoffer/.texlive/texmf-var/tex///
/home/skoffer/texmf/tex///
!!//etc/texmf/tex///
!!//var/lib/texmf/tex///
!!/usr/share/../local/share/texmf/tex///
!!/usr/share/texmf-site/tex///
!!/usr/share/texmf-dist/tex///
}}}

Этот достаточно длинный список и есть список путей, по которым //tex// ищет пакеты. Часть из них являются системными, часть – локальными. Многократные “/” на конце не случайны и означают, что поиск будет происходить на соответствующей глубине от корневого пути. Дело в том, что стандартный пакет устроен следующим образом
{{{
[TEXMF]/tex/latex//.cls
[TEXMF]/doc/latex//.pdf
etc…
}}}

Соответственно, если есть желание поставить пакет в “/usr/share/texmf-site”, то в конечном итоге пакет будет скопирован в
{{{
/usr/share/texmf-site/tex/latex//.cls
/usr/share/texmf-site/doc/latex//.pdf
etc…
}}}

Собственно говоря на этом и всё. Выбираем любой понравившийся путь из //kpsepath//, создаем при необходимости директории и копируем файлы пакета. После этого надо обновить хэш командой
{{{ lang=bash line=1
texhash
}}}

И маленькое замечание. В случае Gentoo, директория usr/share/texmf/// будет замещаться при обновлении пакета, поэтому туда лучше ничего не устанавливать.

Разделение строки на составляющие в шелле

Во многих языках программирования есть удобная команда split, которая позволяет разбить строку на составляющие. Для осуществления этой операции в шелле, есть удобная утилита tr, с помощью которой можно делать то же самое. Этим, например, можно пользоваться чтобы преобразовать содержимое переменной $PATH к читабельному виду

{{{ lang=bash line=1
> echo $PATH | tr “:” “\n”
/usr/local/bin
/usr/bin
/bin
/opt/bin
/usr/games/bin
}}}

Первый аргумент (в данном случае “:”) это литера которую нужно заменить, второй аргумент это литера на которую нужно заменить. В данном случае символ-разделитель отдельных элементов $PATH, заменяется на символ перевода строки, что и приводит к нужному результату.

Полное копирование в zsh

Если пытаться скопировать содержимое директории в шелле в какую-либо другую директорию, то могут возникнуть проблемы, связанные с наличием скрытых файлов, то есть файлов, начинающихся со знака точки (‘.’). То есть, если выполнить следующую серию команд:

{{{lang=bash line=1
> cd /tmp
> mkdir a
> mkdir b
> touch a/a
> touch a/b
> touch a/.c
> touch a/.d
}}}

то в директории a будут находиться скрытые файлы. Попытка “в лоб” скопировать содержимое этой директории к успеху не приведёт

{{{lang=bash line=1
> cp a/* b
2 files ( 0,0 KiB) copied in 0,0 seconds ( 0,0 KiB/s).
> ls -al b
a b
> ls -al a
.c .d
}}}

Как видно, в директорию b скопировалось всего два файла. Это связано с тем, как zsh интерпретирует знак ‘*’, он не расшифровывает его в скрытые имена файлов. Конечно, эту проблему можно обойти в два копирования

{{{lang=bash line=1
> cp a/* a/.* b
4 files ( 0,0 KiB) copied in 0,0 seconds ( 0,0 KiB/s).
}}}

но гораздо более изящным является следующий способ
{{{lang=bash line=1
> cp a/*(D) b
4 files ( 0,0 KiB) copied in 0,0 seconds ( 0,0 KiB/s).
}}}

Модификатор (D) указывает zsh, что при раскрытии символа ‘*’ необходимо учитывать также и скрытые файлы.