最近在用LaTeX排版时有一个需求——页面加框,这是一个很简单的需求,但实际上遇到了一些小问题.

方案一 fancybox

  使用fancybox插入页面框是最为简捷的,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
%% 导言区
\documentclass[11pt]{article}
\usepackage{fancybox}

%% 正文
\begin{document}
% \fancypage{<不包含页眉页脚的页面框>}{<包含页眉页脚的页面框>}
\fancypage{
\setlength{\fboxsep}{8pt} % 设置框线与版心边距
\setlength{\fboxrule}{0.8pt} % 设置框线的粗细
\setlength{\shadowsize}{0pt} % 设置投影距离
\shadowbox}{}
...
\end{document}

  这样的设置本应该没有什么问题,但是我的排版内容比较特殊,不同字段的不同颜色导致页面的框线、甚至是内容本身的颜色出现问题,但也没有办法,毕竟人家fancybox作者就说了——

Warning: The commands described in this section change LATEX's output routine, and may not work with document styles that do the same. Also, bad arguments can cause serious errors with uninformative error messages.

image-20210729195951694

方案二 eso-pic

  经过一番查找,采用另一种方案,虽然比较曲折,但可以解决上述问题,并且更加灵活,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
\documentclass{article}

\usepackage{tikzpagenodes} % 定位页面位置的宏包
\usetikzlibrary{calc}

\usepackage{eso-pic}
\newcommand{\addframe}{
\AddToShipoutPicture{
\begin{tikzpicture}[remember picture, overlay, black] % 此处如果不加上black,还是会出现框线颜色改变的问题
\draw[line width=1pt]
($(current page text area.north west) +(-5mm,5mm)$) % 这里的位置可以自定义
rectangle
($(current page text area.south east) +(5mm,-5mm)$);
\end{tikzpicture}
}
}

\newcommand{\removeframe}{\ClearShipoutPicture}
\begin{document}
\addframe % 添加页面框
....
\removeframe % 去除页面框
\end{document}

  此方案解决了方案一的问题.

image-20210729201131345

参考

[1] fancybox Documentation– Variants of and other games with boxes

[2] LaTex技巧229:用 fancybox 宏包给页面加边框

[3] eso-pic Documentation – Add picture commands (or backgrounds) to every page

[4] Is there any easy way to put boxes around text of selected pages with the page number below the box?