如何使主文件识别导入文件中使用的相对路径?

如何使主文件识别导入文件中使用的相对路径?

我目前正在使用 doxygen 为一个项目生成一些文档,然后 doxygen 生成一些 LaTeX 代码,然后可用于生成漂亮的 pdf。

但是假设我想编写另一份文档,并在该文档中包含 doxygen 生成的 LaTeX 代码作为该文档的一部分。

我该怎么做?有人做过这种事吗?


我的尝试是获取代码,生成不带“标题”的 LaTeX 代码。因此,code/doc/latex/从我自己的目录可以看到,我最终得到了一个名为 的目录main.tex

main.tex并尝试在输入中包含我的 LaTeX 代码。

\input{ code/doc/latex/refman.tex }

但是当我尝试包含code/doc/latex/refman.tex(doxygen、main.tex)时,他抱怨说找不到由 doxygen 生成的其他 LaTeX 文件。似乎他在与我的 main.tex 相同的目录中搜索,而不是在 中code/doc/latex/

它看起来大致如下refman.tex

\chapter{Todo List}
\label{todo}
\hypertarget{todo}{}
\input{todo}
\chapter{Class Index}
\input{annotated}
\chapter{File Index}
\input{files}
\chapter{Class Documentation}
\include{struct__offsetChannel}
\include{struct__offsetPixel}
\include{struct__tPixel}
...
...

欢迎任何想法。

一种解决方案可能是编写一个脚本来编辑所有生成的 LaTeX 代码,并简单地添加此路径,但这似乎是一个过于复杂的解决方案。


更新

我得到的错误是这样的

! LaTeX Error: File `todo.tex' not found.

更新

如果我改变所有\input \include这些,\includegraphics它就会起作用。

\input{todo} -> \input{code/doc/latex/todo}

但是必须有一种办法让 LaTeX 明白他应该查看code/doc/latex/代码吗?

答案1

我不太清楚具体细节,但进口包应该可以做你想做的事。我首先想到的语法是

\usepackage{import}
...
\subimport{code/doc/latex/}{refman.tex}

更新:感谢 Willie 指出\subimport哪个命令似乎是这里更好的选择\import

命令\import{full_path}{file} 和通过标准 LaTeX 机制( 、和 )\subimport{path_extension}{file} 设置输入,以加载相对于 \import-ed 目录的文件。还有、、 和命令的变体。作者是 Donald Arseneau。\input\include\includegraphics\includefrom\subincludefrom*

答案2

为了这个目的,我编写了自己的包。

现在有一个重要的新命令可用:\inputpaths

\inputpaths\include指定和\input可以查找给定文件的目录。默认情况下\inputpaths为空,因此\include\input具有与常规命令相同的行为。

重新定义\include\input使用根目录。如果文件不在根目录中,则命令将在指定的目录中查找该文件。

例子:

文件结构:
./main.tex
./file2.tex
./dir1/file1.tex
./dirN/file3.tex

内容file1.tex

\usepackage{inputx}
...
\inputpaths{dir1,...,dirN}
...
\begin{document}

\include{file1}
\input{file2}

\end{document}

内容dir1/file1.tex

\input{file3}
\input{dirN/file3}

内容file2.tex

file2: Hello World!

内容dirN/file3.tex

file3: Hello World!

输出:

file3:你好,世界!
file3:你好,世界!
文件2:你好,世界!

inputx源:


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Author: Blackstev
% Email: [email protected]
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{inputx}[2011/06/28 v1.0 inputx style for better file includings]
\typeout{2011/06/28 v1.0 inputx style for better file includings}

%{{{    use package
%}}}

\makeatletter

\newif\ifBreak
\Breakfalse

\gdef\inputpaths#1{\gdef\@inputpaths{#1}}
\gdef\@inputpaths{}

\newcommand{\forAllInputpaths}[2][\path]{\@for#1:=\@inputpaths\do{#2}}

\gdef\printinputpaths{
    \forAllInputpaths[\path]{Path: \path}
}



%{{{ redefine include
\global\let\old@include\include
\gdef\includex#1{
    \IfFileExists{#1.tex}
    {
        \old@include{#1}
    }
    {
        \forAllInputpaths[\path]
        {
            \ifBreak
            \else
                \IfFileExists{\path/#1.tex}
                {
                    \old@include{\path/#1}
                    \Breaktrue
                }
                {}
            \fi
        }
        \ifBreak
        \else 
            % \PackageError{includex}{'#1' can not be resolved}{'#1' can not be resolved. It is not in \@includepaths}
            \old@include{#1}
        \fi
        \Breakfalse
    }
}
\gdef\include#1{\includex{#1}}
%}}}
%{{{ redefine input
% original definition of input: \def\input{\@ifnextchar\bgroup\@iinput\@@input}
\global\let\old@input\@@input
\gdef\@@input#1{\old@input#1}
\gdef\inputx#1{
      \IfFileExists{#1.tex}
      {
          \@@input{#1}%
      }
    {
        \forAllInputpaths[\path]
        {
            \ifBreak
            \else
                \IfFileExists{\path/#1.tex}
                {
                    \@@input{\path/#1}
                    \Breaktrue
                }
                {}
            \fi
        }
        \ifBreak
        \else 
            %\PackageError{includex}{'#1' can not be resolved}{'#1' can not be resolved. It is not in \@includepaths}
            \@@input{#1}
        \fi
        \Breakfalse
    }
}
\def\input{\@ifnextchar\bgroup\inputx\@@input}
%}}}
\makeatother

答案3

如果您使用橡胶,您只需将如下指令添加到您的 Latex 源中即可:

% rubber: path code/doc/latex
% rubber: path ../foo/bar

此后,\input和朋友们将能够在code/doc/latex和中找到文件../foo/bar(相对于当前工作目录)。

TEXINPUTSRubber 通过在调用 pdflatex、latex 等之前适当地设置环境变量来实现这一点。

答案4

对此的快速修复是创建一个搜索和替换脚本,并且为了解决这个问题,我将在这里将其作为替代方案(即使它不是最优的做法)。

进入 Doxygen LaTeX 目录并运行此 bash 脚本。

#!/bin/bash 

for f in *.tex ;
do
    sed 's/\(\\includegraphics\[.*\]\){\(.*\)}/\1{code\/doc\/latex\/\2}/' $f |\
    sed 's/\(\\include\){\(.*\)}/\1{code\/doc\/latex\/\2}/' |\
    sed 's/\(\\input\){\(.*\)}/\1{code\/doc\/latex\/\2}/' |\
    sed 's/\(\\end{document}\)/%\1/' > $f.tmp ;
    mv $f.tmp $f;
done

相关内容