我想创建一个稍后在纸上填写的表格。但有些字段是自动填写的(即当人们收到表格时已经打印出来了)。
以下是表单本身的 MWE:
\documentclass{article}
\usepackage{calc}
\usepackage{mathtools}
\usepackage{tikz}
\newcommand{\BOX}{%
\begin{tikzpicture}[baseline=-0.5ex,rounded corners=2pt]%
\filldraw[
color = black,
fill = white,
semithick
] (0,-.5cm) rectangle (0.5cm,.5cm);
\end{tikzpicture}%
}
\begin{document}
\begin{tabular}{c}
\begin{minipage}[c][1cm]{6cm}
\centering\sffamily\bfseries{}Code of the kit%
\end{minipage}
\tabularnewline
%
\centering
\begin{minipage}[c][1cm]{6cm}
\centering\BOX\;{\sffamily\bfseries--\;}\BOX\;\BOX\;\BOX\;{\sffamily\bfseries--\;}\BOX\;\BOX%
\end{minipage}
\end{tabular}
\end{document}
我已经删除了所有不必要的 MWE 字段,例如name
、surname
等。该字段Code of the kit
应以格式自动填充letter -- digit digit digit -- letter letter
。
我想做类似的事情\MakeForms{100500}
,TeX 生成 100500 页,其中每一页都由代码填充next
。现在,这next
意味着: 旁边的代码f120bg
是f120bh
,在f120bz
goes之后f120ca
,在f120zz
goes之后f121aa
,在f999zz
goes之后g000aa
,即顺序是按字典顺序排列的,但有一些字母我想被跳过,比如说,e, u, y
,这意味着后面的字母x
现在是z
。
附言如果重要的话,我想使用西里尔字母。
聚苯硫醚我使用 LuaLaTeX,因此欢迎使用 Lua 代码的解决方案。
答案1
我设置了一个嵌套循环。这里我只使用了三个这样的循环,以避免太大,但您可以逻辑地扩展它。其次,我不会清除每个页面,而只是开始一个新的页面,\par
并在其间填充规则。
\documentclass{article}
\usepackage{calc}
\usepackage{mathtools}
\usepackage{tikz}
\newcommand{\BOX}[1][]{%
\begin{tikzpicture}[baseline=-0.5ex,rounded corners=2pt]%
\filldraw[
color = black,
fill = white,
semithick
] (0,-.5cm) rectangle (0.5cm,.5cm);
\node(A)[right] {#1};
\end{tikzpicture}%
}
\newcommand\code[3]{%
\begin{tabular}{c}
\begin{minipage}[c][1cm]{6cm}
\centering\sffamily\bfseries{}Code of the kit%
\end{minipage}
\tabularnewline
%
\centering
\begin{minipage}[c][1cm]{6cm}
\centering\BOX\;{\sffamily\bfseries--\;}\BOX\;\BOX\;\BOX[#1]\;{\sffamily\bfseries--\;}\BOX[#2]\;\BOX[#3]%
\end{minipage}
\end{tabular}}
\begin{document}
\foreach\DD in{1,...,4}{
\foreach\EE in{A,...,E}{
\foreach\FF in{A,...,C}{
\code{\DD}{\EE}{\FF}\par\hrulefill\par
}}}
\end{document}
开始
结束
虽然我的方法的商业目的体现在
\foreach\DD in{1,...,4}{
\foreach\EE in{A,...,E}{
\foreach\FF in{A,...,C}{
\code{\DD}{\EE}{\FF}\par\hrulefill\par
}}}
跳过字母可以通过简单的修改来实现,例如跳过数字 3:
\foreach\DD in{1,...,2,4,...,5}{
答案2
\themycount
这假设您想在您的代码中使用类似的东西。
outer sep
您可以使用(表示方框)和(表示连字符)调整水平间距inner sep
。为了好玩,我展示了另一种将文本居中在 1 厘米间距的方法。
\documentclass{article}
\usepackage{calc}
\usepackage{mathtools}
\usepackage{tikz}
\newcommand{\CODE}[1]% #1 = six digit number
{\bgroup
\def\code{#1}%
\ifnum#1<100000 \def\code{0#1}\fi% I assume you want leading zeros
\ifnum#1<10000 \def\code{00#1}\fi
\ifnum#1<1000 \def\code{000#1}\fi
\ifnum#1<100 \def\code{0000#1}\fi
\ifnum#1<10 \def\code{00000#1}\fi
\def\decode##1##2##3##4##5##6{%
\def\codeA{##1}%
\def\codeB{##2}%
\def\codeC{##3}%
\def\codeD{##4}%
\def\codeE{##5}%
\def\codeF{##6}}%
\expandafter\decode\code
\tikzstyle{BOX}=[draw=black,
rounded corners=2pt,
semithick,
minimum width=.5cm,
minimum height=1cm,
inner sep=0pt,% probably not needed
outer sep=2pt]
\begin{tikzpicture}[baseline=-0.5ex]
\node[BOX](A) {\codeA};
\node[right,inner sep=1pt](AA) at (A.east) {\sffamily\bfseries--};
\node[BOX,right](B) at (AA.east) {\codeB};
\node[BOX,right](C) at (B.east) {\codeC};
\node[BOX,right](D) at (C.east) {\codeD};
\node[right,inner sep=1pt](DD) at (D.east) {\sffamily\bfseries--};
\node[BOX,right](E) at (DD.east) {\codeE};
\node[BOX,right] at (E.east) {\codeF};
\end{tikzpicture}
\egroup}
\newcounter{mycount}
\begin{document}
\loop\ifnum\value{mycount}<5
\stepcounter{mycount}
\begin{tabular}{c}
\rule[\dimexpr 0.5\ht\strutbox-.5cm]{0pt}{1cm}% centered 1cm
{\sffamily\bfseries Code of the kit}%
\tabularnewline
%
\CODE{\themycount}% already 1cm
\end{tabular}
\repeat
\end{document}