这个问题涉及使用创建记忆游戏Tikz
。我想寻求帮助创建一个将记忆卡放在页面上的循环。
我相信有很多标准,但让我们选择一个:
- 记忆游戏打印在三页上,由 32x2 方形卡片组成
- 两页包含 4x6 卡片,第三页包含 16 张卡片(下图显示了布局)
问题是:如何将卡片放入foreach
循环中,并在值数组中传递几个参数?参数数组将是:图像文件的名称、文本、颜色值。
伪foreach
循环将如下所示:将第一幅图像放入数组中,将第一个标题放入数组中并使用数组中的第一个颜色;将位置移动xshift=71pt
,放置第二个...将第四幅图像移动yshift
...
小更新:使用这种循环方式,可以轻松创建卡片背面,传递相同的图像文件值。另一方面,所有内容都需要居中。
\documentclass[12pt]{article}
% ############################## geometry
\usepackage{geometry}
\geometry{
headsep = 0pt,
headheight= 0pt,
hmarginratio = 1:1,
vmarginratio = 1:1,
bindingoffset = 0cm,
onecolumn,
a3paper,
layoutwidth = 220 mm,
layoutheight = 320 mm,
layouthoffset=\dimexpr(\paperwidth-\csname Gm@layoutwidth\endcsname)/2\relax,
layoutvoffset=\dimexpr(\paperheight-\csname Gm@layoutheight\endcsname)/2\relax,
showcrop
}
\usepackage[icelandic, latin, czech]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{title}{RGB}{16, 13, 32}
\usepackage{mwe}
\usepackage{XCharter}
% ############################### Document
\newcommand{\czHyphen}{\rule[.45ex]{.2em}{.11ex}}
\newcommand*{\addthinS}{\hskip0.06667em\relax}
\newcommand*{\addthinSS}{\hskip0.00007em\relax}
\def\cropmarkgap{1}% mm
\makeatletter
\def\Gm@cropmark(#1,#2,#3,#4){% #1 = x direction, #2 = y direction, #3 & #4 no longet used
\begin{picture}(0,0)
\setlength\unitlength{1truemm}%
\linethickness{0.25pt}%
\put(\the\numexpr #1*\cropmarkgap\relax,0){\line(#1,0){\the\numexpr 20-\cropmarkgap}}%
\put(0,\the\numexpr #2*\cropmarkgap\relax){\line(0,#2){\the\numexpr 20-\cropmarkgap}}%
\end{picture}}%
\makeatother
\makeatletter
\def\parsecomma#1,#2\endparsecomma{\def\page@x{#1}\def\page@y{#2}}
\tikzdeclarecoordinatesystem{page}{
\parsecomma#1\endparsecomma
\pgfpointanchor{current page}{north east}
% Save the upper right corner
\pgf@xc=\pgf@x%
\pgf@yc=\pgf@y%
% save the lower left corner
\pgfpointanchor{current page}{south west}
\pgf@xb=\pgf@x%
\pgf@yb=\pgf@y%
% Transform to the correct placement
\pgfmathparse{(\pgf@xc-\pgf@xb)/2.*\page@x+(\pgf@xc+\pgf@xb)/2.}
\expandafter\pgf@x\expandafter=\pgfmathresult pt
\pgfmathparse{(\pgf@yc-\pgf@yb)/2.*\page@y+(\pgf@yc+\pgf@yb)/2.}
\expandafter\pgf@y\expandafter=\pgfmathresult pt
}
\makeatother
\usepackage{eso-pic}
\usepackage{tikzpagenodes}
%\AddToShipoutPicture{\drawbackground}
\newcommand{\shiftleft}{\hspace*{-0.55\dimexpr\csname Gm@layoutwidth\endcsname-\textwidth\relax}}
\newcommand{\shiftup}{\vspace*{-0.13\dimexpr\csname Gm@layoutheight\endcsname-\textwidth\relax}}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[remember picture, overlay]
\tikzset{p_title/.style={text centered, minimum height=0.6cm, minimum width=5cm, font=\bfseries}}
\tikzset{p_title_line/.style={ultra thin, color=violet}}
\node[inner sep=0pt] (A) at (page cs:-0.5045,0.595)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(A.north west)$) rectangle ($(A.south east)$);
\node [p_title] (AA) at ($(A.north west)+(2.5,-0.30)$) {{title text}};
\draw [p_title_line](AA.south west) -- (AA.south east);
\node[inner sep=0pt] (B) at ([xshift=71pt]A.east)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(B.north west)$) rectangle ($(B.south east)$);
\node [p_title] (BB) at ($(B.north west)+(2.5,-0.30)$) {{amma}};
\draw [p_title_line](BB.south west) -- (BB.south east);
\node[inner sep=0pt] (C) at ([xshift=71pt]B.east)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(C.north west)$) rectangle ($(C.south east)$);
\node [p_title] (CC) at ($(C.north west)+(2.5,-0.30)$) {{banka}};
\draw [p_title_line](CC.south west) -- (CC.south east);
\node[inner sep=0pt] (D) at ([xshift=71pt]C.east)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(D.north west)$) rectangle ($(D.south east)$);
\node [p_title] (DD) at ($(D.north west)+(2.5,-0.30)$) {{strætó}};
\draw [p_title_line](DD.south west) -- (DD.south east);
% second line
\node[inner sep=0pt] (E) at ([yshift=-71pt]A.south)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(E.north west)$) rectangle ($(E.south east)$);
\node [p_title] (EE) at ($(E.north west)+(2.5,-0.30)$) {{bíll}};
\draw [p_title_line](EE.south west) -- (EE.south east);
\node[inner sep=0pt] (F) at ([xshift=71pt]E.east)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(F.north west)$) rectangle ($(F.south east)$);
\node [p_title] (FF) at ($(F.north west)+(2.5,-0.30)$) {{strætó}};
\draw [p_title_line](FF.south west) -- (FF.south east);
\node[inner sep=0pt] (G) at ([xshift=71pt]F.east)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(G.north west)$) rectangle ($(G.south east)$);
\node [p_title] (GG) at ($(G.north west)+(2.5,-0.30)$) {{banka}};
\draw [p_title_line](GG.south west) -- (GG.south east);
\node[inner sep=0pt] (H) at ([xshift=71pt]G.east)
{\includegraphics[width=5cm]{example-image}};
\draw[black, ultra thick] ($(H.north west)$) rectangle ($(H.south east)$);
\node [p_title] (HH) at ($(H.north west)+(2.5,-0.30)$) {{autobus}};
\draw [p_title_line](HH.south west) -- (HH.south east);
%third line
\end{tikzpicture}
\clearpage
\end{document}
答案1
这是一个使用标准 TeX “数组”方法的选项(一个例子): 使用\csname
- \endcsname
(或在本例中为 LaTeX 包装器\@namedef
和\@nameuse
)来定义带有数字的控制序列(即数组索引)。
对于您的项目,这需要三个“数组”,一个用于图像名称,一个用于卡片标题,一个用于卡片颜色。以下是界面的设置:
%%% Define "Array" interface
\makeatletter
\newcounter{imgs}
\setcounter{imgs}{0}
%#1 is the image
%#2 is the title
%#3 is the color
\newcommand{\addimg}[3]{%
\stepcounter{imgs}%
\@namedef{imgimage\theimgs}{#1}%
\@namedef{imgtitle\theimgs}{#2}%
\@namedef{imgcolor\theimgs}{#3}}
\newcommand{\getimage}[1]{\expandafter\@nameuse\expandafter{imgimage#1}}%
\newcommand{\gettitle}[1]{\expandafter\@nameuse\expandafter{imgtitle#1}}%
\newcommand{\getcolor}[1]{\expandafter\@nameuse\expandafter{imgcolor#1}}%
\makeatother
“元素”通过命令添加到“数组”中\addimg
。对于 32 张独特的卡片,如下所示:
%%% Define Cards
\addimg{example-image-A}{one}{blue}%
\addimg{example-image-B}{two}{green}%
\addimg{example-image-C}{three}{red}%
\addimg{example-image-A}{four}{yellow}%
\addimg{example-image-B}{five}{orange}%
\addimg{example-image-C}{six}{yellow}%
\addimg{example-image-A}{seven}{red}%
\addimg{example-image-B}{eight}{brown}%
\addimg{example-image-C}{nine}{green}%
\addimg{example-image-A}{ten}{blue}%
\addimg{example-image-B}{eleven}{green}%
\addimg{example-image-C}{twelve}{red}%
\addimg{example-image-A}{thirteen}{yellow}%
\addimg{example-image-B}{fourteen}{orange}%
\addimg{example-image-C}{fifteen}{yellow}%
\addimg{example-image-A}{sixteen}{red}%
\addimg{example-image-B}{seventeen}{brown}%
\addimg{example-image-C}{eighteen}{green}%
\addimg{example-image-A}{nineteen}{blue}%
\addimg{example-image-B}{twenty}{green}%
\addimg{example-image-C}{twenty one}{red}%
\addimg{example-image-A}{twenty two}{yellow}%
\addimg{example-image-B}{twenty three}{orange}%
\addimg{example-image-C}{twenty four}{yellow}%
\addimg{example-image-A}{twenty five}{red}%
\addimg{example-image-B}{twenty six}{brown}%
\addimg{example-image-C}{twenty seven}{green}%
\addimg{example-image-A}{twenty eight}{blue}%
\addimg{example-image-B}{twenty nine}{green}%
\addimg{example-image-C}{thirty}{red}%
\addimg{example-image-A}{thirty one}{yellow}%
\addimg{example-image-B}{thirty two}{orange}%
通过适当的“get”命令从各自的“数组”访问“元素”。这允许使用单个 for 循环。参数化每行的长度和图像数量:
%%% Global Setup
\newcommand\xspacing{71pt}%<== space between the images
\newcommand\yspacing{71pt}%<== vertical space between rows
\newcommand\imgperrow{4}%<== number of images per row
\tikzset{p_title/.style={text centered, minimum height=0.6cm, minimum width=5cm, font=\bfseries}}
\tikzset{p_title_line/.style={ultra thin, color=violet}}
%%% Define primary for loop
\newcommand{\forloop}[2]{%
\foreach \x in {#1,...,#2}%<==loop for each image in the array
{
\edef\gonode{\noexpand\node[inner sep=0pt] (B) at (A) {\noexpand\includegraphics[width=5cm]{\getimage{\x}}};}%<==Edit to expand the file name
\gonode%\node [inner sep=0pt] (B) at (A) {\includegraphics[width=5cm]{\getimage{\x}}};%
\draw [black, ultra thick] ($(B.north west)$) rectangle ($(B.south east)$);%
\node [p_title] (AA) at ($(B.north west)+(2.5,-0.30)$) {\gettitle{\x}};%
\draw [p_title_line, color=\getcolor{\x}](AA.south west) -- (AA.south east);%
\pgfmathparse{Mod(\x,\imgperrow)==0?1:0};%
\ifnum\pgfmathresult>0
\coordinate (left) at ([yshift=-\yspacing]left);
\path let \p1=(left),\p2=(B.south) in coordinate (A) at (\x1,\y2-\yspacing);
\else
\coordinate (A) at ([xshift=\xspacing]B.east);%
\fi
}}
%%% Define the for loop for 2 images per row on third page
\newcommand{\forlooptwo}[2]{%
\begingroup
\def\imgperrow{2}
\let\originalxspacing\xspacing
\def\xspacing{5*\originalxspacing}
\forloop{#1}{#2}\endgroup}
和\xshift
通过\yshift
计算确定模数count
和的\imgperrow
.\forlooptwo
用于第三页的四行,其中跳过了两个空格。这是通过重新定义\imgperrow
和来实现的\xspacing
。
然后使用以下命令创建三个页面:
\begin{document}
\pagestyle{empty}
%first page
\begin{tikzpicture}[remember picture, overlay]
\coordinate (A) at (page cs:-0.5045,0.595);
\coordinate (left) at (A);
\forloop{1}{24}
\end{tikzpicture}
%second page
\clearpage
\begin{tikzpicture}[remember picture, overlay]
\coordinate (A) at (page cs:-0.5045,0.595);
\coordinate (left) at (A);
\forloop{25}{32}
\forloop{1}{16}
\end{tikzpicture}
%third page
\clearpage
\begin{tikzpicture}[remember picture, overlay]
\coordinate (A) at (page cs:-0.5045,0.595);
\coordinate (left) at (A);
\forloop{17}{20}
\forlooptwo{21}{28}
\forloop{29}{32}
\end{tikzpicture}
\end{document}
得到:
总 MWE:
\documentclass[12pt]{article}
% ############################## geometry
\usepackage{geometry}
\geometry{
headsep = 0pt,
headheight= 0pt,
hmarginratio = 1:1,
vmarginratio = 1:1,
bindingoffset = 0cm,
onecolumn,
a3paper,
layoutwidth = 220 mm,
layoutheight = 320 mm,
layouthoffset=\dimexpr(\paperwidth-\csname Gm@layoutwidth\endcsname)/2\relax,
layoutvoffset=\dimexpr(\paperheight-\csname Gm@layoutheight\endcsname)/2\relax,
showcrop
}
\usepackage[icelandic, latin, czech]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{title}{RGB}{16, 13, 32}
\usepackage{mwe}
\usepackage{XCharter}
% ############################### Document
\newcommand{\czHyphen}{\rule[.45ex]{.2em}{.11ex}}
\newcommand*{\addthinS}{\hskip0.06667em\relax}
\newcommand*{\addthinSS}{\hskip0.00007em\relax}
\def\cropmarkgap{1}% mm
\makeatletter
\def\Gm@cropmark(#1,#2,#3,#4){% #1 = x direction, #2 = y direction, #3 & #4 no longet used
\begin{picture}(0,0)
\setlength\unitlength{1truemm}%
\linethickness{0.25pt}%
\put(\the\numexpr #1*\cropmarkgap\relax,0){\line(#1,0){\the\numexpr 20-\cropmarkgap}}%
\put(0,\the\numexpr #2*\cropmarkgap\relax){\line(0,#2){\the\numexpr 20-\cropmarkgap}}%
\end{picture}}%
\makeatother
\makeatletter
\def\parsecomma#1,#2\endparsecomma{\def\page@x{#1}\def\page@y{#2}}
\tikzdeclarecoordinatesystem{page}{
\parsecomma#1\endparsecomma
\pgfpointanchor{current page}{north east}
% Save the upper right corner
\pgf@xc=\pgf@x%
\pgf@yc=\pgf@y%
% save the lower left corner
\pgfpointanchor{current page}{south west}
\pgf@xb=\pgf@x%
\pgf@yb=\pgf@y%
% Transform to the correct placement
\pgfmathparse{(\pgf@xc-\pgf@xb)/2.*\page@x+(\pgf@xc+\pgf@xb)/2.}
\expandafter\pgf@x\expandafter=\pgfmathresult pt
\pgfmathparse{(\pgf@yc-\pgf@yb)/2.*\page@y+(\pgf@yc+\pgf@yb)/2.}
\expandafter\pgf@y\expandafter=\pgfmathresult pt
}
\makeatother
\usepackage{eso-pic}
\usepackage{tikzpagenodes}
%\AddToShipoutPicture{\drawbackground}
\newcommand{\shiftleft}{\hspace*{-0.55\dimexpr\csname Gm@layoutwidth\endcsname-\textwidth\relax}}
\newcommand{\shiftup}{\vspace*{-0.13\dimexpr\csname Gm@layoutheight\endcsname-\textwidth\relax}}
%%% Define "Array" interface
\makeatletter
\newcounter{imgs}
\setcounter{imgs}{0}
%#1 is the image
%#2 is the title
%#3 is the color
\newcommand{\addimg}[3]{%
\stepcounter{imgs}%
\@namedef{imgimage\theimgs}{#1}%
\@namedef{imgtitle\theimgs}{#2}%
\@namedef{imgcolor\theimgs}{#3}}
\newcommand{\getimage}[1]{\expandafter\@nameuse\expandafter{imgimage#1}}%
\newcommand{\gettitle}[1]{\expandafter\@nameuse\expandafter{imgtitle#1}}%
\newcommand{\getcolor}[1]{\expandafter\@nameuse\expandafter{imgcolor#1}}%
\makeatother
%%% Define Cards
\addimg{example-image-A}{one}{blue}%
\addimg{example-image-B}{two}{green}%
\addimg{example-image-C}{three}{red}%
\addimg{example-image-A}{four}{yellow}%
\addimg{example-image-B}{five}{orange}%
\addimg{example-image-C}{six}{yellow}%
\addimg{example-image-A}{seven}{red}%
\addimg{example-image-B}{eight}{brown}%
\addimg{example-image-C}{nine}{green}%
\addimg{example-image-A}{ten}{blue}%
\addimg{example-image-B}{eleven}{green}%
\addimg{example-image-C}{twelve}{red}%
\addimg{example-image-A}{thirteen}{yellow}%
\addimg{example-image-B}{fourteen}{orange}%
\addimg{example-image-C}{fifteen}{yellow}%
\addimg{example-image-A}{sixteen}{red}%
\addimg{example-image-B}{seventeen}{brown}%
\addimg{example-image-C}{eighteen}{green}%
\addimg{example-image-A}{nineteen}{blue}%
\addimg{example-image-B}{twenty}{green}%
\addimg{example-image-C}{twenty one}{red}%
\addimg{example-image-A}{twenty two}{yellow}%
\addimg{example-image-B}{twenty three}{orange}%
\addimg{example-image-C}{twenty four}{yellow}%
\addimg{example-image-A}{twenty five}{red}%
\addimg{example-image-B}{twenty six}{brown}%
\addimg{example-image-C}{twenty seven}{green}%
\addimg{example-image-A}{twenty eight}{blue}%
\addimg{example-image-B}{twenty nine}{green}%
\addimg{example-image-C}{thirty}{red}%
\addimg{example-image-A}{thirty one}{yellow}%
\addimg{example-image-B}{thirty two}{orange}%
%%% Global Setup
\newcommand\xspacing{71pt}%<== space between the images
\newcommand\yspacing{71pt}%<== vertical space between rows
\newcommand\imgperrow{4}%<== number of images per row
\tikzset{p_title/.style={text centered, minimum height=0.6cm, minimum width=5cm, font=\bfseries}}
\tikzset{p_title_line/.style={ultra thin, color=violet}}
%%% Define primary for loop
\newcommand{\forloop}[2]{%
\foreach [count=\i] \x in {#1,...,#2}%<==loop for each image in the array
{
\edef\gonode{\noexpand\node[inner sep=0pt] (B) at (A) {\noexpand\includegraphics[width=5cm]{\getimage{\x}}};}%<==Edit to expand the file name
\gonode%\node [inner sep=0pt] (B) at (A) {\includegraphics[width=5cm]{\getimage{\x}}};%
\draw [black, ultra thick] ($(B.north west)$) rectangle ($(B.south east)$);%
\node [p_title] (AA) at ($(B.north west)+(2.5,-0.30)$) {\gettitle{\x}};%
\draw [p_title_line, color=\getcolor{\x}](AA.south west) -- (AA.south east);%
\pgfmathparse{Mod(\i,\imgperrow)==0?1:0};%
\ifnum\pgfmathresult>0
\coordinate (left) at ([yshift=-\yspacing]left);
\path let \p1=(left),\p2=(B.south) in coordinate (A) at (\x1,\y2-\yspacing);
\else
\coordinate (A) at ([xshift=\xspacing]B.east);%
\fi
}}
%%% Define the for loop for 2 images per row on third page
\newcommand{\forlooptwo}[2]{%
\begingroup
\def\imgperrow{2}
\let\originalxspacing\xspacing
\def\xspacing{5*\originalxspacing}
\forloop{#1}{#2}\endgroup}
\begin{document}
\pagestyle{empty}
%first page
\begin{tikzpicture}[remember picture, overlay]
\coordinate (A) at (page cs:-0.5045,0.595);
\coordinate (left) at (A);
\forloop{1}{24}
\end{tikzpicture}
%second page
\clearpage
\begin{tikzpicture}[remember picture, overlay]
\coordinate (A) at (page cs:-0.5045,0.595);
\coordinate (left) at (A);
\forloop{25}{32}
\forloop{1}{16}
\end{tikzpicture}
%third page
\clearpage
\begin{tikzpicture}[remember picture, overlay]
\coordinate (A) at (page cs:-0.5045,0.595);
\coordinate (left) at (A);
\forloop{17}{20}
\forlooptwo{21}{28}
\forloop{29}{32}
\end{tikzpicture}
\end{document}
答案2
这只是一个简单的示例tcbraster
。您可以修复列数、行与列之间的距离、背景框的颜色、标题等...
\documentclass{article}
\usepackage[most]{tcolorbox}
\begin{document}
\begin{tcbraster}[raster columns=4, raster equal height=rows, size=fbox, colframe=red!50!black, center title]
\tcbincludegraphics[title=first]{example-image}
\tcbincludegraphics[title=second]{example-image-A}
\tcbincludegraphics[title=third]{example-image-B}
\tcbincludegraphics[title=fourth, colback=green]{example-image-C}
\tcbincludegraphics[title=first]{example-image}
\tcbincludegraphics[title=first, colframe=blue]{example-image}
\tcbincludegraphics[title=third]{example-image-B}
\tcbincludegraphics[title=second]{example-image-A}
\tcbincludegraphics[title=fourth]{example-image-C}
\tcbincludegraphics[title=second]{example-image-A}
\tcbincludegraphics[title=third]{example-image-B}
\tcbincludegraphics[title=first]{example-image}
\tcbincludegraphics[title=second]{example-image-A}
\tcbincludegraphics[title=fourth]{example-image-C}
\tcbincludegraphics[title=third]{example-image-B}
\tcbincludegraphics[title=fourth]{example-image-C}
\end{tcbraster}
\end{document}