使用tcolorbox的if odd page选项

使用tcolorbox的if odd page选项

从这个解决方案开始,针对我的旧帖子:前页或后页的距离可变,我怎样才能设置宽度和高度tcolorbox,以取决于该框是放在奇数页还是偶数页?

我建议从以下代码开始,该代码基于上述链接中的答案的代码:

\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\usepackage[strict]{changepage}
\usepackage{tcolorbox}
\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}

\newlength{\xlengthForOddPages}
\newlength{\xlengthForEvenPages}
\newlength{\ylengthForOddPages}
\newlength{\ylengthForEvenPages}

\setlength{\xlengthForOddPages}{2cm}
\setlength{\xlengthForEvenPages}{10cm}
\setlength{\ylengthForOddPages}{1.5cm}
\setlength{\ylengthForEvenPages}{5cm}

\newcommand*{\xpageDependent}{%
  \ifoddpage
    \expandafter
    \xlengthForOddPages
  \else
    \expandafter
    \xlengthForEvenPages
  \fi
}

\newcommand*{\ypageDependent}{%
  \ifoddpage
    \expandafter
    \ylengthForOddPages
  \else
    \expandafter
    \ylengthForEvenPages
  \fi
}

\begin{document}

\DTLforeach*{mydata1}{\A=Acol,\B=Bcol,\C=Ccol}%
{%
  \begin{tcolorbox}[width=\xpageDependent,height=\ypageDependent,title={Title}]
  %\begin{tcolorbox}[width=\checkoddpage{\xpageDependent},height=\checkoddpage{\ypageDependent},title={title}]
    \C
  \end{tcolorbox}
  \newpage
}%

\end{document}

谢谢

答案1

我提出两种解决方案。

使用tcolorboxif odd page选项

tcolorbox有特殊选项,可根据框位于奇数页还是偶数页来运行不同的代码。在这里,我们使用来if odd page设置widthheight选项。如果您有可破坏的框,请阅读部分偶数和奇数页tcolorbox手动的(您可能有兴趣使用if odd page*,这取决于您想要分割的部分)。

\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\usepackage{tcolorbox}

\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}

\newlength{\xlengthForOddPages}
\newlength{\xlengthForEvenPages}
\newlength{\ylengthForOddPages}
\newlength{\ylengthForEvenPages}

\setlength{\xlengthForOddPages}{2cm}
\setlength{\xlengthForEvenPages}{10cm}
\setlength{\ylengthForOddPages}{1.5cm}
\setlength{\ylengthForEvenPages}{5cm}

\begin{document}

\DTLforeach*{mydata1}{\A=Acol,\B=Bcol,\C=Ccol}%
{%
\begin{tcolorbox}[
  if odd page={width=\xlengthForOddPages,
               height=\ylengthForOddPages}%
              {width=\xlengthForEvenPages,
               height=\ylengthForEvenPages},
  title={Title}]
  \C
\end{tcolorbox}
\newpage
}

\end{document}

使用 的tcolorbox选项phantom\ifoddpage

我们仍然可以使用那个答案tcolorbox,但我们需要确保\checkoddpage被调用:

  • \xpageDependent在或\ypageDependent、和的相应用法之前

  • 在一个我们可以确定的地方\checkoddpage会在同一页面作为tcolorbox

这可以使用tcolorboxphantom选项来完成,它显然是为这种用途而设计的:1

确保标签引用正确的页码。

(看计数器、标签和引用在里面tcolorbox手动的

此选项的一个困难是运行用户提供的代码在 TeX 组中,然而\checkoddpage然而,设置条件的当地的(我的意思是,表示 是否等于 或 的赋值\ifoddpage)。\let因此,如果我们使用这种技术,我们需要全局传播本地设置的“标志” 。这可以按如下方式完成:\iftrue\iffalse\ifoddpage\checkoddpage

\newcommand*{\mycheckoddpage}{%
  \checkoddpage
  \global\let\ifmyoddpage=\ifoddpage
}

这样,全局设置的标志\ifmyoddpage将在选项启动的组之外可见。然后我们只需要在和phantom的定义中测试这个标志。\xpageDependent\ypageDependent

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

\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}

\newlength{\xlengthForOddPages}
\newlength{\xlengthForEvenPages}
\newlength{\ylengthForOddPages}
\newlength{\ylengthForEvenPages}

\setlength{\xlengthForOddPages}{2cm}
\setlength{\xlengthForEvenPages}{10cm}
\setlength{\ylengthForOddPages}{1.5cm}
\setlength{\ylengthForEvenPages}{5cm}

\newif\ifmyoddpage              % always set globally, contrary to \ifoddpage

\newcommand*{\xpageDependent}{%
  \ifmyoddpage
    \expandafter
    \xlengthForOddPages
  \else
    \expandafter
    \xlengthForEvenPages
  \fi
}

\newcommand*{\ypageDependent}{%
  \ifmyoddpage
    \expandafter
    \ylengthForOddPages
  \else
    \expandafter
    \ylengthForEvenPages
  \fi
}

\newcommand*{\mycheckoddpage}{%
  \checkoddpage
  \global\let\ifmyoddpage=\ifoddpage
}

\begin{document}

\DTLforeach*{mydata1}{\A=Acol,\B=Bcol,\C=Ccol}%
{%
\begin{tcolorbox}[phantom={\mycheckoddpage},
                  width=\xpageDependent,height=\ypageDependent,
                  title={Title}]
  \C
\end{tcolorbox}
\newpage
}

\end{document}

注意:也可以\mycheckoddpage按如下方式定义,结果相同:

\newcommand*{\mycheckoddpage}{%
  \checkoddpage
  \ifoddpage
    \global\myoddpagetrue       % global assignment
  \else
    \global\myoddpagefalse      % global assignment
  \fi
}

截图

上面给出的两个示例都产生了相同的输出。使用 Gimp 排列此输出,使所有框都位于同一图像上(以避免在此处显示五张几乎空白的页面),可获得:

同一张图片上的所有框


脚注

  1. \checkoddpage其工作原理是,在使用标签的地方设置新标签,并测试该标签的页码是奇数还是偶数。

相关内容