Включить файл *.sty из супер / подкаталога основного файла *.tex

#latex

#Латекс

Вопрос:

Я хочу поделиться документом latex через git со многими другими людьми. Поэтому мы решили поместить все специальные файлы sty, которые отсутствуют во всех установках latex, в каталог ресурсов. Было бы здорово, если бы этот каталог был superdir. из фактического рабочего каталога, как именно я могу импортировать эти файлы стилей?

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

Ответ №1:

Вы можете импортировать файл стиля ( mystyle.sty ) в свой документ двумя способами:

  1. Если он находится в вашем path или в той же папке, что и .tex файл, просто включите эту строку в преамбулу: usepackage{mystyle}
  2. Если он у вас есть в другой папке, вы можете получить к нему доступ, используя его полный путь как 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 (на этот раз успешно) компиляцией.

Этот способ может показаться немного чрезмерным, но он сочетает в себе лучшие возможности других методов.

  1. Если требуется несколько проектов в одном репозитории, mystyle.sty то наличие общего mystyle.sty , расположенного над ними всеми, имеет больше смысла, чем наличие копии в каждом каталоге проекта; все эти копии должны были бы поддерживаться.
  2. Компиляция переносима в том смысле, что если бы вы предоставили мне свои копии 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} .