给出以下使用该tikzmark
库的示例:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usepackage{atbegshi}
\AtBeginShipout{\AtBeginShipoutUpperLeft{%
\foreach \n in {A,B} {%
\ifnum\arabic{page}=\tikzmarkpage{\n}
\tikz[remember picture, overlay]
\node[draw=blue] at (pic cs:\n) {\n};
\fi
}
}}
\newcommand\tikzmarkpage[1]{%
% How to return the actual page number of marker #1 here?
\arabic{page}%
}
\begin{document}
\tikzmark{A}
\newpage
\tikzmark{B}
\end{document}
在这个版本中,标记A
和B
定义在不同的页面上,但循环遍历\AtBeginShipout
钩子中的所有节点使得全部节点显示在每一页上,彼此重叠。我知道tikzmark
已经存储了定义标记的页码,\foreach
但我看不出有办法提取该信息以用于循环中的检查。
那么,如何定义\tikzmarkpage
获取给定标记名称对应的页码?
答案1
如果您想要获得一个数字,请不要使用 \arabic,因为根据语言,这不是一个数字。
除此之外这应该可以工作(但我没有测试复杂的页码设置):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usepackage{atbegshi}
\AtBeginShipout{\AtBeginShipoutUpperLeft{%
\foreach \n in {A,B} {%
\ifnum\number\value{page}=0\tikzmarkpage{\n}
\tikz[remember picture, overlay]
\node[draw=blue] at (pic cs:\n) {\n};
\fi
}
}}
\newcommand\tikzmarkpage[1]{%
\ifcsname save@pt@#1\endcsname
0\csname save@pg@\csname save@pt@#1\endcsname\endcsname
\fi}
\begin{document}
\tikzmark{A}
\newpage
\tikzmark{B}
\end{document}