16

How can I get the current path inside an included standalone file?

1. Theoretical Example:

let's assume the following directory structure:

main.tex
img/
 |-standalonefile.tex
 |-data

standalonefile.tex:

\documentclass{standalone}

\begin{document}
    \somecommand{data}
\end{document}

main.tex:

\documentclass{article}

\usepackage{standalone}

\begin{document}
    \includestandalone{img/standalonefile}
\end{document}

Now standalonefile.tex compiles, but main.tex can't find data. I couldn't find a way to use path from \includestandalone somehow inside standalonefile.tex.

2. Practical example with pgfplots (MWE) (I'm looking for a general solution)

directory structure:

main.tex
plots/
 |- plot1/
     |- plot1.tex
     |- data.csv

main.tex

\documentclass{article}

\usepackage[subpreambles]{standalone}

\begin{document}
    \includestandalone{plots/plot1/plot1}
\end{document}

plot1.tex

\documentclass{standalone}

\usepackage{pgfplots}

\begin{document}
    \begin{tikzpicture}
    \begin{axis}
        \addplot table [x=x, y=y, col sep=semicolon]{data.csv};
    \end{axis}
    \end{tikzpicture}

\end{document}

data.csv

x;y
0;0
1;1

Now plot1.tex compiles fine, but with main.tex the data.csv can't be found.

Ideas for a solution

  • a command like \mystandalonedir that would return
    • the relative path to the main file, if included with \includestandalone
    • nothing, if not included
  • change the base dir somehow with the \includestandalone
  • (or something else ;) )
  • 1
    related: tex.stackexchange.com/questions/4602/… – jub0bs Dec 1 '13 at 19:59
  • Oh, I see closing votes ;) If I read the suggested page correctly the solutions over there are only for \input an \include commands. But I'll take another look at it. – someonr Dec 1 '13 at 20:49
  • I don't think it's a duplicate. A solution to your problem would involve some patching of \includestandalone. If your question gets closed, I'll vote to reopen it. Martin Scharrer is the author of the standalone package and a moderator on the site. If he sees your question, I'm sure he'll come up with some solution. – jub0bs Dec 1 '13 at 20:50
  • 1
    With docmute+import packages in the main file you can use \subimport{img/}{standalonefile}. Note that in this case the preamble of the nested file is lost (among another problems like references) but you can \input a common preamble in both files. – Fran Dec 4 '13 at 11:56
10
+50

My answer is possibly not a very elegant one, but it's roughly the way I handle this problem with my own files. The basic idea is to set up a path macro \datapath.

For your given practical example, I suggest the following:

main.tex

\documentclass{article}

\usepackage[subpreambles]{standalone}

\newcommand{\includestandalonewithpath}[3][]{%
  \begingroup%
  \newcommand{\datapath}{#2}%
  \includestandalone[#1]{\datapath/#3}%
  \endgroup}

\begin{document}
  \includestandalonewithpath{plots/plot1}{plot1}
\end{document}

plot1.tex

\providecommand{\datapath}{.}
\documentclass{standalone}

\usepackage{pgfplots}

\begin{document}
    \begin{tikzpicture}
    \begin{axis}
        \addplot table [x=x, y=y, col sep=semicolon]{\datapath/data.csv};
    \end{axis}
    \end{tikzpicture}
\end{document}

This solution will also work, if your data file is in a subdirectory relative to plot1.tex, e.g.

plots/plot1/data/data.csv

Then, you would have:

\addplot table [x=x, y=y, col sep=semicolon]{\datapath/data/data.csv};
  • thank you! I just awarded the bounty to you and extended your solution with some string splitting. – someonr Dec 23 '13 at 12:14
6

I just combined Thomas F. Sturm answer with automatic string splitting. This way \includestandalonewithpath can be used the same way as \includestandalone.

main.tex

\documentclass{article}

\usepackage[subpreambles]{standalone}
\usepackage{xstring}

\newcommand{\includestandalonewithpath}[2][]{%
    \begingroup%
    \StrCount{#2}{/}[\matches]%
    \StrBefore[\matches]{#2}{/}[\datapath]%
    \includestandalone[#1]{#2}%
    \endgroup%
}

\begin{document}
    \includestandalonewithpath{plots/plot1/plot1}
\end{document}

plot1.tex

\documentclass{standalone}

\providecommand{\datapath}{.}
\usepackage{pgfplots}

\begin{document}
    \begin{tikzpicture}
    \begin{axis}
        \addplot table [x=x, y=y, col sep=semicolon]{\datapath/data.csv};
    \end{axis}
    \end{tikzpicture}

\end{document}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.