如何让 TikZ 矩阵在达到一定列数时自动开始新行?

如何让 TikZ 矩阵在达到一定列数时自动开始新行?

我希望设置 TikZ 矩阵中的最大列数,并且如果我在达到最大列数时开始一个新单元格,则 LaTeX 会将该单元格放在新行中。

一种方法是使用命令检查当前列号并确定是否用&或替换\\

背景:

我正在制作 PDF 以便在一系列自粘标签上打印,如下所示: 自粘标签

创建标签时,如果当前行已满,我必须插入\\而不是&插入,这很不方便。有时我想修改文件,即删除一个项目,我必须移动每个后续项目\\以使换行符正确。

更新:

代码发布在这里以提供更多解释。我想让元素的每个位置都在我的控制之下,所以我将矩阵相对于纸张边缘锚定。如果打印机没有引起偏移,则以下代码生成的边界框将与纸张上的预切接缝重合。

    \documentclass[a4paper]{article}
    \usepackage{qrcode}
    \usepackage{tikz}
    \usepackage{hyperref}
    \usepackage{xifthen} % provides \isempty test
    \usepackage{pst-barcode}
    \usetikzlibrary{positioning}

    \pagestyle{empty}

    \newcommand{\Label}[2][]{
        \draw (0cm,0cm) rectangle (3cm,-4cm) node (framesoutheast) {};
        \path (0cm,0cm) -- node[midway,anchor=north,inner sep=0pt,yshift=-4mm] (qrcode) {
            \begin{pspicture}(0.9in,0.9in)
                \psbarcode{https://wiki.thu-skyworks.org/#2}{width=0.9 height=0.9}{qrcode}
            \end{pspicture}
            %\qrcode[2cm]{https://wiki.thu-skyworks.org/#2}
            %\XeTeXinputencoding "utf8"
        }(3cm,0cm);
        \node[anchor=south west,inner sep=1mm,outer sep=0pt] (logo) at (0mm,-40mm) {\includegraphics[width=9mm]{any_square_image}};
        \path (logo.east) -- node[anchor=center,text width=19mm,align=center,font=\sffamily\small]{\ifthenelse{\isempty{#1}}{#2}{#1}}
        (logo.east-|framesoutheast);
    }

    \begin{document}

    \begin{tikzpicture}[remember picture,overlay]
        \matrix[row sep={4cm,between origins}, column sep = {32mm,between origins},matrix anchor=north west,inner sep=0pt,xshift=10mm,yshift=-8mm] at (current page.north west) {
        %\XeTeXinputencoding "byte"
            \Label{Label\ one} & \Label[If need\\manual break]{If\ need\ manual\ break} & \Label{Label\ 3} &
            \Label{Label 4} & \Label{Label 5} & \Label{Label 6} \\ % I want to make this line break auto
            \Label{Label 7} \\
        };
    \end{tikzpicture}

    \end{document}

答案1

您可以使用计数器来计算标签。每标记一个标签后,计数器增加一倍。如果计数器为 6,则插入\\并重置计数器,否则插入(或者更确切地说,矩阵中的&的定义是)。&\pgfmatrixnextcell

\newcounter{colnr}
\setcounter{colnr}{0}
\newcommand{\lb}{%
  \stepcounter{colnr}%
  \ifthenelse{\value{colnr}=6}{\setcounter{colnr}{0}\\}{\pgfmatrixnextcell}%
}

将矩阵中的所有&和替换为,除了最后的。\\\lb\\

答案2

作为矩阵的替代,TiKZ您可以使用tcbraster构造tcolorbox。您定义raster columns值,并列出所有元素。tcbraster将分发它们并在需要时分行和分页。

以下代码显示了如何声明它。选项raster force size=false保持内部框的大小,否则内部raster columns框将缩放以适合一行文本。

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage[hmargin={1cm,1cm},vmargin={1cm,1cm}]{geometry}
\begin{document}
\begin{tcbraster}[raster columns=6, raster every box/.style={blankest, width=3cm}, raster force size=false]
    \foreach \i in {1,...,20}{%
        \tcbincludegraphics{example-image}
        \tcbincludegraphics{example-image-A}
        \tcbincludegraphics{example-image-B}
        \tcbincludegraphics{example-image-C}
    }
\end{tcbraster}
\end{document}

在此处输入图片描述

相关内容