设置 zref abspage 的默认值,以避免计算 tikz 图片标志(每页上的图片)旋转时出现算术溢出错误

设置 zref abspage 的默认值,以避免计算 tikz 图片标志(每页上的图片)旋转时出现算术溢出错误

整理一下这个问题的答案:

如何将 \pageref{foo} 用作数字?

将 TikZ 图片定位在页面背景上,使其位于双面文档的每一页上

我可以创建我的徽标图片(原子的“艺术”行星模型),该图片随着原子核和电子分别旋转(如果我理解正确的话,是嵌套图片),但是当我的文档超过约 90 页时,它会停止编译并出现“算术溢出”错误。

针对 Fischer 女士的第一个问题(我之所以使用这个问题,是因为我的书中有阿拉伯文和罗马字计数器;遗憾的是,切换后它们会重新启动),有一个参数可以设置最后一页的默认值

\zref@extractdefault{LastPage}{abspage}{1}

我没有用那个代替

\getpagerefnumber{LastPage}

我认为这是因为该语句中存在“@”字符,并且我不知道如何使用正确的语法使用 \makeatletter 和 \makeatother 来修复它。

我愿意接受任何解决方案,即使是那些采用不同方法的解决方案(我也阅读了有关在这个问题中使用包“xassoccnt”的信息:

指的是当前页码,但不是 \thepage,而是真正的绝对

但我不知道如何设置两个计数器的默认值以使其适用于我的情况。对于编译,我正在使用 luaLaTeX 并且也在学习 lua,所以这也可能是一种方法,但我的知识有限,仍然不够。

接下来我介绍 MWE,考虑到我的(有点)复杂的情况,它相当广泛,但是使用来自所提问题中的 MWE,我可以通过简单地更改默认计数器值来使其工作,但在我的具体情况下,我不知道如何做到这一点。

Mwe 是可编译的,对于“不可编译”状态,请取消注释 \newpage \lipsum 命令。

编辑:MWE 显示的不是“算术溢出”,而是超出尺寸,我希望是类似的。我的原始文档显示“算术溢出”错误。

编辑2:编辑了 MWE 来表示我的问题,编译 MWE 现在会出现错误(至少在我这边)。降低页面数量(删除一些“newpages”和“lipsum”使 MWE 再次可编译)。

非常感谢你的帮助,问候

托马斯

梅威瑟:

\documentclass[12pt,twoside]{book}

\usepackage{lastpage}
\usepackage[lastpage]{zref}
\makeatletter
\zref@newprop*{numpage}{\the\value{page}}
\zref@addprop{main}{abspage}
\makeatother

\usepackage{refcount}
\setrefcountdefault{-1}

\usepackage{eso-pic}

\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{shapes,calc,positioning,shadows.blur,decorations.pathreplacing}

\newcommand{\nuclei}[1]{%
    \shade[ball color=white] (#1) circle (.4);
}

\newcommand{\nucleus}{%
    \nuclei{0.1,0.3}
    \nuclei{0,0}
    \nuclei{0.3,0.2}
    \nuclei{-0.2,0.1}
    \nuclei{-0.1,0.3}
    \nuclei{0.2,-0.15}
    \nuclei{-0.05,-0.12}
    \nuclei{0.17,0.21}
}

%\electron{xwidth,ywidth,rotation angle}
\newcommand{\electron}[3]{%
    \draw[rotate = #3](0,0) ellipse (#1 and #2)[color=blue];
    \shade[ball color=black] (0,#2)[rotate=#3] circle (.2);
}

\usepackage{changepage}
\strictpagecheck

\newcommand{\MyTikzLogo}{% For a logo drawn with TikZ
\begin{tikzpicture}[remember picture,overlay,scale=1]
\checkoddpage
\ifoddpage
  \begin{scope}[shift={([xshift=2cm,yshift=2cm]current page.south west)}, scale=0.25]
  \begin{scope}[rotate=360*\the\value{page}/\getpagerefnumber{LastPage}]
    \nucleus
  \end{scope}       
    \electron{1.2}{1.4}{260+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{4}{2}{30+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{5}{1}{60+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{5.5}{1.5}{150+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{4.8}{2.25}{80+(360*\the\value{page}/\getpagerefnumber{LastPage})}
  \end{scope}
\else
  \begin{scope}[shift={([xshift=-2cm,yshift=2cm]current page.south east)}, scale=0.25,local bounding box=test]
  \begin{scope}[rotate=360*\the\value{page}/\getpagerefnumber{LastPage}]
    \nucleus
  \end{scope}       
    \electron{1.2}{1.4}{260+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{4}{2}{30+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{5}{1}{60+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{5.5}{1.5}{150+(360*\the\value{page}/\getpagerefnumber{LastPage})}
    \electron{4.8}{2.25}{80+(360*\the\value{page}/\getpagerefnumber{LastPage})}
  \end{scope}
\fi
 \end{tikzpicture}
}

\AddToShipoutPictureBG{\MyTikzLogo}

\begin{document}
\section*{Lorem Ipsum}
\pagenumbering{roman}
\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\pagenumbering{arabic}

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\lipsum[1-60]

\newpage

\end{document}

答案1

改变所有地方(包括旋转)的计算顺序:先除法,后乘法:

  360/\getpagerefnumber{LastPage}*\the\value{page}

这将避免数字变得太大 - 由于 pgf 使用内部尺寸,因此无法很好地处理数字。

相关内容