PDF 渲染错误:使用 checkifodd 和变量

PDF 渲染错误:使用 checkifodd 和变量

我使用 checkifodd 和 varialbe x, y。

编译时出现错误:渲染此 PDF 时出现错误

我的代码:

\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\usepackage[strict]{changepage}
\usepackage{ifoddpage}
\usepackage{tcolorbox}
\usepackage[absolute,overlay]{textpos}
\usepackage{tikz}
\begin{filecontents*}{test1.csv}
Acol, Bcol,Ccol
Ax,Bx,1
Ay,By,3
A1,B22,1
A2,B44,2
A3,B11,3
\end{filecontents*}

\DTLloaddb{mydata1}{test1.csv}

\newcommand*{\x}{\ifoddpage 5cm\else 10cm\fi}
\newcommand*{\y}{\ifoddpage 1cm\else 6cm\fi}

\begin{document}

\DTLforeach*{mydata1}{\A=Acol,\B=Bcol,\C=Ccol}%
{%
\checkoddpage{

\begin{tikzpicture}[remember picture,overlay]
\node (n1)[anchor=north west,xshift=\x,yshift=\y] at (current page.north west) {\includegraphics[height=5cm]{example-image-b}};

\end{tikzpicture}

\newpage

}
}
\end{document}

请帮忙,谢谢

答案1

我不会在同一个文档中同时使用ifoddpagechangepage包,除非首先确保它们兼容,因为它们都提供了至少一个同名的命令(即\checkoddpage,但请参见下面的注释)。我坚持使用changepage这里,因为这是我在之前回答这些问题时使用过的。

注意:关于这种兼容性,该包的文档ifoddpage指出:

changepagememoir类还提供了此包的核心功能,即它们定义了\checkoddpage和 ,\ifoddpage但没有定义上述其他宏。该包在内部使用此条件,以便允许用户更改奇数页或偶数页的页面布局,这是其主要功能。ifoddpage[包] 应与该包和类一起使用,但应最后加载以确保 的正确功能\ifoddpageoroneside。如果使用选项加载,它还会使用标签strict

话虽如此,你的文件中真正的问题是,为了让你的\x\y宏产生 〈dimen〉 (固定长度),TeX 需要执行两个扩展步骤,但 TiZ 似乎只对 的可选参数中写的内容执行一项操作\node。例如,您可以验证如果您自己执行第一步扩展,它是否有效:

\checkoddpage
\begin{tikzpicture}[remember picture,overlay]
  \node (n1) [anchor=north west, xshift=\ifoddpage 5cm\else 10cm\fi,
              yshift=\ifoddpage 1cm\else -6cm\fi]
    at (current page.north west)
    {\includegraphics[height=5cm]{example-image-b}};
\end{tikzpicture}

\ifoddpage 5cm\else 10cm\fi在一个扩展步骤中扩展为5cm10cm,这在 的可选参数中确实有效\node。但是当您使用 时\x,您需要一个扩展步骤来获得\ifoddpage 5cm\else 10cm\fi,然后需要第二个扩展步骤来获得5cm或 。10cm。TiZ 解析器似乎没有执行这两个步骤(它怎么能猜出需要多少个步骤?)。

为了妥善解决这个问题,我的建议是:

  • 首先执行命令,例如\edef\pgfmathsetmacro执行完全扩展的命令\node命令用于定义两个宏\myxshift\myyshift需要仅需一个扩展步骤为当前页面产生所需的结果;

  • 然后在选项中使用\myxshift和。\myyshift\node

\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\usepackage[strict]{changepage}
\usepackage{tikz}

\begin{filecontents*}{test1.csv}
Acol, Bcol,Ccol
Ax,Bx,1
Ay,By,3
A1,B22,1
A2,B44,2
A3,B11,3
\end{filecontents*}

\DTLloaddb{mydata1}{test1.csv}

\newcommand*{\x}{\ifoddpage 5cm\else 10cm\fi}
% I changed 6cm to -6cm here, otherwise the image is invisible (above the
% page!).
\newcommand*{\y}{\ifoddpage 1cm\else -6cm\fi}

\begin{document}

\DTLforeach*{mydata1}{\A=Acol,\B=Bcol,\C=Ccol}%
{%
\checkoddpage
\begin{tikzpicture}[remember picture,overlay]
  \edef\myxshift{\x}            % or \pgfmathsetmacro{\myxshift}{\x}
  \edef\myyshift{\y}            % or \pgfmathsetmacro{\myyshift}{\y}

  \node (n1) [anchor=north west, xshift=\myxshift, yshift=\myyshift]
    at (current page.north west)
    {\includegraphics[height=5cm]{example-image-b}};
\end{tikzpicture}

\newpage
}
\end{document}

页面

相关内容