颜色渐变作为边距背景

颜色渐变作为边距背景

目前,我正在使用外部 PDF 图像来获取边距中提供的颜色渐变。请参阅下面的输出。我通过使用命令来实现这一点\ULCornerWallPaper{1}{./pictures/wallpaper_1.pdf}

但是这种方式效率很低,每次都要导入外部图片,编译时间很长,有没有更好的办法?

渐变仅应用于某些页面,因此如果您能为我提供一个可以包含在内解决方案,\ULCornerWallPaper{1}{}以便我可以在一段时间后使用命令撤消渐变, 那就太理想了\ClearWallPaper

我可以使用 来实现这一点tikz吗?我对它不是很熟悉,但它看起来像是一个可以解决我的问题的工具。

两个布偶

答案1

下面的解决方案定义了在选定页面的边距背景中绘制彩色渐变的两种替代方法:

  1. \conditionalmarginbg在文档开头调用(不带参数),然后使用\startdrawmarginbg\stopdrawmarginbg宏在文档中打开/关闭边距背景。
  2. \marginbgpagelist在文档开头调用;其唯一参数是绘制边距背景的页面列表。该列表使用pgffor\foreach语法,因此您可以指定10,...,20在第 10 到第 20 页绘制边距。

在下面的例子中,我使用了\conditionalmarginbg和,为了可视化,我强调了(红色,粗体文本)\startdrawmarginbg\stopdrawmarginbg被调用的地方。

笔记:

  • 您需要运行pdflatex不少于 3 次才能获得正确的输出。
  • 我假设您在写书时需要这个,所以我没有费心使我的解决方案与oneside类选项兼容。但它与 配合得很好twoside

参考:

在此处输入图片描述 在此处输入图片描述

\documentclass[twoside]{book}

\usepackage{lipsum}                         % for filler text
\usepackage[margin=3cm]{geometry}           % for setting the dimensions
\usepackage{tikzpagenodes}                      
\usepackage{background}
    \backgroundsetup%
    {%
        contents    = {},%
        opacity     = 1,%
        scale       = 1,
    }
\usepackage{etoolbox}                       % defines the \ifnumodd macro
\usepackage{xcolor}



% Let's define some colours for this colour gradient
\definecolor{outercolor}{gray}{.7}
\definecolor{innercolor}{gray}{1}

% a switch for toggling margin background on/off
\newif\ifdrawmarginbg\drawmarginbgfalse
\newcommand\startdrawmarginbg{\drawmarginbgtrue}
\newcommand\stopdrawmarginbg{\drawmarginbgfalse}

% redefinition of \emph, just to show where
% my \startdrawmarginbg and \stopdrawmarginbg are invoked in the example
\renewcommand\emph[1]{\textcolor{red}{\bfseries#1}}


% ----- Two possible strategies -----

% --- \conditionalmarginbg ---
% Invoke the following macro at the beginning of the document and then
% use \startdrawmarginbg and \stopdrawmarginbg to toggle the margin background
% gradient on/off in the document.
\newcommand\conditionalmarginbg%
{%
    \AddEverypageHook%
    {%
        \ifdrawmarginbg%
            \thispagemarginbg%
        \fi%
    }%
}

% --- \marginbgpagelist ---
% Invoke the following macro at the beginning of the document.
% It's only (mandatory) argument is a list (using pgffor's \foreach syntax)
% corresponding to the pages on which a margin background gradient
% should be drawn.
\newcommand\marginbgpagelist[1]%
{%
    \AddEverypageHook%
    {%
        \foreach \p in {#1}%
        {%
            \ifnum\value{page}=\p%
                \thispagemarginbg%
            \fi
        }%
    }%
}


% ----- Auxiliary macros ----- 

% Auxiliary macro for both \conditionalmarginbg and \marginbgpagelist
\newcommand\thispagemarginbg
{%
    \ifnumodd{\value{page}}
        {\marginbgevenorodd{1}}
        {\marginbgevenorodd{0}}
    \BgMaterial
}%

% Auxiliary macro for \thispagemarginbg
\newcommand\marginbgevenorodd[1]%
{%
    \ifnum#1=1%
        \def\shadeangle{90}
        \def\marginrectangle
        {%
            (current page marginpar area.south west |- current page.south)%
            rectangle%
            (current page.north east)
        }
    \else%
        \ifnum#1=0%

            \def\shadeangle{-90}
            \def\marginrectangle
            {%
                (current page marginpar area.south east |- current page.south)%
                rectangle%
                (current page.north west)
            }
        \else%
            \errmessage{Incompatible value supplied to \string\marginbgevenorodd}   
        \fi%
    \fi%
    \backgroundsetup
    {%
        angle=0,%
        contents=%
        {%
            \tikz[remember picture,overlay]
            \shade
            [%
                bottom color    = outercolor,%
                top color       = innercolor,%
                shading angle   = \shadeangle,%
            ] \marginrectangle;%
        }%                  
    }%
}

% Use either...
% \marginbgpagelist{2,3,...,4}
% or...
\conditionalmarginbg

\begin{document} 

\lipsum[1-10]

\emph{A margin background gradient is drawn from this page onwards.}
\startdrawmarginbg

\lipsum[21-40]

\emph{No margin background gradient is drawn from this page onwards.}
\stopdrawmarginbg

\lipsum[41-50]

\end{document}

答案2

我将提供一个使用 MetaFun 绘制渐变的解决方案。它绘制在图层上page,这意味着它位于文本元素和边注。您还可以使用leftpagerightpage在偶数页和奇数页中包含不同的背景。

由于 MetaPost 比 TikZ 或包含外部图形快得多,因此您不必担心编译时间。这uniqueMPgraphic确保图形仅计算一次并重复使用。这使得能够在大约 2.5 秒内绘制 1000 页渐变背景(在我的计算机上)。

可通过选项自定义位置gradientmargin。下面是使用 ConTeXt 的完整示例。

\setuplayout [width=13cm]

\startuniqueMPgraphic{background:gradient}
  path p;
    p := OverlayBox leftenlarged -\framedparameter{gradientmargin};
    linear_shade(p, 0, white, OverlayColor);
  setbounds currentpicture to boundingbox OverlayBox;
\stopuniqueMPgraphic

\defineoverlay
  [background:gradient]
  [\uniqueMPgraphic{background:gradient}]

\setupbackgrounds
  [page]
  [background=background:gradient,
   gradientmargin=15cm,
   backgroundcolor=middlegray]

\starttext
  \dorecurse{10}{\input knuth}
\stoptext

结果:

结果

相关内容