Как включить /includegraphics из подкаталога основной папки изображений, используя подфайлы

Как включить /includegraphics из подкаталога основной папки изображений, используя подфайлы

Поскольку я пока не могу комментировать посты, мне придется задать этот вопрос. Вот ссылка с примером: (Последний ответ 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}

При этом \inputs и \includes могут быть вложены, а графические файлы загружаются в папку, указанную относительно \graphicsfolderкаталога, в котором находится tex-файл.

Если у вас есть дополнительные глобальные пути, вы можете добавить их, вызвав \newaddgraphicspath. Однако использование \removelastgraphicspathявляется сложным, и вам следует избегать его, если вы не знаете, что делаете.

Вызов \showgraphicspathвозвращает фактический список путей, найденных в файле журнала и консоли.

По сравнению сэтот отличный и простой ответЭто решение имеет такую ​​особенность, что если изображение не найдено на том же уровне, все уровни вверх также ищутся - поэтому размещение изображений в папке imgage на первом уровне обеспечивает доступ ко всем последующим уровням в этой ветке. Используя это, вы можете, например, добавлять различные маркеры к разным частям и уровням без необходимости копировать глубоко вложенные файлы изображений или изменять макросы.

Связанный контент