将 hyperref 的标签宏与 tikz 宏结合起来

将 hyperref 的标签宏与 tikz 宏结合起来

我想直观地标记我的标签。尝试使用扩展hyperref的宏会给我错误消息和一些奇怪的行为。\label\label@hook

梅威瑟:

\documentclass{scrbook}

\usepackage{blindtext}
\usepackage{etoolbox}
\usepackage{tikz}
\usepackage{hyperref}

\parindent=0pt

\makeatletter
\newcommand{\labmarred}{\@bsphack\tikz[remember picture,overlay] \fill[red] (0,0.75ex) circle (4pt);\@esphack}
\renewcommand{\labmarred}{\tikz[remember picture,overlay] \fill[red] (0,0.75ex) circle (4pt);}

\AtBeginDocument{\preto{\label@hook}{\labmarred}}
\makeatother

\begin{document}
\chapter{Chap 1}\label{chap:a}
\blindtext

\section{Sec 1}\label{sec:a}
\blindtext

\phantomsection\label{sec:a:a}
\blindtext

\labmarred
\blindtext

\subsection{Subsec 1}\label{subsec:a}
\blindtext

\subsection{Subsec 2}\label{subsec:b}
\blindtext

\subsection{Subsec 3}\label{subsec:c}
\blindtext
\end{document}

除了手动插入的红点(通过调用 插入的第 27 行\labmarred)外,每个红点上的第一个 texxt 行都有虚假缩进,并且出现了几条错误消息,类型如下Bad space factor (0).

上述示例中的两个版本的结果完全相同,并且都使用环境tikz而不是\tikz结果。

所使用的包和版本通常showlabels不在正确的位置。showkeys\marginpar

有提示去哪儿吗?

答案1

感谢 @Ulrike Fischer 的评论,它\tikz嵌入在 hbox 中,我找到了tikzmark提供的 -library \pgfmark,它与 相同,\tikzmark但没有\hbox。以下代码在某些限制下工作:从我的角度来看,使用没有任何问题,\label@hook因为标签名称可用,据我所知,钩子系统钩子就是为此设计的。

\documentclass{scrbook}

\usepackage{blindtext}
\usepackage{etoolbox}
\usepackage{tikz}
\usetikzlibrary{tikzmark,calc}
\usepackage{hyperref}

\parindent=0pt
\parskip=1ex

\makeatletter
\newcounter{markcnt}
\newcommand{\labmarred}{\global\addtocounter{markcnt}{1}%
  \pgfmark{dummy\arabic{markcnt}}\marginpar{\tikz[remember picture,overlay] \fill[red] ($(pic cs:dummy\arabic{markcnt})-(0,3ex)$) circle (4pt);}}

%\AtBeginDocument{\pretocmd{\label}{\labmarred}{}{}}
\AtBeginDocument{\preto{\label@hook}{\labmarred}{}{}}
\makeatother

\begin{document}
\chapter{Chap 1}\label{chap:a}
\blindtext

\section{Sec 1}\label{sec:a}
\blindtext

\phantomsection\label{sec:a:a}
\blindtext

\labmarred
\blindtext

\subsection{Subsec 1}\label{subsec:a}
\blindtext

\subsection{Subsec 2}\label{subsec:b}
\blindtext

\subsection{Subsec 3}\label{subsec:c}
\blindtext
\end{document}

问题:

  1. y 轴偏移了约 ,+3ex我找不到原因,所以\tikz必须将圆向下移动至大致正确的位置。

  2. 由于圆圈是在中绘制的,因此\marginpar如果将圆圈移动到下一页,仍会出现问题\marginpar- 最好将其放在页脚或页首。

无论如何 - 我提供这个作为答案,因为它似乎是一种可能的解决方法......

感谢@Christian Hupfer 的批评意见和@Ulrike Fischer 提供的(隐藏的)提示...

编辑:

由于 TeX 的分页符系统绝对无法访问,如果在\label跨越多页的段落末尾放置一个,即使是这种粗略的解决方案也会失败……简而言之:无法按预期工作……

相关内容