![让 TikZ 真正使用当前页面](https://linux22.com/image/362712/%E8%AE%A9%20TikZ%20%E7%9C%9F%E6%AD%A3%E4%BD%BF%E7%94%A8%E5%BD%93%E5%89%8D%E9%A1%B5%E9%9D%A2.png)
我想在页面上放置卡片,例如每页 4 张卡片,我有很多这样的卡片。这些卡片应排列为 2x2 网格,填满将设置为打印机可打印的文本区域。我的第一次尝试是以下 MWE:
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{etoolbox}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tikzpagenodes}
\newlength{\cardxlen}
\newlength{\cardylen}
\newcommand{\numberofxcards}{2}
\newcommand{\numberofycards}{2}
\pgfmathsetlength{\cardxlen}{\textwidth/\numberofxcards}
\pgfmathsetlength{\cardylen}{\textheight/\numberofycards}
\begin{document}
\foreach\myindex in {1,2,...,10}{%
\pgfmathsetmacro{\cardxnum}{Mod(\myindex-1,\numberofxcards)}
\pgfmathsetmacro{\cardynum}{floor(divide(\myindex-1,\numberofxcards))}
\begin{tikzpicture}[remember picture,overlay]
\draw[fill=gray]($(current page text area.north west)+(\cardxnum*\cardxlen,-\cardynum*\cardylen)$)rectangle++(\cardxlen,-\cardylen);
\end{tikzpicture}
\pgfmathsetmacro{\currentrest}{int(Mod(\myindex,\numberofxcards*\numberofycards))}
\ifnumequal{\currentrest}{0}{\clearpage}{}
}
\end{document}
如果我多次编译它,第一页将正确打印,但在后续页面上,卡片设置为低(垂直位置似乎被计算为前一页的最后一个垂直位置)。但据我了解,在下一个“tikzpicture”开始时,“TeX”已经在下一页了。
我如何让“TikZ”计算真实新页面上的位置?或者这只是一个错误?
答案1
我认为你必须使用
\pgfmathsetmacro{\cardynum}
{Mod(floor(divide(\myindex-1,\numberofxcards)),\numberofycards)}
用于计算\cardynum
。
代码:
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{etoolbox}
\usepackage{tikzpagenodes}
\usetikzlibrary{calc}
\newlength{\cardxlen}
\newlength{\cardylen}
\newcommand{\numberofxcards}{2}
\newcommand{\numberofycards}{2}
\pgfmathsetlength{\cardxlen}{\textwidth/\numberofxcards}
\pgfmathsetlength{\cardylen}{\textheight/\numberofycards}
\begin{document}
\foreach\myindex in {1,2,...,10}{%
\pgfmathsetmacro{\cardxnum}
{Mod(\myindex-1,\numberofxcards)}
\pgfmathsetmacro{\cardynum}
{Mod(floor(divide(\myindex-1,\numberofxcards)),\numberofycards)}
\begin{tikzpicture}[remember picture,overlay]
\draw[fill=gray]
($(current page text area.north west)+(\cardxnum*\cardxlen,-\cardynum*\cardylen)$)
rectangle
++(\cardxlen,-\cardylen)
;
\end{tikzpicture}
\pgfmathsetmacro{\currentrest}{int(Mod(\myindex,\numberofxcards*\numberofycards))}
\ifnumequal{\currentrest}{0}{\clearpage}{}
}
\end{document}
答案2
tcbraster
您还可以在包或tcbitemize
环境中排列卡片tcolorbox
,让它为您完成所有工作。只需输入行数和列数,包就会计算卡片大小。您只需列出所有卡片,光栅就会分布在页面上。
一个例子:
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage[most]{tcolorbox}
\begin{document}
\begin{tcbitemize}[%
raster columns=2,
raster rows=2,
raster height=\textheight,
enhanced,
sharp corners,
colframe=black,
colback=gray!30,
watermark text=\thetcbrasternum,
raster equal skip=0pt,
raster row skip=0pt,
raster column skip=0pt
]
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\tcbitem
\end{tcbitemize}
\end{document}