如何在 2 x A5 中复制在多页上以 A5 格式编写的 tcolorbox?

如何在 2 x A5 中复制在多页上以 A5 格式编写的 tcolorbox?

我编写了一个Dupli环境,允许我在一张 A4 纸上打印两张相同的 A5 纸。

%%%%%%%%%%%%%%%%%%%%%%%%%   
% environnement Dupli
\newlength{\ligne}%
\newsavebox{\maboite}%
\newlength\tindent%
\newlength\ttopskip%

\newenvironment{Dupli}[1]{%
\def\mtfois{#1}%
\setlength{\topskip}{0mm}%
 \setlength{\tindent}{\parindent}%
\setlength{\parindent}{0pt}%
\setlength{\ligne}{0.46\textwidth}%
\setbox\maboite\hbox\bgroup%
\begin{minipage}[t]{.46\textwidth}%
}{%
\end{minipage}\egroup%
%\noindent% 
\vspace*{\stretch{1}}%
\foreach \i in {1,...,\mtfois} {%
%\vspace*{\stretch{1}}%
\parbox{\textwidth}{%
\hfill\usebox{\maboite}%
\hfill\vrule\hfill%
\usebox{\maboite}\hfill{\null}%
}% fin de la parbox
\vspace*{\stretch{1}}%
\par\noindent%
}% fin du foreach \i
%\vfill
\setlength{\parindent}{\tindent}%
\setlength{\topskip}{\ttopskip}%
}
% fin environnement Dupli
%%%%%%%%%%%%%%%%%%%%%%%%%%%

我用它来创建课程摘要这些 tcolorbox

截屏

我希望这个盒子能够使用可拆分选项扩展到多页。

Dupli环境不允许中断。

目前,当摘要需要几页时,我会单独创建每一页。我想只创建一个摘要,但保留摘要页码(1/3 2/3 3/3 等)在右上角。

截图完整代码:

\documentclass[a4paper, 11pt,landscape]{article}  
\usepackage[margin=0cm]{geometry}
\usepackage{lipsum}

\usepackage{ifthen}
\usepackage{pgffor} 
\usepackage{emerald}
\usepackage{xfrac}
\usepackage{emerald}
\usepackage[most]{tcolorbox}    
\usepackage{atveryend}

%%%%%%%%%%%%%%%%%%%%%%%%%   
% environnement Dupli
\newlength{\ligne}%
\newsavebox{\maboite}%
\newlength\tindent%
\newlength\ttopskip%

\newenvironment{Dupli}[1]{%
\def\mtfois{#1}%
\setlength{\topskip}{0mm}%
 \setlength{\tindent}{\parindent}%
\setlength{\parindent}{0pt}%
\setlength{\ligne}{0.46\textwidth}%
\setbox\maboite\hbox\bgroup%
\begin{minipage}[t]{.46\textwidth}%
}{%
\end{minipage}\egroup%
%\noindent% 
\vspace*{\stretch{1}}%
\foreach \i in {1,...,\mtfois} {%
%\vspace*{\stretch{1}}%
\parbox{\textwidth}{%
\hfill\usebox{\maboite}%
\hfill\vrule\hfill%
\usebox{\maboite}\hfill{\null}%
}% fin de la parbox
\vspace*{\stretch{1}}%
\par\noindent%
}% fin du foreach \i
%\vfill
\setlength{\parindent}{\tindent}%
\setlength{\topskip}{\ttopskip}%
}
% fin environnement Dupli
%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% from https://tex.stackexchange.com/a/470933/138900
%  resume box
\NewDocumentCommand{\currentschoolyear}{+o}{%
  \IfValueTF{#1}{%
    \sfrac{#1}{\the\numexpr#1+1}
  }{%
    \ifnum\month<9%
    \sfrac{\the\numexpr\year-1}{\the\year}%
    \else
    \sfrac{\the\year}{\the\numexpr\year+1}%
    \fi
  }%
}

\def\couleurresume{red}%
% style du titre « résumé du cours »
\tcbset{titreresume/.style={
    boxed title style={
        colframe=\couleurresume!50,%
        colback=\couleurresume!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt}}
}

% style des soustitres des résumés
\tcbset{soustitre/.style={
    subtitle style={%
    colback=\couleurresume!7,%
    colframe=\couleurresume!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{\couleurresume!63!black}}}}
}

% style du titre-boxed des encadrés
\tcbset{titrecadre/.style={%
    minipage boxed title*=-.5\linewidth,
    boxed title style={
        boxrule=.8pt,boxsep=0pt,toptitle=0pt,
        colframe=\couleurresume!55,colback=white},
    halign title=left}
}


\NewTColorBox[auto counter]{resume}{+o+m}{%
    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-\linewidth/5},
    enhanced,
    nobeforeafter,
    breakable,
    lower separated=false,
    IfValueTF={#1}{%
      before upper={\textcolor{\couleurresume!63!black}{\currentschoolyear[#1] \hfill{#2}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    }{%
      before upper={\textcolor{\couleurresume!63!black}{\currentschoolyear \hfill{#2}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    },
    colframe=\couleurresume!50,%
    colback=white,%
    coltitle=\couleurresume!63!black,%
leftrule=3mm,rightrule=3mm,toprule=2pt,bottomrule=2pt,left=3pt,right=0pt,top=3mm,
fonttitle=\sffamily\bfseries\large,
    titreresume,soustitre,title={\normalsize Résumé}
}

\makeatletter
\AfterLastShipout{%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
}
\makeatother
% end of resume box
%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\thispagestyle{empty}

\def\couleurresume{red}%
\begin{Dupli}{1}
\begin{resume}{breakable resume}
\tcbsubtitle{long text}
\lipsum[1]



\end{resume}
\end{Dupli}
\end{document}
  1. 是否可以使我的Dupli环境变得可破坏,以便我不需要创建与页面一样多的摘要框?
  2. 如果没有的话,是否可以通过其他方式获得相同的结果?

使用 www.DeepL.com/Translator 翻译

答案1

以下代码展示了一个使用tcolorbox工具的解决方案。它使用magazine库将所需文本拆分并存储在 中boxarray,然后使用 打印这些部分tcbraster。此解决方案基于Leaflet example来自tcolorbox文档。

少了什么东西?:

  • 我无法保存数组大小以供标题参考
  • 利润率必须调整
  • 楼主没有解释破损部件的标题是什么

到目前为止的代码如下所示:

\documentclass[a4paper, 11pt, landscape]{article}  
\usepackage[margin=0.5cm]{geometry}
\usepackage{lipsum}

\usepackage{ifthen}
\usepackage{pgffor} 
\usepackage{emerald}
\usepackage{xfrac}
\usepackage{emerald}
\usepackage[most]{tcolorbox}    
\usepackage{atveryend}

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% from https://tex.stackexchange.com/a/470933/138900
%  resume box
\NewDocumentCommand{\currentschoolyear}{+o}{%
  \IfValueTF{#1}{%
    \sfrac{#1}{\the\numexpr#1+1}
  }{%
    \ifnum\month<9%
    \sfrac{\the\numexpr\year-1}{\the\year}%
    \else
    \sfrac{\the\year}{\the\numexpr\year+1}%
    \fi
  }%
}

\def\couleurresume{red}%
% style du titre « résumé du cours »
\tcbset{titreresume/.style={
    boxed title style={
        colframe=\couleurresume!50,%
        colback=\couleurresume!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt}}
}

% style des soustitres des résumés
\tcbset{soustitre/.style={
    subtitle style={%
    colback=\couleurresume!7,%
    colframe=\couleurresume!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{\couleurresume!63!black}}}}
}

% style du titre-boxed des encadrés
\tcbset{titrecadre/.style={%
    minipage boxed title*=-.5\linewidth,
    boxed title style={
        boxrule=.8pt,boxsep=0pt,toptitle=0pt,
        colframe=\couleurresume!55,colback=white},
    halign title=left}
}

\NewTColorBox[auto counter]{resume}{+o+m}{%
    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-3cm},
    enhanced,
    nobeforeafter,
    breakable,
    width=.5\textwidth,
    break at=\textheight,
    reset box array,
    store to box array,
    lower separated=false,
    IfValueTF={#1}{%
      before upper={\textcolor{\couleurresume!63!black}{\currentschoolyear[#1] \hfill{#2}\hfill\thetcbbreakpart/\ref{nombre-de-resume}}},
    }{%
      before upper={\textcolor{\couleurresume!63!black}{\currentschoolyear \hfill{#2}\hfill\thetcbbreakpart/\ref{nombre-de-resume}}},
    },
    colframe=\couleurresume!50,%
    colback=white,%
    coltitle=\couleurresume!63!black,%
leftrule=3mm,rightrule=3mm,toprule=2pt,bottomrule=2pt,left=3pt,right=0pt,top=3mm,
fonttitle=\sffamily\bfseries\large,
    titreresume,soustitre,title={\normalsize Résumé}
}

\makeatletter
\AfterLastShipout{%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
}
\makeatother
% end of resume box
%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\thispagestyle{empty}

\def\couleurresume{red}%

%This "resume" is broken in parts and stores in "default" array.
\begin{resume}{breakable resume}
\tcbsubtitle{long text}
\lipsum[1-15]
\end{resume}

%The array is printed inside a `tcbraster`
\boxarraygetsize{\mysize}
\begin{tcbraster}[blankest, raster columns=2]
\foreach \i in {1,...,\mysize}{%
    \begin{tcolorbox}
        \useboxarray{\i}
    \end{tcolorbox}%
    \begin{tcolorbox}
        \useboxarray{\i}
    \end{tcolorbox}%
}
\end{tcbraster}
\end{document}

在此处输入图片描述

更新:

下面的代码显示了一些改进(我希望如此!)到之前的解决方案:

  1. geometry打印边距(见注释)。外部边距在包选项中用hmargin和定义vmargin。除此之外,每个框都定义为具有一定的width。此宽度表示打印的 tcolorbox 的整个宽度,包括文本和边框。如果我们想并行打印两个相等的框,框的最大宽度将为width=.5\textwidth。低于此值的任何内容都将允许框之间有一些水平空间。
  2. 片段枚举。命令\boxarraygetsize将片段数保存到宏中。此宏存储在.aux文件中并引用以在每个框中编写 fragment-num/total-fragments 标签。
  3. 片段标题。没有片段标题,但已保留一些空间,pad after break并且命令中包含标签 fragment-num/total-fragments overlay
  4. 整体构成。在以下代码中,tcbraster已被删除。我不知道如何将存储的框居中放入栅格列(我认为这是不可能的),并且栅格已被 替换 \useboxarray{\i}\hspace{...}\consumeboxarray{\i}\\。这样,每个页面上都会放置两个框,因为原始文本已在 上分散\textheight。如果width小于 ,.5\textwidth\hspace可以在同一行上的框之间包含一些。

现在代码:

\documentclass[a4paper, 11pt, landscape]{article}  
\usepackage[hmargin={2cm,2cm}, vmargin={2cm,2cm}]{geometry}
\usepackage{lipsum}

\usepackage{ifthen}
\usepackage{pgffor} 
\usepackage{emerald}
\usepackage{xfrac}
\usepackage{emerald}
\usepackage[most]{tcolorbox}    
\usepackage{atveryend}

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% from https://tex.stackexchange.com/a/470933/138900
%  resume box
\NewDocumentCommand{\currentschoolyear}{+o}{%
  \IfValueTF{#1}{%
    \sfrac{#1}{\the\numexpr#1+1}
  }{%
    \ifnum\month<9%
    \sfrac{\the\numexpr\year-1}{\the\year}%
    \else
    \sfrac{\the\year}{\the\numexpr\year+1}%
    \fi
  }%
}

\def\couleurresume{red}%
% style du titre « résumé du cours »
\tcbset{titreresume/.style={
    boxed title style={
        colframe=\couleurresume!50,%
        colback=\couleurresume!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt}}
}

% style des soustitres des résumés
\tcbset{soustitre/.style={
    subtitle style={%
    colback=\couleurresume!7,%
    colframe=\couleurresume!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{\couleurresume!63!black}}}}
}

% style du titre-boxed des encadrés
\tcbset{titrecadre/.style={%
    minipage boxed title*=-.5\linewidth,
    boxed title style={
        boxrule=.8pt,boxsep=0pt,toptitle=0pt,
        colframe=\couleurresume!55,colback=white},
    halign title=left}
}

\NewTColorBox[auto counter]{resume}{+o+m}{%
%    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-3cm},
    enhanced,
    nobeforeafter,
    breakable,
    pad after break = 1cm,
    overlay middle and last={
        \node[anchor=north east, color=\couleurresume!63!black] at (interior.north east) {\thetcbbreakpart/\ref{nombre-de-array}};
    },
    width=.5\textwidth,
    break at=\textheight,
    reset box array,
    store to box array,
    lower separated=false,
    IfValueTF={#1}{%
      before upper={\textcolor{\couleurresume!63!black}{\currentschoolyear[#1] \hfill{#2}\hfill\thetcbbreakpart/\ref{nombre-de-array}}},
    }{%
      before upper={\textcolor{\couleurresume!63!black}{\currentschoolyear \hfill{#2}\hfill\thetcbbreakpart/\ref{nombre-de-array}}},
    },
    colframe=\couleurresume!50,%
    colback=white,%
    coltitle=\couleurresume!63!black,%
leftrule=3mm,rightrule=3mm,toprule=2pt,bottomrule=2pt,left=3pt,right=0pt,top=3mm,
fonttitle=\sffamily\bfseries\large,
    titreresume,soustitre,title={\normalsize Résumé}
}

\makeatletter
\AfterLastShipout{%
%  \immediate\write\@auxout
%  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-array}{{\mysize}{}}}%
}
\makeatother
% end of resume box
%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\thispagestyle{empty}

\def\couleurresume{red}%

%This "resume" is broken in parts and stores them in "default" array.
\begin{resume}{breakable resume}
\tcbsubtitle{long text}
\lipsum[1-8]
\end{resume}

\boxarraygetsize{\mysize}
\foreach \i in {1,...,\mysize}{%
        \centering
        \noindent\useboxarray{\i}\hspace*{0mm}%
        \consumeboxarray{\i}\\
}

\end{document}

结果如下:

在此处输入图片描述

答案2

这利用了atbegshi由 加载的eso-pic,将页面内容放入一个框 中\AtBeginShipoutBox。这个框可以复制。以下是原理证明,无论 都可以工作tcolorbox。但是,它确实假设用户足够小心,将内容限制在页面左侧。有很多方法可以扩展这一点(我相信有人会这样做,因为这个答案不可能被接受),我公开承认,由于这个原因,我手动设计了一些小的偏移,而不是精确地找出如何根据页面几何形状计算它们。此外,人们不一定需要使用 TiZ 在这里,机制就eso-pic足够了,但您正在加载,tcolorbox所以这没什么额外的。无论如何,这个例子展示了这个原则:添加一个钩子,将发货框复制到文档的右半部分。

\documentclass[a4paper, 11pt,landscape]{article}
\usepackage[breakable]{tcolorbox}
\usepackage{lipsum}
\usepackage{eso-pic}
\usepackage{tikz}
\makeatletter
\AddToShipoutPictureFG{\begin{tikzpicture}[overlay,remember picture]
\node at ([xshift=\textwidth/4+2em,yshift=0.9em]current page.center) {\copy\AtBeginShipoutBox};
\end{tikzpicture}}
\makeatother
\pagestyle{empty}
\begin{document}
\foreach \X [count=\Y] in {Duck,Marmot,Koala,Bear,Cat}
{\section{\X}
\begin{tcolorbox}[breakable,width=0.46\textwidth]
  \lipsum[\Y]
\end{tcolorbox}}
\end{document}

(我应该提到,有软件可以对 pdf 文件执行相同的操作。至少我是这么认为的,在过去,那是一些 postscript 命令,可能是psnup,也可能不是,允许人们对 ps 文件执行此操作。)

在此处输入图片描述

附录:似乎存在误解:此解决方案确实不是制作与页面数量相同的盒子。为了更清楚地说明这一点,我添加了另一个示例。

\documentclass[a4paper, 11pt,landscape]{article}
\usepackage[breakable,skins]{tcolorbox}
\usepackage{lipsum}
\usepackage{eso-pic}
\usepackage{tikz}
\makeatletter
\AddToShipoutPictureFG{\begin{tikzpicture}[overlay,remember picture]
\node at ([xshift=\textwidth/4+2em,yshift=0.9em]current page.center) {\copy\AtBeginShipoutBox};
\end{tikzpicture}}
\makeatother
\pagestyle{empty}
\begin{document}
\section{One very long box}
\begin{tcolorbox}[enhanced jigsaw,breakable,width=0.46\textwidth]
  \lipsum[1-5]
\end{tcolorbox}
\end{document}

在此处输入图片描述

这有什么用呢?只是复制左边的列对我来说有点无聊。这里的重点是你可以玩 TiZ. 这是一个镜像左列的应用程序,但显然您可以旋转它,更改不透明度,甚至将其公开(使用fadings)。

\documentclass[a4paper, 11pt,landscape]{article}
\usepackage[breakable,skins]{tcolorbox}
\usepackage{lipsum}
\usepackage{eso-pic}
\usepackage{tikz}
\makeatletter
\AddToShipoutPictureFG{\begin{tikzpicture}[overlay,remember picture]
\node at ([xshift=\textwidth/4+2em,yshift=0.9em]current page.center) 
[xscale=-1]{\copy\AtBeginShipoutBox};
\end{tikzpicture}}
\makeatother
\pagestyle{empty}
\begin{document}
\section{One very long box}
\begin{tcolorbox}[enhanced jigsaw,breakable,width=0.46\textwidth]
  \lipsum[1-5]
\end{tcolorbox}
\end{document}

在此处输入图片描述

相关内容