附言:底部有一个包含所有文件的 zip 文件。
我将大文档拆分成多个较小的文档,现在每个章节将单独编译(在自己的文件夹中),作为单独的 PDF 文件(不使用\include
或,而是作为具有自己的和 的\input
单独文档)title
\begin{document}
但我仍然需要从主文档引用其他文档来构建表格并引用每章中的问题。
所以我使用xr-hyper
。效果很好。我有这个 MWE 树来显示我当前的设置
main.tex
|
+------ chapter_1/ch1.tex
+------ chapter_2/ch2.tex
我将每个章节放在单独的文件夹中以减少混乱。这是我的 main.tex、ch1.tex 和 ch2.tex 的样子
%main.tex
\documentclass{book}
\usepackage{xr-hyper}
\usepackage{hyperref}
\externaldocument{chapter_1/ch1} %notice folder name included
\externaldocument{chapter_2/ch2}
\begin{document}
See problem \hyperref[1]{1} below and problem \hyperref[2]{2}.
\end{document}
以及位于文件夹 chapter_1/ 内的 ch1.tex
\documentclass{book}
\usepackage{xr-hyper}
\usepackage{hyperref}
\begin{document}
\chapter{chapter 1 in document ch1.tex}
\section{some section name}
\subsection{problem 1 from some book}
\label{1}
This is problem 1
\end{document}
和 ch2.tex
\documentclass{book}
\usepackage{xr-hyper}
\usepackage{hyperref}
\begin{document}
\chapter{chapter 2 in document ch2.tex}
\section{some section name}
\subsection{problem 2 from some book}
\label{2}
This is problem 2
\end{document}
接下来,编译 ch1.tex、ch2.tex 和最后的 main.tex(每个都在自己的文件夹中),并按照上面的顺序,全部使用lualatex
。
现在我打开了 main.pdf,那里的链接是正确的,并且可以在 pdf 中使用。
接下来,我对 tex4ht 做了同样的事情。按顺序编译 ch1.tex、ch2.tex,然后编译 main.tex,全部使用以下命令
cd chapter_1
make4ht ch1.tex 'mathjax,htm'
cd ../chapter_2
make4ht ch2.tex 'mathjax,htm'
cd ..
make4ht main.tex 'mathjax,htm'
然后打开main.htm
并显示正确的输出
现在问题是,当我点击链接时,它会从链接中删除文件夹名称。链接1
显示
ch1.htm#x1-30001.1.1
代替
chapter_1/ch1.htm#x1-30001.1.1
通过手动编辑链接并向chapter_1/
其中添加文件夹名称,它就可以正常工作并正确打开第 1 章页面。
我可以将所有单独的文档(main.tex,ch1.tex 和 ch2.tex)放在同一个顶层文件夹中来解决所有这些问题。
但是为了减少混乱,因为我有很多章节,现在我想为每一章制作完全独立的 PDF 文件(但仍然有主文档对它们的交叉引用),最好将每个章节放在单独的文件夹中,以便于管理并减少同一文件夹中的混乱,因为我现在需要分别编译每一个章节。
这看起来像是 tex4ht 中的一个错误,因为它从引用中删除了文件夹名称。还是我做错了什么?
这是尝试分离章节.zip 其中包含所有文件和文件夹。
TL 2021
2022 年 4 月 30 日更新
我已经在 tex4ht 中测试过这个了。我发现了一个大问题。只要将单独的章节编译为一个大的 HTML 文件而不进行拆分,一切都会正常工作。然后来自另一个文档(主文档)的链接就会正确显示。
一旦我拆分了章节,并按正确顺序重新编译所有内容,父级就会失去链接,它们不再显示。由于我拆分了所有章节(因为它们很大),所以这对我来说不起作用。
我希望有一个简单的解决方案。下面我给出了 MWE 的演示,以及一个包含所有内容的 zip 文件,以便于查看。
我有这个布局
main.tex
|
CHAPTERS/
|
chapters_1/
|
ch1.tex
这是 main.tex
\documentclass{book}
\usepackage{xr-hyper}
\usepackage{hyperref}
\externaldocument{CHAPTERS/chapter_1/ch1}
\begin{document}
See problem \hyperref[1]{1}
\end{document}
这是 ch1.tex
\documentclass{article}
\usepackage{xr-hyper}
\usepackage{hyperref}
\begin{document}
\section{some section name}
\subsection{problem 1 from some book}
\label{1}
THis is problem 1
\end{document}
现在我做以下事情
cd CHAPTERS/chapter_1/
make4ht -ulm default -a debug ch1.tex 'mathjax,htm,4'
cd ../..
make4ht -ulm default -a debug main.tex 'mathjax,htm'
然后查看 main.htm 看看链接是否有效,结果无效。它只显示数字1
,但不可点击。以下是 main.htm 的原始 HTML
<!DOCTYPE html>
<html lang='en-US' xml:lang='en-US'>
<head><title></title>
<meta charset='utf-8' />
<meta content='TeX4ht (https://tug.org/tex4ht/)' name='generator' />
<meta content='width=device-width,initial-scale=1' name='viewport' />
<link href='main.css' rel='stylesheet' type='text/css' />
<meta content='main.tex' name='src' />
<script>window.MathJax = { tex: { tags: "ams", }, }; </script>
<script async='async' id='MathJax-script' src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js' type='text/javascript'></script>
</head><body>
<!-- l. 8 --><p class='noindent'>See problem <a>1</a>
</p>
</body>
</html>
现在我做以下事情
cd CHAPTERS/chapter_1/
make4ht -ulm default -a debug ch1.tex 'mathjax,htm'
cd ../..
make4ht -ulm default -a debug main.tex 'mathjax,htm'
请注意,我删除了章节上面的分割。
现在我查看 main.htm,发现链接处于活动状态并正常工作。这是 main.htm 的新原始 HTML。你看,现在它起作用了。
<!DOCTYPE html>
<html lang='en-US' xml:lang='en-US'>
<head><title></title>
<meta charset='utf-8' />
<meta content='TeX4ht (https://tug.org/tex4ht/)' name='generator' />
<meta content='width=device-width,initial-scale=1' name='viewport' />
<link href='main.css' rel='stylesheet' type='text/css' />
<meta content='main.tex' name='src' />
<script>window.MathJax = { tex: { tags: "ams", }, }; </script>
<script async='async' id='MathJax-script' src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js' type='text/javascript'></script>
</head><body>
<!-- l. 8 --><p class='noindent'>See problem <a href='CHAPTERS/chapter_1/ch1.htm#x1-20001.1'>1</a>
</p>
</body>
</html>
这里有一个压缩文件包含上述布局和所有文件。
答案1
可以使用这些.4ht
文件添加子目录支持。
首先,我们需要在宏中保存外部文件的目录,以便以后检索。我们可以这样做xrhyper-hooks.4ht
:
% xrhyper-hooks.4ht (2020-10-17-13:53), generated from tex4ht-4ht.tex
% Copyright 2020 TeX Users Group
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c of this license or (at your option) any
% later version. The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions
% of LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work
% is the TeX4ht Project <http://tug.org/tex4ht>.
%
% If you modify this program, changing the
% version identification would be appreciated.
\immediate\write-1{version 2020-10-17-13:53}
\:AtEndOfPackage{\let\XR:\XR@
\def\XR@[#1][#2]#3{%
% save directory for the linked file
\filename@parse{#3}
% \filename@base is filename, \filename@area directory
\expandafter\xdef\csname xr:dir:\filename@base\endcsname{\filename@area}
\AtBeginDocument{\XR:[#1][#2]{#3}}
}%
}
重要的代码是这样的:
% save directory for the linked file
\filename@parse{#3}
% \filename@base is filename, \filename@area directory
\expandafter\xdef\csname xr:dir:\filename@base\endcsname{\filename@area}
它使用 LaTeX 的命令\filename@parse
来提取外部文件的路径、基本名称和扩展名。这些部分存储在\filename@area
和\finelame@base
命令中。然后我们创建将文件名链接到目录的 csname。
然后它可以用于xr-hyper.4ht
:
% xr-hyper.4ht (2016-12-21-15:03), generated from tex4ht-4ht.tex
% Copyright 2003-2009 Eitan M. Gurari
% Copyright 2009-2016 TeX Users Group
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c of this license or (at your option) any
% later version. The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions
% of LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work
% is the TeX4ht Project <http://tug.org/tex4ht>.
%
% If you modify this program, changing the
% version identification would be appreciated.
\immediate\write-1{version 2016-12-21-15:03}
\let\XR:loop=\XR@loop
\def\XR@loop#1{%
\def\:temp##1.aux{\openin15=##1.xref
\ifeof15
\:warning{missing ##1.xref for ##1.aux}%
\let\:temp\empty
\else
\def\:temp{\input ##1.xref}%
\fi
\closein15 \:temp
}%
\catcode`\:=11
\expandafter\ifx \csname xr:CrossWord\endcsname\relax
\let\xr:CrossWord=\Cross:Word
\def\Cross:Word##1##2{%
\expandafter\let\csname cw:\cw:format{##1##2}\endcsname\:UnDef
\xr:CrossWord{##1}{##2}}%
\fi
%
\:temp#1%
\catcode`\:=12
\XR:loop{#1}%
}
\long\def\XR@test#1#2#3#4\XR@{%
\ifx#1\newlabel
\expandafter\xdef\csname r@\XR@prefix#2\endcsname{\XR:rEfLiNK #3}%
%
\else\ifx#1\@input
\edef\XR@list{\XR@list#2\relax}%
\fi\fi
\ifeof\@inputcheck\expandafter\XR@aux
\else\expandafter\XR@read\fi}
\def\XRrEfLiNK[#1]#2#3{%
\filename@parse{#1}% Get basename of the linked html file,
% xr:dir\filename@base contains file's directory
\a:xr[\csname xr:dir:\filename@base\endcsname#1]{#2}{}%
\ifx\hyperrefLabel\:UnDef #3\else \hyperrefLabel\fi \b:xr}
\NewConfigure{xr}{2}
\Configure{xr}{\Link}{\EndLink}
\def\XR:rEfLiNK#1#2#3#4#5{{\xr:rEfLiNK#1}{\xr:rEfLiNK#2}{\xr:rEfLiNK#3}}
\def\xr:rEfLiNK#1#2{\noexpand\XRrEfLiNK[\Get:HFile#2-]{#2}}
\def\Get:HFile#1-#2-{\:LikeRef{)F\:gobble #1F-}}
\Hinput{xr}
\endinput
重要的代码是这样的:
\def\XRrEfLiNK[#1]#2#3{%
\filename@parse{#1}% Get basename of the linked html file,
% xr:dir\filename@base contains file's directory
\a:xr[\csname xr:dir:\filename@base\endcsname#1]{#2}{}%
\ifx\hyperrefLabel\:UnDef #3\else \hyperrefLabel\fi \b:xr}
应该\csname xr:dir:\filename@base\endcsname#1
扩展为链接的 HTML 文件的全名,包括目录。
这是最终的 HTML 代码:
<!-- l. 10 --><p class='noindent'>See problem <a href='chapter_1/ch1.htm#x1-30001.1.1'>1</a> below and problem <a href='chapter_2/ch2.htm#x1-30001.1.1'>2</a>.
</p>