如果不允许使用 TeX 格式,我正在开发一个三列虚线网格模板,用于笔记记录/写作备忘单。我有以下代码:
\documentclass{article}
\usepackage[margin=1.5cm,landscape,a4paper]{geometry}
\usepackage{tikz}
\usetikzlibrary{patterns,patterns.meta}
\definecolor{dotcolor}{RGB}{204,204,198}
\setlength\parindent{0pt}
\usepackage{layouts,blindtext}
\def\columnwid{0.314606742}
\begin{document}
\thispagestyle{empty}
\begin{minipage}[b]{\columnwid\textwidth}
\begin{tikzpicture}[x=1cm, y=1cm]
\draw[pattern={Dots[distance=5mm,radius=0.4mm,xshift=0.21cm,yshift=0.29cm]},pattern color=dotcolor,draw=dotcolor!70] (0,0) rectangle +(\textwidth,0.999\textheight);
\end{tikzpicture}
\end{minipage}\hfill
\begin{minipage}[b]{\columnwid\textwidth}
\begin{tikzpicture}[x=1cm, y=1cm]
\draw[pattern={Dots[distance=5mm,radius=0.4mm,xshift=-0.15cm,yshift=0.29cm]},pattern color=dotcolor,draw=dotcolor!70] (0,0) rectangle +(\textwidth,0.999\textheight);
\end{tikzpicture}
\end{minipage}\hfill
\begin{minipage}[b]{\columnwid\textwidth}
\begin{tikzpicture}[x=1cm, y=1cm]
\draw[pattern={Dots[distance=5mm,radius=0.4mm,yshift=0.29cm]},pattern color=dotcolor,draw=dotcolor!70] (0,0) rectangle +(\textwidth,0.999\textheight);
\end{tikzpicture}
\end{minipage}
\end{document}
生成结果:
结果正是我想要的。但是,我必须手动计算参数(例如\columnwid
(外边距(1.5 厘米)和内边距(0.75 厘米)后一列的宽度,或值shift
)等,如果我想要不同的布局(例如纵向两列),这就不太理想了。这可以通过在LaTeX
(例如使用 LaTeX 计算变量)
然而,这个问题的主题是网格模式。如果删除 和x-shift
,y-shift parameters
则点在每一列中的排列方式会有所不同(即并非所有点都“开始”绘制列边框的位置),这是出乎意料的,因为tikzpicture
在每个列中都绘制了minipage
。
我该如何调整它才能得到均匀分布的图案?
答案1
TikZ 手册解释了模式:
使用模式时存在许多陷阱和限制。[…]
图案的相位定义不明确,也就是说,不清楚“第一个”图块的原点在哪里。更准确地说,PostScript 和 PDF 与 SVG 对原点的定义不同。PostScript 和 PDF 定义了一个固定原点,与路径所在位置无关。这具有非常理想的效果,即如果您使用相同的模式填充多条路径,则结果与填充由所有这些路径的并集组成的单条路径相同。
就你的情况而言,这是不是非常可取。
如果我们知道实际的原点在哪里,我们就可以计算所需的移动量,但我相信使用主要的 TikZ 方法而不是模式(即由“底层图形语言”处理的东西)来绘制会更容易,尽管它可能更慢。
在下面的代码中,点是用一个特殊dash pattern
的在长度为零但线帽为圆形的线段。因此,这些点不是作为circle
(形状或路径操作)绘制的,而是作为线的一部分绘制的。它们的大小由线宽控制。
规则:
唯一可以灵活调整的距离是
- 虚线列之间的边距,
- 虚线列的宽度和
- 点与列顶部和底部之间的垂直边距。
变量:
columns
:虚线列数dot distance
:点中心之间的距离dot diameter
:点的直径(不是半径)margin
:外部点中心与矩形之间的空间。对于水平尺寸,这是一个固定长度;对于垂直尺寸,这被认为是最小值。
minimal column sep
:列之间的最小水平空间
样式:
@dots
:设置适当的网格和线条设置的内部样式rectangle
:矩形的样式dots
:圆点的样式diagram
:某种内部样式,指导 TikZ 如何将整张图片放置在页面上。需要修剪,以便忽略矩形的线宽(它们完全对齐在文本区域的边框。这
baseline
有助于避免出现空白页。
这些公式可能不是最优的,我直到很晚才发现我可以使用该mod
函数。
这仍然可能是多个 TikZ 图片,它们之间的空间由 TeX 控制,但这是我想到的第一个解决方案。
代码
\documentclass{article}
\usepackage[margin=1.5cm,landscape,a4paper,showframe]{geometry}
\usepackage{tikz}
\definecolor{dotcolor}{RGB}{204,204,198}
\setlength\parindent{0pt}
% \usepackage{layouts,blindtext}
\tikzset{
maxgrid/dot distance/.initial=+5mm,
maxgrid/dot diameter/.initial=+.8mm,
maxgrid/margin/.initial=+3mm,
maxgrid/minimal column sep/.initial=+10mm,
maxgrid/columns/.initial=3,
maxgrid/@dots/.style={
xstep=\pgfkeysvalueof{/tikz/maxgrid/dot distance}, ystep=+0pt,
line width=\pgfkeysvalueof{/tikz/maxgrid/dot diameter}, line cap=round,
dash pattern=on +0pt off \pgfkeysvalueof{/tikz/maxgrid/dot distance}},
maxgrid/rectangle/.style={draw=dotcolor!70},
maxgrid/dots/.style={draw=dotcolor},
maxgrid/diagram/.style={trim left=+0pt,trim right=+\linewidth,baseline=+1em}}
\newcommand*\tikzmaxgrid[1][]{%
\begin{tikzpicture}[maxgrid/diagram,maxgrid/.cd,#1]
\pgfmathtruncatemacro\tmgDotsPerColumn{
((\linewidth-(\pgfkeysvalueof{/tikz/maxgrid/columns}-1)
*(\pgfkeysvalueof{/tikz/maxgrid/minimal column sep})
)/(\pgfkeysvalueof{/tikz/maxgrid/columns})
-2*(\pgfkeysvalueof{/tikz/maxgrid/margin})
)/(\pgfkeysvalueof{/tikz/maxgrid/dot distance})}
\pgfmathsetlengthmacro\tmgColumnWidth{
\tmgDotsPerColumn*(\pgfkeysvalueof{/tikz/maxgrid/dot distance})
+2*(\pgfkeysvalueof{/tikz/maxgrid/margin})}
\pgfmathsetlengthmacro\tmgColumnWidthExtra{
(\linewidth-(\pgfkeysvalueof{/tikz/maxgrid/columns})*\tmgColumnWidth)
/(\pgfkeysvalueof{/tikz/maxgrid/columns}-1)}
\pgfmathsetlengthmacro\tmgYMargin{
.5*mod(\textheight,\pgfkeysvalueof{/tikz/maxgrid/dot distance})}
\pgfmathsetlengthmacro\tmgYMargin{
\tmgYMargin < \pgfkeysvalueof{/tikz/maxgrid/margin} ?
\tmgYMargin+.5*(\pgfkeysvalueof{/tikz/maxgrid/dot distance}) : \tmgYMargin}
\foreach[parse=true, count=\tmgColumnZero from 0] \tmgColumn in {
1,...,\pgfkeysvalueof{/tikz/maxgrid/columns}}{
\draw[maxgrid/rectangle,
xshift=\tmgColumnZero*(\tmgColumnWidth+\tmgColumnWidthExtra]
(0,0) rectangle ++ (\tmgColumnWidth,\textheight);
\draw[maxgrid/@dots, maxgrid/dots,
xshift=\tmgColumnZero*(\tmgColumnWidth+\tmgColumnWidthExtra,
shift={({\pgfkeysvalueof{/tikz/maxgrid/margin}},\tmgYMargin)}]
(+0pt,+0pt) grid ++(
{\tmgColumnWidth-2*(\pgfkeysvalueof{/tikz/maxgrid/margin})},
{\textheight-2*\tmgYMargin});}
\end{tikzpicture}}
\begin{document}
\tikzmaxgrid[columns=2]
\tikzmaxgrid
\tikzmaxgrid[columns=4, minimal column sep=5mm]
\end{document}
输出
答案2
这是一个简单的代码(tikz
仅此而已),其中每列有整数个点(\nropoints
)。此外,列之间的空间宽度等于整数个点(\intercolumnspoints
)。
点之间的空间(\dotdistance
)是使用以下公式计算的,以填充整个文本的宽度:
\textwidth = 3*\nropoints\dotdistance + 2*\intercolumnspoints\dotdistance
这样就xshift
不再需要了。
仅需设置两个参数:
每列内的点数(整数)
以点数(整数)测量的柱间距“宽度”
\documentclass{article}
\usepackage[margin=1.5cm,landscape,a4paper, showframe]{geometry} % changed to show the margins <<<
\usepackage{tikz}
\usetikzlibrary{patterns,patterns.meta}
\definecolor{dotcolor}{RGB}{204,204,198}
\setlength\parindent{0pt}
\usepackage{layouts,blindtext}
%******************************************** added
\usepackage{fp}
\FPset\nropoints{17}% choose the number of inner points per column (integer) <<<<<<<<<<<<<<<<
\FPset\intercolumnspoints{2} % choose the "width" of column separation (integer) <<<<<<<<<<<<<<<
\FPeval\totalpoints{3*\nropoints + 2*\intercolumnspoints}
\FPeval\factorx{ 1 /\totalpoints}
\newlength{\dotdistance}
\setlength{\dotdistance}{\factorx\textwidth}% to fill the text width
\newlength{\colW}
\setlength{\colW}{\nropoints\dotdistance}
\setlength{\columnsep}{\intercolumnspoints\dotdistance} %
%********************************************
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}
\pgfmathsetmacro\d{\dotdistance}
\draw[pattern={Dots[distance=\d,radius=0.4mm]},pattern color=dotcolor](0,0) rectangle +(\colW,0.999\textheight);
\draw[pattern={Dots[distance=\d,radius=0.4mm]},pattern color=dotcolor](\colW+\columnsep,0) rectangle +(\colW,0.999\textheight);
\draw[pattern={Dots[distance=\d,radius=0.4mm,]},pattern color=dotcolor](2*\colW+2*\columnsep,0) rectangle +(\colW,0.999\textheight);
\end{tikzpicture}
\end{document}
和
\FPset\nropoints{20}%(integer)
\FPset\intercolumnspoints{1}
列间距为 12.25pt