目标是为每页制作一个 5 行 2 列的网格。不幸的是,只有第一页有 4 行 2 列的网格。如何解决?
最小工作示例
我已尝试使此 MWE 尽可能最小化,同时保持真实场景不变。请不要删除可能微不足道的代码。
\documentclass{article}
\usepackage[a4paper,hmargin=2mm,vmargin=2mm]{geometry}
\usepackage{longtable,array}
\newcounter{counter}
\newcolumntype\specifier{|*2{>{\centering\stepcounter{counter}}m{0.5\dimexpr\linewidth-4\tabcolsep-3\arrayrulewidth\relax}|}}
\makeatletter
\def\row[#1]#2{%
\parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} {\bf #2}}%
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}%
}
\makeatother
\newcommand\finalline{%
\ifodd\value{counter}\omit\tabularnewline\cline{1-1}\fi
}
\usepackage{etoolbox}
\AfterEndPreamble{%
\topskip=0pt\relax
\begin{longtable}{\specifier}\hline
}
\preto\enddocument{\finalline\end{longtable}}
\pagestyle{empty}
\begin{document}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\end{document}
输出
奖金问题
我刚刚注意到,当最后一页只有一个单元格时,单元格右侧会出现一条多余的线,如红色箭头所示。如何删除它?
答案1
raster
这是使用库的另一个答案tcolorbox
。我尝试尽可能地重建您的示例,但没有您想要消除的问题。特别是,除了第一个空白行之外,我保持您的文档内容不变。
\documentclass{article}
\usepackage[a4paper,hmargin=2mm,vmargin=2mm]{geometry}
\usepackage[many]{tcolorbox}
\AtBeginDocument{%
\begin{tcbitemize}[raster height=\textheight,raster columns=2,raster rows=5,
size=fbox,sharp corners,
center upper,% <--- alternatively: halign=flush center,
valign=center,
boxrule=0.4pt,% <--- line width
raster column skip=-0.4pt,raster row skip=-0.4pt,% <--- negative line width
colframe=black,colback=white
]%
}
\preto\enddocument{\end{tcbitemize}}
\newcommand{\row}[2][]{\tcbitem #1\par\vspace{15pt}{\bfseries#2}}
\pagestyle{empty}
\begin{document}% no blank line here
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\end{document}
更新(OP的后续要求):
要将网格转换为页面序列,其中每个单元格都打印在单个紧密的页面上,只需进行一些调整。我还更改了命令\row
以采用“tcolorbox”选项。这允许卡片使用不同的规则宽度:
\documentclass{article}
\usepackage[paperwidth=10cm,paperheight=5cm,hmargin=5mm,vmargin=5mm]{geometry}
\usepackage[many]{tcolorbox}
\AtBeginDocument{%
\begin{tcbitemize}[raster height=\textheight,raster columns=1,raster rows=1,
size=fbox,sharp corners,
center upper,% <--- alternatively: halign=flush center,
valign=center,
boxrule=0.4pt,% <--- line width
colframe=black,colback=white
]%
}
\preto\enddocument{\end{tcbitemize}}
\newcommand{\row}[3][]{\tcbitem[#1] #2\par\vspace{15pt}{\bfseries#3}}
\pagestyle{empty}
\begin{document}% no blank line here
\row{RAM}{Random Access Memory}
\row[boxrule=3mm]{BIOS}{Basic Input Output System}
\row{MWE}{Minimal Working Example}
\row{OMG}{Oh My Ghost}
\row{PS}{Post Script}
\row{RAM}{Random Access Memory}
\row{BIOS}{Basic Input Output System}
\row{MWE}{Minimal Working Example}
\row{OMG}{Oh My Ghost}
\row{PS}{Post Script}
\row{RAM}{Random Access Memory}
\row{BIOS}{Basic Input Output System}
\row{MWE}{Minimal Working Example}
\row{OMG}{Oh My Ghost}
\row{PS}{Post Script}
\row{RAM}{Random Access Memory}
\row{BIOS}{Basic Input Output System}
\row{MWE}{Minimal Working Example}
\row{OMG}{Oh My Ghost}
\end{document}
答案2
这里有一个可能的解决方案,raster
来自的库tcolorbox
包裹。
您必须调整一些颜色和尺寸,但至少第一页包含五行。
\documentclass{article}
\usepackage[a4paper,hmargin=2mm,vmargin=2mm]{geometry}
\usepackage[most]{tcolorbox}
\newtcolorbox{mybox}{sharp corners, width=.5\linewidth, height=0.2\textheight, valign=center, halign=center}
\begin{document}
\begin{tcbraster}[raster columns=2,enhanced, sharp corners, raster column skip=0pt, raster row skip=0pt]
\foreach \i in {1,...,5}{
\begin{mybox}
RAM\\[1cm]Random Access Memory
\end{mybox}
\begin{mybox}
BIOS\\[1cm]Basic Input Output System
\end{mybox}
\begin{mybox}
MWE\\[1cm]Minimal Working Example
\end{mybox}
\begin{mybox}
OMG\\[1cm]Oh My Ghost
\end{mybox}
\begin{mybox}
PS\\[1cm]Post Script
\end{mybox}}
\end{tcbraster}
\end{document}
答案3
如果目标是闪存卡,那么类似这样的方法可能会有效(如果您想要边框等,可能需要进行调整)。您说您不想加载额外的包,所以这样做的一个潜在好处是:
\documentclass{article}
\def\row[#1]#2{\parbox[c][.2\textheight]{.5\textwidth}
{\centering #1 \par \vspace{15pt} {\bf #2}}\ignorespaces\penalty0}
\begin{document}
\noindent
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[MWE]{Minimal Working Example}
\row[OMG]{Oh My Ghost}
\end{document}
答案4
这种方法或许过于简单了。
该labels
软件包旨在打印可以通过喷墨打印机或激光打印机送入的标签纸。除了一些预定义的设置外,它还允许您指定在任意纸张上打印所需的尺寸。
现在,通常情况下,打印标签时不会在标签周围画网格。但是,出于测试目的,该软件包提供了一个显示网格的命令。这个想法是,你把它打印在一张纸上,然后拿着它和你的标签纸一起对着光检查对齐情况。这样,一个错误只会浪费一张纸,而不是一张(更昂贵的)标签。
我的答案只是设置一张具有闪存卡尺寸的“标签”表,并打开显示网格的选项。结果是 5x2 组闪存卡,但最后一张表只包含一张卡片。因为这张表上只显示一个“标签”,所以只显示其边框。也就是说,我认为这也解决了“奖励”问题。
但是,我不太确定我的答案是否符合问题中指定的限制,因为我已经省去了序言代码的很大一部分。
我已经用 替换了\bf
,\bfseries
因为前者早已被弃用,并且根本不应该在 LaTeX 文档中使用。
我使用\card
而不是\row
来定义卡片。这样做的唯一原因是我使用这两个命令进行测试,并且\card
对我来说很有意义。但您可以根据\row
需要指定(或其他任何内容)。
结果如下:
唯一要注意的是不要在闪存卡之间留空行。我已注释掉空行以保持分组,但避免了随后出现的问题。
\documentclass[a4paper]{article}
\usepackage[newdimens]{labels}
\LabelCols=2
\LabelRows=5
\LeftPageMargin=2mm
\RightPageMargin=2mm
\TopPageMargin=2mm
\BottomPageMargin=2mm
\InterLabelColumn=0mm
\InterLabelRow=0mm
\RightLabelBorder=5mm
\LeftLabelBorder=5mm
\TopLabelBorder=5mm
\BottomLabelBorder=5mm
\LabelGridtrue
\numberoflabels=1
\newlength\cardwidth
\setlength\cardwidth{\dimexpr.5\textwidth-12mm}
\newcommand*\card[2][]{%
\genericlabel{%
\begin{minipage}{\cardwidth}
\centering
#1\par\vspace{15pt}
\bfseries #2
\end{minipage}}}
\pagestyle{empty}
\begin{document}
%
\card[RAM]{Random Access Memory}
\card[BIOS]{Basic Input Output System}
\card[MWE]{Minimal Working Example}
\card[OMG]{Oh My Ghost}
\card[PS]{Post Script}
%
\card[RAM]{Random Access Memory}
\card[BIOS]{Basic Input Output System}
\card[MWE]{Minimal Working Example}
\card[OMG]{Oh My Ghost}
\card[PS]{Post Script}
%
\card[RAM]{Random Access Memory}
\card[BIOS]{Basic Input Output System}
\card[MWE]{Minimal Working Example}
\card[OMG]{Oh My Ghost}
\card[PS]{Post Script}
%
\card[RAM]{Random Access Memory}
\card[BIOS]{Basic Input Output System}
\card[MWE]{Minimal Working Example}
\card[OMG]{Oh My Ghost}
\card[PS]{Post Script}
%
\card[RAM]{Random Access Memory}
\card[BIOS]{Basic Input Output System}
\card[MWE]{Minimal Working Example}
\card[OMG]{Oh My Ghost}
\card[PS]{Post Script}
%
\card[RAM]{Random Access Memory}
\card[BIOS]{Basic Input Output System}
\card[MWE]{Minimal Working Example}
\card[OMG]{Oh My Ghost}
\card[PS]{Post Script}
%
\card[RAM]{Random Access Memory}
\end{document}