使用 TikZ 更均匀地设置点图案

使用 TikZ 更均匀地设置点图案

如果不允许使用 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-shifty-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 页和第 3 页之间:
在此处输入图片描述

答案2

这是一个简单的代码(tikz仅此而已),其中每列有整数个点(\nropoints)。此外,列之间的空间宽度等于整数个点(\intercolumnspoints)。

点之间的空间(\dotdistance)是使用以下公式计算的,以填充整个文本的宽度:

\textwidth = 3*\nropoints\dotdistance + 2*\intercolumnspoints\dotdistance

这样就xshift不再需要了。

A

仅需设置两个参数:

每列内的点数(整数)

以点数(整数)测量的柱间距“宽度”

\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} 

b

列间距为 12.25pt

相关内容