#latex
#Латекс
Вопрос:
Я хочу поделиться документом latex через git со многими другими людьми. Поэтому мы решили поместить все специальные файлы sty, которые отсутствуют во всех установках latex, в каталог ресурсов. Было бы здорово, если бы этот каталог был superdir. из фактического рабочего каталога, как именно я могу импортировать эти файлы стилей?
Важно, чтобы даже зависимости этих удаленных стилей разрешались с помощью других удаленных стилей.
Ответ №1:
Вы можете импортировать файл стиля ( mystyle.sty
) в свой документ двумя способами:
- Если он находится в вашем path или в той же папке, что и
.tex
файл, просто включите эту строку в преамбулу:usepackage{mystyle}
- Если он у вас есть в другой папке, вы можете получить к нему доступ, используя его полный путь как
usepackage{/path/to/folder/mystyle}
Тем не менее, если вы не уверены, есть ли файл стиля во всех установках, просто включите его в тот же каталог и убедитесь, что вы это сделали git add mystyle.sty
, и отслеживайте его вместе с остальными вашими файлами (хотя, скорее всего, в нем не будет никаких изменений). Нет необходимости в родительском каталоге. Но если вы настаиваете на другом каталоге, смотрите вариант 2 выше.
Было бы лучше, если бы он находился в подкаталоге, а не в родительском каталоге, поскольку вы все равно можете вызвать файл как usepackage{subdir/mystyle}
и быть уверенным, что вызываете свой файл стиля. Однако, если вы перейдете в родительский каталог, вы никогда не узнаете, есть ли у других пользователей папка с аналогичным именем, которая не является частью вашего пакета, что может привести к ошибкам.
Комментарии:
1. Это также должно работать с
documentclass
? Кажется, я не могу загрузить файл класса, расположенный во вложенной папке моего основного файла .tex.2. Как указал Дэвид Карлайл , тот факт, что
usepackage{/path/to/folder/mystyle}
это работает, объясняется отсутствием проверки ошибок. Аргументомusepackage{}
должно быть имя, а не путь, поэтому 2. на самом деле не является хорошим вариантом.
Ответ №2:
Вероятно, это больше не имеет отношения к вам, но вот другой способ сделать то, что вы хотите. Настройте свой репозиторий git следующим образом:
mystyle.sty
project/
makefile
project.tex
и поместить usepackage{mystyle}
в преамбулу project.tex
.
Конечно, компиляция project.tex
вручную не сработает, потому что mystyle.sty
находится не в том же каталоге, что и project.tex
.
Однако, если makefile
содержит что-то вроде:
project.pdf: mystyle.sty project.tex
pdflatex project
mystyle.sty: ../mystyle.sty
cp ../$@ $@
затем запуск make
изнутри project
каталога приведет к mystyle.sty
копированию в нужное место перед project.tex
(на этот раз успешно) компиляцией.
Этот способ может показаться немного чрезмерным, но он сочетает в себе лучшие возможности других методов.
- Если требуется несколько проектов в одном репозитории,
mystyle.sty
то наличие общегоmystyle.sty
, расположенного над ними всеми, имеет больше смысла, чем наличие копии в каждом каталоге проекта; все эти копии должны были бы поддерживаться. - Компиляция переносима в том смысле, что если бы вы предоставили мне свои копии
mystyle.sty
иproject.tex
, то я бы (по крайней мере теоретически) смог скомпилировать вручную без необходимости изменять файлы, которые вы мне дали. Например, мне не пришлось бы заменятьusepackage{/your/path/mystyle}
наusepackage{/my/path/mystyle}
.
Комментарии:
1. Я бы использовал символическую ссылку, а не копировал файл напрямую.
Ответ №3:
Вы можете использовать Makefiles, как было предложено выше. Другим вариантом является CMake. Я не тестировал родительские каталоги.
Если у вас есть следующая структура файла:
├── CMakeLists.txt
├── cmake
│ └── UseLATEX.cmake
├── img
│ └── logo.jpg
├── lib
│ └── framed.sty
└── main.tex
-
у вас должен быть установлен CMake, инструкции по ресурсам CMake
-
UseLATEX.cmake можно загрузить отсюда
-
затем внутри CMakeLists.txt
╚═$ cat CMakeLists.txt cmake_minimum_required (VERSION 2.6) set(PROJECT_NAME_STR myProject) project(${PROJECT_NAME_STR}) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(UseLATEX) ADD_LATEX_DOCUMENT(main.tex IMAGE_DIRS img DEFAULT_PDF MANGLE_TARGET_NAMES)
-
Некоторый пример содержимого для main.tex (обратите внимание на изображение)
╚═$ cat main.tex documentclass{report} begin{document} begin{center} includegraphics[width=300px]{img/logo.jpg} end{center} end{document}
-
В каталоге lib находятся файлы *.sty
-
Теперь вы можете скомпилировать:
cd /directory/that/has/CMakeLists.txt/ mkdir build cd build cmake .. make
-
затем вы можете просмотреть main.pdf, который находится в каталоге сборки.
Комментарии:
1. Мне нравится CMake за это, но ваш пример, похоже, не работает, и я не понимаю, как это могло бы сработать. Строка «lib» не отображается ни в UseLATEX.cmake , ни в каком-либо коде в вашем сообщении. Как pdflatex узнает, что именно там находятся файлы *.sty?
2. Исправить это было не так уж сложно. Я просто вручную изменил код копирования стиля в UseLATEX.cmake , чтобы копировать файлы из
${CMAKE_CURRENT_SOURCE_DIR}/lib
, а не${CMAKE_CURRENT_SOURCE_DIR}
из.
Ответ №4:
При использовании дистрибутива TeX, который использует kpathsea, вы можете использовать TEXINPUTS
переменную среды, чтобы указать, где TeX ищет файлы. Переменную необходимо использовать следующим образом.
Пути в TEXINPUTS
разделены на :
. Пустой путь будет содержать пути поиска по умолчанию, то есть только двоеточие. Две последовательные косые черты означают, что выполняется поиск в каталоге и во всех подкаталогах.
Таким образом, например, для создания файла, document.pdf
который использует файлы в текущем каталоге, все подкаталоги resources
каталога и каталоги по умолчанию, вы можете использовать следующий Makefile.
document.pdf: document.tex
TEXINPUTS=.:./resources//: pdflatex document.tex
Чтобы ускорить поиск имени файла, вы можете создать ls-R
базу данных с помощью mktexlsr
команды.
Для получения всех подробностей о kpathsea взгляните на руководство.
Ответ №5:
Вы можете использовать latexmk и его возможности
Существует функция, описанная в разделе Utility subroutines
здесь странице 48 в latexmk, которая может обновляться TEXINPUTS
во время выполнения. Если вы можете рассмотреть возможность использования файла .latexmkrc для настройки вашей цепочки и параметров, вы можете добавить ensure_path()
в файл:
Вот пример:
# .latexmkrc
ensure_path('TEXINPUTS', './path/to/something//', '/full/path/to/something/else//')
# [...] Other options goes here.
$pdf_update_method = 3;
$xelatex = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$pdf_previewer = 'start "%ProgramFiles%/SumatraPDF/SumatraPDF.exe" %O %S';
$out_dir = 'build/';
Обратите внимание на //
в конце пути, это поможет LaTeX выполнить поиск файлов в указанном каталоге и во всех подкаталогах.
Пожалуйста, обратите внимание, что, хотя это замечательная функция, вам нужно хорошо позаботиться о вашей схеме именования. Если вы используете одно и то же имя файла в нескольких местах, у вас могут возникнуть проблемы при их импорте, скажем
include{somefile}
.