导入单独的独立乳胶文档并将它们组装成一个文档时处理 href

导入单独的独立乳胶文档并将它们组装成一个文档时处理 href

这是对问题的后续回答

如何导入单独的独立乳胶文档并组装成一个文档

我正在使用该包standalone将树中不同文件夹的许多子乳胶文件组装到顶层的一个父文件中,同时将每个子文件保存在自己的文件夹中,并能够将每个子文档构建为单独的乳胶文档。

使用上面的包,包import运行良好。但是使用链接时有一个大问题。

当在子文档中使用href来链接到相对于它的文件(比如在同一个文件夹中)时,在构建父文档时,链接不起作用,因为链接中的路径现在无效。即,超链接不会根据父文档所在的级别进行调整。

下面是一个包含 2 个小文件的设置图片,作为完整示例

main.tex   (now the link below is wrong when main document is build)
  |
  |
  A/----+ child.tex  (this contains href to foo.pdf)
          foo.pdf

main.tex 是

\documentclass[titlepage]{article}%
\usepackage{standalone}
\usepackage{import}
\usepackage{hyperref}
\begin{document}
\subimport*{A/}{child}%
\end{document}

并且 child.tex 是

\documentclass{article}
\usepackage{hyperref}
\begin{document}
\href{foo.pdf}{my pdf file}
\end{document}

一种解决方案是在链接中使用绝对路径。但这是一个问题,因为我可以将树本身移动到不同的位置,并且绝对路径可能会发生变化。另一种选择是使用子文件中已经根据父级调整的路径。因此,在这个例子中,我将在 child.tex 中写入此

 \href{A/foo.pdf}{my pdf file}

代替

 \href{foo.pdf}{my pdf file}

但是现在我建立子文档时的链接只会是错误的。

这也意味着如果我改变树布局的内部结构(比如将文件夹 A 向下移动一级),所有链接都必须手动修复。

我想知道是否有更好的自动化的方法来解决这个问题?

导入包可以很好地处理导入的相对路径,但我需要一些东西来处理href文档中使用的链接。

或者我应该放弃导入单独的独立 Latex 文档并将其组装成一个文档的想法,因为如果 href 链接损坏,那么整个过程将无法正常工作。我使用的许多链接与文档级别相关。也许 Latex 不适合这样的任务。

更新 1

我发现了一个很大的问题currfile包裹但我还没有查看是否有选项可以处理这种情况。给定这棵树,与上面相同,只是我只是重命名了文件:

index.tex   
  |
  |
  A/----+ index.tex  (this contains href to foo.pdf)
          foo.pdf

请注意,我使用了相同的文件名(index.tex),这对于上层和下层来说非常常见。

现在currfiledir不起作用。它会被相同的名称混淆,无法正确处理链接。当我将名称更改index2.tex为子项时,它就起作用了。即与我上面显示的完全相同的文件,只需将它们重命名为index.tex 在两种饲料中 导致了这个问题!

index.tex我到处都用过。在每个文件夹中,我都有index.tex。我想我可以将每个文件重命名为唯一的。但我希望这个包中有一个选项可以处理这个问题。

以下是根据上述树需要完成的文件:

index.tex (位于顶层)

\documentclass[titlepage]{article}%
\usepackage{standalone}
\usepackage{import}
\usepackage{hyperref}
\usepackage{currfile}

\begin{document}        
\subimport*{A/}{index}  %renaming this from index1 will make it work!
\end{document}

index.tex(在较低级别,即子级)%重命名为 index1.tex 以使其工作!

\documentclass{article}
\usepackage{hyperref}
\usepackage{currfile}
\begin{document}
\href{\currfiledir foo.pdf}{my pdf file}
\end{document}

答案1

如果由于某种原因您不想使用该currfile包(例如,您只有一个严格早于的版本,v0.7b并且正在使用import包含不同目录中同名文件的包),这里有一个可能的替代解决方案,仅依赖于该import包。

这个想法是,当宏可用时使用它\import@path,也就是说,因为import包已加载,它应该为我们跟踪路径。当它不可用时,这是因为子文档正在直接编译(而不是通过import),因此在这种情况下我们应该使用空白路径前缀。我们将所有内容包装在用户宏中\currentimportpath

  1. main.tex

    \documentclass[titlepage]{article}%
    \usepackage{standalone}
    \usepackage{import}
    \usepackage{hyperref}
    \makeatletter
    \providecommand{\currentimportpath}{\import@path}
    \makeatother
    \begin{document}
    \subimport*{A/}{main}%
    \end{document}
    
  2. A/main.tex

    \documentclass{article}
    \usepackage{hyperref}
    \providecommand{\currentimportpath}{}% for when this file is compiled directly
    \begin{document}
    \href{\currentimportpath foo.pdf}{my pdf file}
    \end{document}
    

答案2

如何使用currfile包(已经加载standalone):

  1. main.tex

    (只需添加\usepackage{currfile}以使其明确,以防万一您删除standalone

    \documentclass[titlepage]{article}%
    \usepackage{standalone}
    \usepackage{import}
    \usepackage{hyperref}
    \usepackage{currfile}
    \begin{document}
    \subimport*{A/}{child}%
    \end{document}
    
  2. A/child.tex

    在每个前面添加\usepackage{currfile}前缀:\currfiledir\href

    \documentclass{article}
    \usepackage{hyperref}
    \usepackage{currfile}
    \begin{document}
    \href{\currfiledir foo.pdf}{my pdf file}
    \end{document}
    

请注意 后的空格\currfiledir以及缺少斜线:

  • child.tex直接编译时\currfiledir为空(因此您不需要斜线)。
  • child.tex通过进行编译时main.tex\currfiledirA/(因此斜线已经存在)。

当然,您可以自己编写\myhref自动添加前缀的程序\currfiledir,例如

\newcommand*{\myhref}[1]{\href{\currfiledir #1}}

然后调用

\myhref{foo.pdf}{my pdf file}

(请注意,如果您使用的import包中的子目录中的文件与主文件同名,那么您需要currfile版本0.7b或更新版本才能使此解决方案起作用。)

相关内容