这是对问题的后续回答
我正在使用该包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
。
main.tex
:\documentclass[titlepage]{article}% \usepackage{standalone} \usepackage{import} \usepackage{hyperref} \makeatletter \providecommand{\currentimportpath}{\import@path} \makeatother \begin{document} \subimport*{A/}{main}% \end{document}
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
):
main.tex
:(只需添加
\usepackage{currfile}
以使其明确,以防万一您删除standalone
)\documentclass[titlepage]{article}% \usepackage{standalone} \usepackage{import} \usepackage{hyperref} \usepackage{currfile} \begin{document} \subimport*{A/}{child}% \end{document}
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
,\currfiledir
是A/
(因此斜线已经存在)。
当然,您可以自己编写\myhref
自动添加前缀的程序\currfiledir
,例如
\newcommand*{\myhref}[1]{\href{\currfiledir #1}}
然后调用
\myhref{foo.pdf}{my pdf file}
(请注意,如果您使用的import
包中的子目录中的文件与主文件同名,那么您需要currfile
版本0.7b
或更新版本才能使此解决方案起作用。)