
Поскольку я пока не могу комментировать посты, мне придется задать этот вопрос. Вот ссылка с примером: (Последний ответ markellos — это то, что я использую и на что ссылаюсь)
путь к рисункам в разных каталогах с подфайлом latex
Его случай:
Основной.tex:
\providecommand{\main}{.}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{graphicx}
%here is the path
\graphicspath{{\main/images/}{images/}}
\usepackage{subfiles}
\usepackage{blindtext}
\begin{document}
\subfile{\main/chap1/chap1}
\end{document}
глава1.tex
\providecommand{\main}{..}
\documentclass[\main/main.tex]{subfiles}
\begin{document}
\begin{figure}[bh]
\centering
\includegraphics[width=4cm]{f1}
\label{fig:img1}
\caption{ShareLaTeX learn logo}
\end{figure}
Hello, here is some text...
\end{document}
Допустим, мой основной каталог изображений — «images», и вы вызываете его с помощью: \includegraphics[width=4cm]{./f1}
(по крайней мере, я так делаю)
Но у меня также есть подпапка в папке «images» под названием «ABC». Как мне вызвать ее из нее с помощью \includegraphics?
Я не очень хорош в латексе и в основном копирую вещи из ответов и других шаблонов, чтобы смешивать их по своему вкусу. Я пишу свою диссертацию, и у меня будет несколько других подпапок с изображениями (я занимаюсь гистологией). Поэтому было бы очень удобно сортировать их в другой папке из основной папки «изображения».
Я попробовал \includegraphics{../f1)
, но что-то мне подсказывает, что мне придется изменить эту строку в main.tex, чтобы включить мои подпапки:
\graphicspath{{\main/images/}{images/}}
Но как?
Бр
решение1
Извините за аналогию с семьей, но она может помочь вам понять, как устроены ваши родственники и как на них ссылаются.
Итак, вы являетесь папкой, назовем вас Томас, и у вас есть родитель, назовем его blindhardt, вы помещены в систему как /blindhardt/thomas, но для самостоятельной ссылки вы можете использовать псевдоним."."
у вас есть дети /blindhardt/thomas/janet и /blindhardt/thomas/john у
них могут быть прозвища, такие как preface и chap1,
чтобы указать на отношение вашего ребенка к вам вы можете сказать ./preface или ./chap1
для вашего отца вы можете сказать .. а для братьев и сестер они могут быть ../older или ../jounger
ваше генеалогическое древо теперь может быть
/blindhardt/older
/thomas/
/thomas/preface
/thomas/chap1
/younger
Хорошо, это основная теория ваших относительных путей, теперь перейдем к вашему ответу.
Одна часть вас, Фомы, хранителя (семейной Библии), известна как main.tex.
Маркеллос показывает аккуратночто если эта часть вас (main.tex) идентифицирует себя как
\providecommand{\main}{.}
тогда любой ../child/story.tex может ссылаться на вас как на своего провайдера
\providecommand{\main}{..} i.e their own parent
также их дополнительное заявление
\documentclass[\main/main.tex]{subfiles}
подтверждает, что они принадлежат к той же подгруппе (классу), что и вы
как семья вы соглашаетесь хранить все ваши изобразительные активы в
/blindhart/somewhere/vault, однако как хранитель вы хотите назвать его
/blindhart/thomas/images
% вот путь к хранилищу для вас ./images и следующее поколение {\main\images}
\graphicspath{{images/}{\main/images/}}
Ладно, пока ничего нового. Допустим, вы храните в этом хранилище папку (ABC),
и теперь вам и вашим детям понадобится перекрестный индекс.
\graphicspath{{images/}{\main/images/}{images/ABC/}{\main/images/ABC/}}
Теперь не имеет значения, находится ли pic1.png или fig1.pdf в папке main/images или /images/ABC,
все ваши ближайшие родственники файлов смогут найти его с помощью
\includegraphics[width=4cm]{pic1}
Main.tex (изменена только одна строка)
\providecommand{\main}{.}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{graphicx}
%here is the NEW path
\graphicspath{{images/}{\main/images/}{images/ABC/}{\main/images/ABC/}}
\usepackage{subfiles}
\usepackage{blindtext}
\begin{document}
\subfile{\main/chap1/chap1}
\end{document}
chap1.tex (без изменений, за исключением более широкого принятия)
\providecommand{\main}{..}
\documentclass[\main/main.tex]{subfiles}
\begin{document}
\begin{figure}[bh]
\centering
% f1 can be any accepted image (png pdf etc.) beware if there are two in different locations then the order WILL become important.
% it can be in ./f1.png it may be in ../images/f1.pdf or even ../images/ABC/f1.eps
\includegraphics[width=4cm]{f1}
\label{fig:img1}
\caption{ShareLaTeX learn logo}
\end{figure}
Hello, here is some text...
\end{document}
Очевидно, что /older и его /children могут следовать той же схеме, но если вы все хотите получить доступ к семейному гербу в /blindhardt/images, то вы начинаете добавлять гораздо больше вложенных относительных слоев, и может быть проще включить абсолютный адрес для таких главных изображений, поэтому вы и ваши братья и сестры можете добавить
\graphicspath{{c:\familydocs\blindhardt\images/}{images/}{\main/images/}{images/ABC/}{\main/images/ABC/}}
Есть способы включить пробелы в приведенный выше код, но для полной совместимости я предлагаю не включать их.
Все вышесказанное основано на формулировке вашего вопроса, однако каждый tex-файл может посещать публичную библиотеку самостоятельно.
В вашем распоряжении библиотека по умолчанию.${TEXMFHOME}/tex/generic/images
Вы также можете назначить последовательность коллективов проекта с помощью TEXINPUTS=".:.//:c:\road\to\nowhere: "
переменной, которую вы могли бы переопределять по-разному перед каждым запуском проекта, если вы знаете, что делаете.
ОБРАТИТЕ ВНИМАНИЕ на специальный токен .//, который означает ВСЕ подкаталоги
ВидетьАвтоматически находить включенные изображенияиПереименование папки главы и эффективное обращение к изображениям
решение2
добро пожаловать в tex.SE
Для более крупного проекта я некоторое время назад написал кое-что, что может вам помочь.
Основная идея заключается в том, чтобы добавить хук в начале и конце \input
и \include
автоматически адаптировать graphicspath. Поскольку \subfile
использует \input
, это должно работать.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{graphicx}
\usepackage{blindtext}
% use parent management with current source file
\usepackage{subfiles}
\usepackage{filehook}
\usepackage[parent]{currfile}
\makeatletter
% Define a new stack by letting it to \@empty
\newcommand\newStack[1]{\global\let#1\@empty}
% add element to stack (top): \addStack{<stack>}{<element>}
\newcommand{\addStack}[2]{\def\ele@ment{{#2} }\xdef#1{\ele@ment #1}}
% add element to stack (bottom) \revaddStack{<stack>}{<element>}
\newcommand{\revaddStack}[2]{\def\ele@ment{{#2} }\xdef#1{#1 \ele@ment}}
% remove from stack
\long\def\pop@#1 #2\@nil#3{\def\popedStackElement{#1}%
\def#3{#2}}% remaining list
% stack name #1
\newcommand\popStack[1]{\let\popedStackElement\@empty%
\ifx #1\@empty\message{LaTeX warning: you are trying to remove an element from the empty stack \noexpand#1 on input line \the\inputlineno}\else\expandafter\pop@#1\@nil#1\fi}
% whipe stack
\newcommand\cleanStack[1]{\global\let#1\@empty}
%%% enhanced graphicspath management
% idea: everytime \includegraphics is called from a file of a (larger) project the graphics file is searched
% in a specific folder relative to that one the actual tex source code resides in.
% In addition generally valid paths can be defined.
% idea taken from https://tex.stackexchange.com/questions/45946/stack-datastructure-using-latex ;
% uservariant and autovariant of graphicspath stack
\newStack{\GrapPa@user}
\newStack{\GrapPa@auto}
% activate stack as graphicspath
% def hook for entering file: add path and update graphicspath
\newcommand{\grappa@start@hook}{%
\ifcurrfiledir\@empty{}{\addStack{\GrapPa@auto}{\currfiledir\graphicsfolder}}\update@grappa}
% def hook for leaving file: remove path and update graphicspath
\newcommand{\grappa@end@hook}{%
\ifcurrfiledir\@empty{}{\popStack{\GrapPa@auto}}\update@grappa}
% activate stack as graphicspath
\newcommand{\update@grappa}{\xdef\GrapPa@temp{{\GrapPa@user \GrapPa@auto}}\expandafter\graphicspath\GrapPa@temp}
%
% user space graphicspath stack:
\newcommand{\newaddgraphicspath}[1]{\addStack{\GrapPa@user}{#1}\update@grappa}
\newcommand{\removelastgraphicspath}{\popStack{\GrapPa@user}\update@grappa}
\newcommand{\showgraphicspath}{\message{user: \show\GrapPa@user\space - auto: \show\GrapPa@auto}}
% define default graphics folder name
\newcommand{\graphicsfolder}{images/}
% now register for linking to filehook
\AtBeginDocument{%
\AtBeginOfInputs{\grappa@start@hook}%
\AtBeginOfIncludes{\grappa@start@hook}%
\AtEndOfInputs{\grappa@end@hook}%
\AtEndOfIncludes{\grappa@end@hook}}
%%% enhanced graphicspath management
\makeatother
\newaddgraphicspath{./\graphicsfolder}
\begin{document}
\subfile{./chap1/chap1}
\end{document}
При этом \input
s и \include
s могут быть вложены, а графические файлы загружаются в папку, указанную относительно \graphicsfolder
каталога, в котором находится tex-файл.
Если у вас есть дополнительные глобальные пути, вы можете добавить их, вызвав \newaddgraphicspath
. Однако использование \removelastgraphicspath
является сложным, и вам следует избегать его, если вы не знаете, что делаете.
Вызов \showgraphicspath
возвращает фактический список путей, найденных в файле журнала и консоли.
По сравнению сэтот отличный и простой ответЭто решение имеет такую особенность, что если изображение не найдено на том же уровне, все уровни вверх также ищутся - поэтому размещение изображений в папке imgage на первом уровне обеспечивает доступ ко всем последующим уровням в этой ветке. Используя это, вы можете, например, добавлять различные маркеры к разным частям и уровням без необходимости копировать глубоко вложенные файлы изображений или изменять макросы.