最后,我希望有一个注入钩子,\@currentlabel
为锚点添加后缀,如下所示:\edef\@currentlabel{\p@counter\thecounter<HOOK>}
with hyperref
loaded。我考虑过重新定义\refstepcounter
,但
hyperref
重新定义会给系统带来一些麻烦\refstepcounter
:
\let\H@refstepcounter\refstepcounter
\def\refstepcounter#1{%
\ifHy@pdfstring
\else
\H@refstepcounter{#1}%
\edef\This@name{#1}%
\ifx\This@name\name@of@slide
\else
\if@skiphyperref
\else
\if@hyper@item
\stepcounter{Item}%
\hyper@refstepcounter{Item}%
\@hyper@itemfalse
\else
\hyper@refstepcounter{#1}%
\fi
\fi
\fi
\fi
}
我也看了一下\hyper@refstepcounter
,但没有结果。
期望行为
如果我注入“en-US”,我会看到subsubsection.1.1.1:en-US
以下字段[4] \contentsline
:
\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}}{1}{subsubsection.1.1.1:en-US}}
我知道如何使用\theHsection
,例如
\renewcommand*\theHsection{\thesection:en-US}
但结果会是subsubsection.1:en-US.1.1:
。我正在寻找一种无论基础内容如何都会添加后缀的解决方案。我在源代码中找不到提示/tex/latex/hyperref/hyperref.sty
。我也找不到hyperref
实际使用 的地方\theHsection
。
代码
\documentclass{article}
\usepackage{fontspec}
\usepackage{hyperref}
\makeatletter% allow @ to access backend commands
\begin{document}
\tableofcontents
\section{}
\meaning\This@name% section
\subsection{}
\meaning\This@name % subsection
\subsubsection{}
\meaning\This@name %subsubsection
\paragraph{}
\meaning\This@name % subsubsection if not redefined
\end{document}
辅助
相关部分
\@writefile{toc}{\contentsline {section}{\numberline {1}}{1}{section.1:en-US}}
\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}}{1}{subsection.1:en-US.1}}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}}{1}{subsubsection.1:en-US.1.1}}
\@writefile{toc}{\contentsline {paragraph}{}{1}{section*.2}}
为什么
好吧,假设我使用 将一堆文件合并为一个 PDF \input
。每个文件代表同一文档的不同语言国家/地区版本。因为我必须重新启动分段计数器,所以链接会重叠,所以最简单的方法是hyperref
通过设置来使用通用计数器hypertexnames=false
。但是,这实际上会禁用/删除 PDF 锚点与其来源之间的任何关系。为了使锚点在语义上与其对应的语言国家/地区版本保持相关,我想保留hypertexnames=true
并只向锚点添加一个变量后缀,以指示它来自的源语言国家/地区版本。为什么要用后缀?我认为用分隔符这样阅读效果很好:
。前缀也可以。
答案1
合并 PDF 文件的目标级别
包hyperref
可以通过宏 来修改目标标签,\HyperDestNameFilter
可以用来添加后缀:en-US
,例如:
\documentclass{article}
\usepackage{hyperref}
\renewcommand*{\HyperDestNameFilter}[1]{#1:en-US}
\begin{document}
\tableofcontents
\section{First section}
\subsection{First subsection}
\subsubsection{First subsubsection}
\paragraph{First paragraph}
\end{document}
辅助文件(.aux
、.toc
)中的目标名称不会改变,因为\HyperDestNameFilter
应用于低级,即hyperref
驱动程序级别。但 PDF 文件中的所有目标名称都有后缀:
(Doc-Start:en-US)
(page.1:en-US)
(section*.1:en-US)
(section*.2:en-US)
(section.1:en-US)
(subsection.1.1:en-US)
(subsubsection.1.1.1:en-US)
合并 TeX 文件的计数器级别
如果合并是在 TeX 级别进行的,并且不再具有唯一的计数器值,则\theH<counter>
需要重新定义冲突计数器的宏。例如:
\documentclass{article}
\usepackage{hyperref}
\newcommand*{\NewLanguage}[1]{%
\setcounter{section}{0}
\renewcommand*{\theHsection}{%
\the\value{section}:#1%
}%
% The redefinitions for subsection, subsubsection
% is usually not needed, because they use \theHsection.
% But for better names:
\renewcommand*{\theHsubsection}{%
\the\value{section}.\the\value{subsection}:#1%
}%
\renewcommand*{\theHsubsubsection}{%
\the\value{section}.\the\value{subsection}%
.\the\value{subsubsection}:#1%
}%
}
\begin{document}
\tableofcontents
\NewLanguage{en-US}
\section{First section (en)}
\subsection{First subsection (en)}
\subsubsection{First subsubsection (en)}
\NewLanguage{de-DE}
\section{First section (de)}
\subsection{First subsection (de)}
\subsubsection{First subsubsection (de)}
\end{document}
文件.toc
(带有额外的空格以便更好地对齐):
\contentsline {section} {\numberline {1}First section (en)}{1} {section.1:en-US}
\contentsline {subsection} {\numberline {1.1}First subsection (en)}{1} {subsection.1.1:en-US}
\contentsline {subsubsection}{\numberline {1.1.1}First subsubsection (en)}{1}{subsubsection.1.1.1:en-US}
\contentsline {section} {\numberline {1}First section (de)}{1} {section.1:de-DE}
\contentsline {subsection} {\numberline {1.1}First subsection (de)}{1} {subsection.1.1:de-DE}
\contentsline {subsubsection}{\numberline {1.1.1}First subsubsection (de)}{1}{subsubsection.1.1.1:de-DE}