必经之路

抄一部心经,点一盏心灯

用户工具

站点工具


jsb:latex:shufazuopinzhi

设计一张书法作品纸----保姆级教程

我要设计的是这样的一张书法A4作品纸:

1 设置页面尺寸

可以设置页面大小,设置页边距,我设置都是0cm。

snippet.latex
\documentclass[a4paper]{ctexart} % A4纸,默认还可写中文
\usepackage{tikz} %用于画图的,这个很关键。
\usepackage[top=0cm, bottom=0cm, left=0cm, right=0cm]{geometry}

2 找标准坐标点。

这个图比较简单,只用找到页面的中线就好,也就是中心的 X 坐标。用A4纸的21cm*29.7cm ,如果直接21cm除以 2 好像不行。

我用的方法是,笨方法,对着屏幕用尺子量的

snippet.latex
    %pt转化成 cm 单位,求中线的时候好像要-0.75
    \pgfmathparse{\textwidth / 28.5} %把 pt 转化成 cm 单位
    \let\mywd\pgfmathresult  %纸张的宽度
    \pgfmathparse{\textheight/ 28.5}
    \let\myht\pgfmathresult %纸张的高度
    \pgfmathparse{\textwidth / 28.5/2-0.75}
    \let\mymid\pgfmathresult %中心点的 X 坐标位置

3 定义颜色:

需要两个颜色,一个是左右长方块的颜色,一个方格的颜色:

snippet.latex
    \definecolor{coloredge}{RGB}{211, 209, 171} % 边缘颜色
    \definecolor{colorgezi}{RGB}{200, 199, 163} %画格子的线条颜色 

4 两个背景图:

我是用屏幕截图后,转化成 jpg 文件的。

一个是方格背景图bggezi.jpg,一个是黑色装饰边bgmid.jpg。保存到当前目录下的子目录 images 目录下。

snippet.latex
     % 指定图片的路径
    \def\bggezi{images/bggezi.jpg}
    \def\bgmid{images/bgmid.jpg}

5 中间的绿色:

基本原理是,把那张背景图片bggezi排列在页面中间的长方形中。

要注意坐标的规律:

 X是从左往右,逐渐增大;Y 是从上往下逐渐减小,所以页面左上角是(0,0),右下角是(mywd, -myht)

为了覆盖整个页面,Y 的起始和结束位置有些冗余没关系。而且,和每张背景图不一样,每一次循环Y 的高度可以调节,不要大于图片本身的高度就好。

snippet.latex
    \newcommand{\gezi}{1.5}  % 设置格子的大小,单位 cm
    \pgfmathparse{\gezi * 5} 
    \let\imgwd\pgfmathresult  %定义背景图填充的宽度
 
    % 重复铺满背景中间的图片
    \foreach \y in {-1,0, 1, ..., 15} { % 根据需要调整数字
        \node[anchor=north west] at (\mymid - \imgwd, -\y*2) {
                \includegraphics[width=\imgwd cm]{\bggezi}
            };
        \node[anchor=north west] at (\mymid, -\y*2) {
                \includegraphics[width=\imgwd cm]{\bggezi}
            };
    }

此时的效果如下了:

6 画格子

这一步最简单了,代码如下:

snippet.latex
    %中间画格子
    \pgfmathparse{-\myht +1} 
    \let\btstart\pgfmathresult  %设置格子和页面底部的距离 1cm,那 Y 坐标就是-\myht + 1
    \pgfmathparse{\mymid -\gezi*4.5}
    \let\leftstart\pgfmathresult %设置格子左侧的 起始坐标中心线减去4 个半格子长度。 X = \mymid -1.5*4.5
    \foreach \x in {0, 1, ..., 8} { % 9 个横向方格
        \foreach \y in {0, 1, ..., 14} { %  15 个纵向方格
            \draw[colorgezi, line width=1pt] (\leftstart+\x*\gezi, \btstart + \y*\gezi) rectangle ++(\gezi, \gezi);
        }
    }
 

现在效果如下:

7 画两侧方块

这一步也很简单,左右画方块有些冗余没关系,确保页面上都被覆盖。

snippet.latex
    \pgfmathparse{\mymid -\gezi*4.5 -0.5}
    \let\leftrect\pgfmathresult  %定义左侧方块的最右 X坐标
    \pgfmathparse{\mymid +\gezi*4.5+0.5}
    \let\rightrect\pgfmathresult  %定义右侧方块最左 X 坐标。
    \fill[coloredge] (\leftrect, 1) rectangle (\mymid-15, -\myht);
    \fill[coloredge] (\rightrect, 1) rectangle (\mymid+15, 

效果如图:

}

8 增加长条装饰

这一步稍微遇到了些困难,因为起始位置好像不太准,不过问题不大,所见即所得,多调试几次,手工调整就好了

snippet.latex
    %左右装饰图片,此处的尺寸好像不太明白,根据效果手工调整。
    \newcommand{\geziwd}{0.3} %装饰图片的宽度
    \foreach \y in {-1,0, 1, ..., 10} { % 根据需要调整数字
        \node[anchor=north east] at (\leftrect+\geziwd, -\y*3) {
                \includegraphics[width=\geziwd cm]{\bgmid}
            }; %north east 表示图片的坐标右上对齐
        \node[anchor=north west] at (\rightrect-\geziwd, -\y*3) {
                \includegraphics[width=\geziwd cm]{\bgmid}
            }; %north west 表示图片的坐标左上对齐
    }

效果图:

总结和其他

  1. 应该还可以再简化代码,特别是用\node填充图片,我也不是很熟悉,只是问了 AI,然后修改的。
  2. 有个优化想法:可以第一步,把整个背景设置成浅绿色,然后再把中间的绿色方格画好就可以覆盖了,不用再画左右的方块了!这样的话,效率高了很多,也不容易出错。
  3. 这个作品纸,只有左右对称,不需要 Y 轴的中线,如果上下对称,可以寻找 Y 的中线,类似设置 mymid一样。
  4. 线条颜色和背景颜色,不那么容易设置。mac 电脑没法看到图片的 RGB 颜色,我用 python 写了段代码,直接读取图片颜色的 RGB 值。如果你有其他办法,也可以代替。
  5. 代码和图片下载: zuopinzhi.zip
jsb/latex/shufazuopinzhi.txt · 最后更改: 2024/12/29 22:02 由 lanshizi