使线条背景与纸张尺寸/方向无关的通用方法

使线条背景与纸张尺寸/方向无关的通用方法

我有以下设置在 a4paper 中生成横格纸背景(从 texblog 修改并从此站点回答)

我想使这个代码更加不受纸张大小的影响。

for 循环中的值“28”适用于这种纸张尺寸(A4),但对于其他纸张尺寸或方向(横向/纵向),需要进行调整。

我猜我可以将 \paperheight 放在 for 循环中的某个位置,但我不知道如何在 \draw 之后将该值(以英寸或厘米为单位)转换为(坐标单位)。

或者也许用page.north west和进行算术运算page.south west,如果可能的话。

是的,我知道,我可以手动修改它们(在 a3paper 中工作时在 for 循环中将值 28 更改为 38),但我对更自动化的解决方案感兴趣。

简而言之:我已在代码中对此进行了大量\usepackage{geometry}注释,并希望做出一个\mygraphpaper适用于所有注释的定义。

我想要实现的布局文档:没有左/右边距,x顶部和底部边距相同

\documentclass{article} 
\usepackage{tikz}
%\usepackage[landscape,a3paper]{geometry}
\usepackage[a4paper]{geometry}
%\usepackage[landscape,a5paper]{geometry}
%\usepackage[a5paper]{geometry}
%\usepackage[landscape,paperheight=8.17in,paperwidth=6.32in,top=1in,bottom=1in,right=1in,left=1in]{geometry}
\usetikzlibrary{calc}
\def\mygraphpaper{%
  \begin{tikzpicture}
  \foreach \i in {4,5,...,28}{
  \draw[gray] ($(current page.north west)+(0,-\i)$) -- ($(current page.north east)+(0,-\i)$);}
  \end{tikzpicture}%
}
\usepackage{background}
\backgroundsetup{
  angle=0,
  contents=\mygraphpaper,
  color=black,
  scale=1,
}

\begin{document}
\pagenumbering{gobble}
$\,$
\end{document}

答案1

对于两个参数,其中#1代表第一条水平线到页面顶部的距离,以及#2到页面底部的最小距离,您可以使用\mygraphpaper如下定义

\newcommand*\mygraphpaper[2]{%
  \begin{tikzpicture}[remember picture,overlay]
  \foreach[parse=true] \i in {0,...,(\paperheight-(#1)-(#2))/1cm}{
  \draw[gray] ([yshift={-\i cm-(#1)}]current page.north west) -- ++(right:\paperwidth);}
  \end{tikzpicture}%
}

请注意,我已经使用了rememer pictureoverlay以便特殊current page节点能够被正确识别,并且我们不必处理background决定放置该内容的任何位置。

但请注意,所everypage使用的包everypage已被弃用。


使用过去两年的 LaTeX 版本,您可以(应该)使用钩子shipout/background,它充当picture原点位于页面左上角的线。由于您只绘制水平线,因此您可以直接以这种方式绘制,而无需使用 PGF/TikZ

通过与之前相同的数学运算,我们可以得到所需的迭代次数\multiput

代码 (TikZ + background/ everypage)

\documentclass{article} 
\usepackage{tikz}
%\usepackage[landscape,a3paper]{geometry}
\usepackage[a4paper]{geometry}
%\usepackage[landscape,a5paper]{geometry}
%\usepackage[a5paper]{geometry}
%\usepackage[landscape,paperheight=8.17in,paperwidth=6.32in,top=1in,bottom=1in,right=1in,left=1in]{geometry}
\usetikzlibrary{calc}
\newcommand*\mygraphpaper[2]{%
  \begin{tikzpicture}[remember picture,overlay]
  \foreach[parse=true] \i in {0,...,(\paperheight-(#1)-(#2))/1cm}{
  \draw[gray] ([yshift={-\i cm-(#1)}]current page.north west) -- ++(right:\paperwidth);}
  \end{tikzpicture}%
}
\usepackage{background}
\backgroundsetup{
  angle=0,
  contents=\mygraphpaper{3.5cm}{5cm},
  color=black,
  scale=1,
}

\begin{document}
\pagenumbering{gobble}
$\,$
\end{document}

代碼 ( shipout/background+ picture)

\documentclass{article}
%\usepackage[landscape,a3paper]{geometry}
\usepackage[a4paper]{geometry}
%\usepackage[landscape,a5paper]{geometry}
%\usepackage[a5paper]{geometry}
%\usepackage[landscape,paperheight=8.17in,paperwidth=6.32in,top=1in,bottom=1in,right=1in,left=1in]{geometry}
\usepackage{xcolor}
\newcommand*\mygraphpaper[2]{%
  \color{gray}
  \setlength\unitlength{1cm}
  \linethickness{.4pt}
  \multiput(0,-#1)(0,-1){\fpeval{1+trunc((\paperheight-#1cm-#2cm)/1cm,0)}}{%
    \line(1,0){\paperwidth}
  }
}
\AddToHook{shipout/background}{\mygraphpaper{3.5}{5}}
\begin{document}
\pagenumbering{gobble}
$\,$
\end{document}

答案2

您可以使用gridTikZ 中的操作(负值(或零)xstep将删除垂直线,因此您只得到水平规则):

\documentclass{article} 
\usepackage{tikz}
%\usepackage[landscape,a3paper]{geometry}
\usepackage[a4paper]{geometry}
%\usepackage[landscape,a5paper]{geometry}
%\usepackage[a5paper]{geometry}
%\usepackage[landscape,paperheight=8.17in,paperwidth=6.32in,top=1in,bottom=1in,right=1in,left=1in]{geometry}
\usetikzlibrary{calc}

\def\mygraphpaper{%
  \begin{tikzpicture}[remember picture]
    \draw[ystep=1cm, xstep=-1cm, gray] ([yshift=-2cm]current page.north west) grid ([yshift=2cm]current page.south east);
  \end{tikzpicture}%
}
\usepackage{background}
\backgroundsetup{
  angle=0,
  contents=\mygraphpaper,
  color=black,
  scale=1,
}

\begin{document}
\pagenumbering{gobble}
$\,$
\end{document}

在此处输入图片描述

相关内容