期望行为

期望行为

最后,我希望有一个注入钩子,\@currentlabel为锚点添加后缀,如下所示:\edef\@currentlabel{\p@counter\thecounter<HOOK>}with hyperrefloaded。我考虑过重新定义\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}

相关内容