diff options
Diffstat (limited to 'macros/latex/contrib/xwatermark/tex/xwatermark.sty')
-rw-r--r-- | macros/latex/contrib/xwatermark/tex/xwatermark.sty | 2474 |
1 files changed, 2474 insertions, 0 deletions
diff --git a/macros/latex/contrib/xwatermark/tex/xwatermark.sty b/macros/latex/contrib/xwatermark/tex/xwatermark.sty new file mode 100644 index 0000000000..9ead5f270e --- /dev/null +++ b/macros/latex/contrib/xwatermark/tex/xwatermark.sty @@ -0,0 +1,2474 @@ +%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% +% This is file 'xwatermark.sty', version 1.5.2d, October 23, 2012. % +% % +% This package puts user-specified watermarks (graphics and arbitrary % +% texts) on select pages of documents. See package documentation % +% for further details. % +% % +% This work (ie, all the files in the xwatermark manifest) may be % +% distributed and/or modified under the conditions of the LaTeX % +% Project Public License, either version 1.3 of this license or any % +% later version. The latest version of this license is in % +% http://www.latex-project.org/lppl.txt and version 1.3 or later % +% is part of all distributions of LaTeX version 2005/12/01 or later. % +% % +% The LPPL maintenance status of this software is 'author-maintained'. % +% % +% This software is provided 'as it is', without warranty of any kind, % +% either expressed or implied, including, but not limited to, the % +% implied warranties of merchantability and fitness for a particular % +% purpose. % +% % +% Copyright (c) 2009-2012 Ahmed Musa (amusa22@gmail.com). % +%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% + +\@ifpackageloaded{catoptions}{% + \@ifpackagelater{catoptions}{2012/10/14}{}{% + \@latex@error{Loaded version of 'catoptions' package is + not current}\@ehd + }% +}{% + \RequirePackage{catoptions}[2012/10/14]% +} +\UseNormalCatcodes +\StyleFilePurpose{A dynamic watermarking scheme} +\StyleFileRCSInfo +$Id: xwatermark.sty,v 1.5.2d 2012/10/23 09:00:00 Ahmed Musa Exp $ +\ProvidesPackage{xwatermark}[\StyleFileInfo] +\NeedsTeXFormat{LaTeX2e}[2011/06/27] +\SetStyleFileMessages[xwm@]{info}{warn}{err} +\robust@def*\xwm@@err#1#2#3{\xwm@err{#1}{#2}\@gobble} +\cptloadpackages{% + fix-cm||2006/03/24; + picture||2008/11/26; + graphicx||1999/02/16; + atbegshi||2008/07/31; + fancyhdr; + atveryend||2010/03/24; + ltxkeys; + framed||2007/10/04 +} +\AtEndOfPackage{\BeforeStartOfDocument{% + \ifcsndefTF{ver@hyperref.sty}{}{\usepackage{hyperref}}% +}} + +\newletcs\xwm@nil\relax +\new@def*\xwm@nnil{\xwm@nil} +\AtBeginShipoutInit +\cptnewvariables{box}[xwm@box]{a,b}\relax +\cptnewvariables{count}[xwm@]{cnta}[\z@pt] +\cptnewvariables{if}[xwm@]{pdf,swa,swb,foregrd,wall,putmark}[false] +\newletcs\xwm@catch@nil\relax +\new@def*\xwm@catchtonil#1\xwm@catch@nil{\def\stuff{#1}} +\xwm@putmarktrue +\cptnewvariables{write}[xwm@]{wrt}\relax +\robust@def*\AtShipoutAlwaysUpperLeft#1{% + \AtBeginShipout{\AtBeginShipoutUpperLeft{#1}}% +} +\robust@def*\xwm@secstopagerange#1{% + % To do: what of if a chapter, instead of another section, + % comes after section. + \begingroup + \ifblankTF{#1}{}{% + \def\@do##1##2,##3\@nil##4{% + \ifstrcmpTF\do{##1}{}{% + \csn@xdef{xwm@sec@page@end@\detokenize{##4}}{##2}% + \do{##1}{##2},##3\@nil + }% + }% + \def\do##1##2,##3\@nil{% + \ifstrcmpTF\do{##1}{}{% + \csn@xdef{xwm@sec@page@start@\detokenize{##1}}{##2}% + \@do##3\@nil{##1}% + }% + }% + \do#1,\do\do,\@nil + }% + \endgroup +} +\new@def*\xwm@seclist{} +\AtEndDocument{% + \immediate\write\@auxout{% + \string\xwm@secstopagerange{% + \xwm@seclist\ifx\xwm@seclist\@empty\else,\fi + {10000}{\lastdocpage}% + }% + }% +} +\robust@def*\xwm@recordsecno{% + \xdef\xwm@seclist{% + \xwm@seclist\ifx\xwm@seclist\@empty\else,\fi + {\thesection}{\thepage}% + }% +} +\edef\reserved@a{% + % To do: do the same for chapter. + \def\noexpand\@seccntformat##1{% + \unexpanded\expandafter{\@seccntformat{#1}}% + \unexpanded{\protect\xwm@recordsecno}% + }% +} +\reserved@a +\new@def*\xwm@boxframestack{} +\robust@def*\xwm@pushboxframe{% + \xdef\xwm@boxframestack{% + \fboxrule=\the\fboxrule\relax + \fboxsep=\the\fboxsep\relax + \xwm@nil{\expandcsonce\xwm@boxframestack}% + }% +} +\robust@def*\xwm@popboxframe{% + \begingroup + \def\reserved@a##1\xwm@nil{\endgroup + ##1\gdef\xwm@boxframestack + }% + \expandafter\reserved@a\xwm@boxframestack +} +\robust@def\xwm@stripallouterbraces#1#2{% + \edef#2{\unexpanded\cptthreexp{\xwm@str@pallouterbraces#1\strip@nil}}% +} +\robust@def\xwm@str@pallouterbraces#1\strip@nil{% + \romannumeral\ifbracedTF{#1}{% + \expandafter\ifnullTF\expandafter{\@gobble#1}{% + \expandafter\@gobble\xwm@str@pallouterbraces#1\strip@nil + }{0 #1}% + }{0 #1}% +} +\robust@def\xwm@stripallouterbracesincs#1{% + \expandafter\xwm@stripallouterbraces\expandafter{#1}#1% +} +\new@def*\xwmremoveleadparsers#1#2{% + \s@expandarg\ifbracedTF{#2}{% + \unexpanded\expandafter{#2}% + }{% + \unexpanded\expandafter{\romannumeral + \expandafter\xwm@removeleadparsers#2\noboundary{#1}}% + }% +} +\new@def*\xwm@removeleadparsers#1#2\noboundary#3{% + \ifcondTF\if\string#1\string#3\fi{% + \xwm@removeleadparsers#2\noboundary{#3}% + }{% + 0 #1#2% + }% +} +\robust@def*\xwm@ifxcolorloaded{% + \ifcsndefTF{ver@xcolor.sty}\@iden{% + \xwm@err{'xcolor' package not loaded}\@ehd + }% +} +\robust@def*\xwmdefinecolor{% + \xwm@ifxcolorloaded{% + \let\reserved@e\definecolor + \cpt@testopt\xwm@definecolor{}% + }% +} +\robust@def*\xwmcolorlet{% + \xwm@ifxcolorloaded{% + \let\reserved@e\colorlet + \cpt@testopt\xwm@definecolor{}% + }% +} +\robust@def*\xwm@definecolor[#1]#2{% + \@ifundefinedcolor{#2}{% + \reserved@e[#1]{#2}% + }{% + \xwm@err{Color name '#2' already defined}\@ehd + }% +} +\robust@def*\xwmdefinecolorset{\cpt@testopt\xwm@definecolorset{x}} +\robust@def*\xwm@definecolorset[#1]{% + \cpt@testpnopt{\xwm@d@finecolorset{#1}}{1}% +} +\robust@def*\xwm@d@finecolorset#1(#2)#3{% + \xwm@ifxcolorloaded{% + \begingroup + \cptemptifycsset{\xwm@tempb,\xwm@tempc,\xwm@tempd,\xwm@tempe}% + \def\xwm@tempa##1,##2,##3,##4,##5\@nil{% + \ifblankTF{##4}{% + \xwm@err{Incomplete color format in + \string\xwmdefinecolorset}\@ehd + }{% + \def\xwm@tempf{##1}% + }% + }% + \cpt@stfalse\cpt@csvnormalize[;]{#3}% + \def\do##1;{% + \ifnot@nil{##1}{% + \xwm@tempa##1,,,,\@nil + \xifinsetTF{,\xwm@tempf,}{,\xwm@tempd,}{% + \edef\xwm@tempe{\csliststack,\xwm@tempe\xwm@tempf}% + }{% + \edef\xwm@tempd{\csliststack,\xwm@tempd\xwm@tempf}% + \@ifundefinedcolor{#1\xwm@tempf#2}{% + \edef\xwm@tempb{\csliststack;\xwm@tempb##1}% + }{% + \edef\xwm@tempc{\csliststack;\xwm@tempc#1\xwm@tempf#2}% + }% + }% + \do + }% + }% + \expandafter\do\normalized@list;\@nil;% + \ifcsemptyTF\xwm@tempe{}{% + \xwm@err{Color names '\expandcsonce\xwm@tempe' multiply + \MsgBrk submitted to \string\xwmdefinecolorset}\@ehd + }% + \ifcsemptyTF\xwm@tempc{}{% + \xwm@err{Color names '\expandcsonce\xwm@tempc' already in use}\@ehd + }% + \ifcsemptyTF\xwm@tempb{}{% + \cptexpandarg{\xglobal\definecolorset{rgb}{#1}{#2}} + {\expandcsonce\xwm@tempb}% + }% + \endgroup + }% +} +\DefSuffixChecker\xwm@suffixcheck{*}{+}{'} +\robust@def*\xwmifitemsinTF{% + \begingroup\xwm@swatrue\cpt@testopt\xwm@itemsin\@ne +} +\robust@def*\xxwmifitemsinTF{% + \begingroup\xwm@swatrue\cpt@testopt\xwm@xitemsin\@ne +} +\robust@def*\xwmifitemsinFT{% + \begingroup\xwm@swafalse\cpt@testopt\xwm@itemsin\@ne +} +\robust@def\xwm@xitemsin[#1]#2#3{% + \cptexpandtwoargs{\xwm@itemsin[#1]}{#2}{#3}% +} +\robust@def\xwm@itemsin[#1]#2#3{% + \begingroup + \afterassignment\xwm@catchtonil\@tempcnta=#1\xwm@catch@nil + \if\relax\cptoxdetok\stuff\relax + \ifnum\numexpr#1<\@ne + \xwm@err{Invalid number '\the#1'\relax + \MsgBrk for command \string\xwmifitemsinTF}\@ehd + \fi + \else + \xwm@err{Token '\detokenize{#1}' not an integer}\@ehd + \fi + \endgroup + \lowercase{% + \edef\xwm@tempa{\unexpanded{#2}}% + \edef\xwm@tempb{\unexpanded{#3}}% + }% + \cpt@sttrue\cpt@csvnormalize[,]\xwm@tempb + \def\xwm@nritems{0}% + \def\xwm@items{}% + \def\csv@do##1{% + \xifinsetFT{,\detokenize{##1}}{,\cptoxdetok\xwm@tempb}{}{% + \edef\xwm@items{% + \expandcsonce\xwm@items\ifx\xwm@items\@empty\else,\fi + \unexpanded{##1}% + }% + \edef\xwm@nritems{\the\numexpr\xwm@nritems+1}% + \ifnum\xwm@nritems>\numexpr#1-1\relax\loopbreak\fi + }% + }% + \csv@@parse*[,]\xwm@tempa + \expandafter\endgroup + \csname + @\ifnum\xwm@nritems>\numexpr#1-1\relax + \ifxwm@swa first\else second\fi + \else + \ifxwm@swa second\else first\fi + \fi + oftwo\endcsname +} +\robust@def*\xwm@hyphenpagerange#1#2#3{% + \xifinsetTF{\detokenize{\xwmgetpagenumber}}{\cptoxdetok{#1}}{% + \xwm@swbtrue + }{% + \xifinsetTF{\detokenize{\lastdocpage}}{\cptoxdetok{#1}}{% + \xwm@swbtrue + }{% + \xwm@swbfalse + }% + }% + \protected@edef#2{#1}\def#3{}% + \begingroup + \catcode`\-=12\relax + \cptscantokens#2% + \postgroupdef#2\endgroup + \oifinsetTF{-}{#2}{% + \expandafter\xwm@splitpagerange#2\xwm@nil{#2}{#3}% + }{% + \ifblankTF{#1}{% + \xwm@err{Empty page range for watermark: + ^^J||\expandcsonce\xwm@currwatermark||.^^J}\@ehd + }{% + \protected@edef#3{#1}% + }% + }% +} +\robust@def*\xwm@splitpagerange#1-#2\xwm@nil#3#4{% + \def#3{#1}\def#4{#2}% + \ifinsetTF{-}{#2}{% + \xwm@err{Too many hyphens in page range '#1-#2' + \MsgBrk of watermark:^^J||\expandcsonce\xwm@currwatermark||}\@ehd + }{% + \ifblankTF{#1}{% + \xwm@warn{No start-page in page-range of watermark: + ^^J||\expandcsonce\xwm@currwatermark||.^^JI have used the + default start-page '\xwm@defaultfirstpage' + instead}% + \def#3{\xwm@defaultfirstpage}% + \xwm@swafalse + }{% + \xwm@swatrue + }% + \ifblankTF{#2}{% + \xwm@warn{No end-page for page-range + of watermark:^^J||\expandcsonce\xwm@currwatermark|| + ^^JI have used the default end-page + '\xwm@defaultlastpage' instead}% + \def#4{\xwm@defaultlastpage}% + \xwm@swafalse + }{% + \xwm@swatrue + }% + \ifxwm@swa + \ifnum\numexpr#1=\numexpr#2\relax\else + \ifnum\numexpr#1<\numexpr#2\relax\else + \ifxwm@swb\else + \xwm@err{Watermark start-page '#1' is greater + than end-page '#2'}\@ehd + \fi + \fi + \fi + \fi + }% +} +\let\xwm@papercenter\relax +\ifdefTF\pdfoutput{% + \ifnum\pdfoutput<\@ne\xwm@pdffalse\else\xwm@pdftrue\fi +}{% + \xwm@pdffalse +} +\new@def*\xwm@allowedcoordunits{% + em,ex,in,pt,pc,cm,mm,dd,cc,nd,nc,bp,sp,\paperwidth,% + \paperheight,\textwidth,\textheight,\hsize,\vsize,% + \columnwidth,\linewidth +} +\robust@def*\xwm@checkcoordunit#1{% + \oifinset@sp@TF,{#1}{\xwm@allowedcoordunits}{}{% + \xwm@err{Invalid coordinate unit '#1'}{% + Allowed coordinate units are: + ^^J||\xwm@allowedcoordunits||^^J}% + }% +} +\robust@def*\xwm@defaultunits#1#2{% + \begingroup + \@defaultunits\@tempdima\dimexpr#1\p@\relax\@nnil + \edefpass#2{\endgroup\def\noexpand#2{\the\@tempdima}}% +} +\robust@def*\xwm@getposition#1#2#3{% + \begingroup + \@defaultunits\@tempdima\dimexpr#1#3\p@\relax\@nnil + \edef\xwm@tempa{\the\dimexpr0.5\paperwidth+\@tempdima\relax}% + \@defaultunits\@tempdima\dimexpr#2#3\p@\relax\@nnil + \edef\xwm@tempb{\the\dimexpr-0.5\paperheight+\@tempdima\relax}% + \cptexpanded{\endgroup + \csn@def{\cptremovescape#1@a}{\xwm@tempa}% + \csn@def{\cptremovescape#2@a}{\xwm@tempb}% + }% +} +\cptrobustify{% + \fbox,\framebox,\makebox,\rotatebox,\scalebox,\raisebox +} +\new@def*\xwm@relax{\relax} +\robust@def*\xwm@settextalign#1{% + \ifmacroTF{#1}{}{\cpt@notcserr{#1}}% + \begingroup + \cptexpandmacro{#1}\xwm@tempa + \cptexpandargonce{\endgroup\xwm@stripallouterbraces}\xwm@tempa#1% + \ltxkeys@trimspacesincs{#1}% + \cptexpandsecond{\def\reserved@a##1}{#1}##2##3\xwm@nil{% + \def\reserved@a{##2}% + \ifxTF\reserved@a\xwm@nnil{% + \cpt@err{Invalid value '#1' for textalign}\@ehd + \def#1{xwm@relax}% + }{% + \def#1{##2}% + }% + }% + \cptexpandsecond{\reserved@a + center{center},\centering{center},right{flushright}, + \flushright{flushright},\raggedleft{flushright}, + left{flushleft},\flushleft{flushleft},\raggedright{flushleft}, + justified{xwm@relax},\relax{xwm@relax},xwm@relax{xwm@relax}% + }{#1}{\xwm@nil}\xwm@nil +} +\robust@def*\xwm@getalign#1{% + \ifmacroTF{#1}{% + \csn@edef{xwm@\expandafter\@gobblethree\string#1}{% + \xifstrcmpTF{#1}{\relax}{relax}{#1}% + }% + }{% + \cpt@notcserr{#1}% + }% +} +% 'boxalign' may be in the format 't-l, t-r, b-l, b-r, c, s' +% or 'top-left, top-right, etc': +\robust@def*\xwm@setboxalign#1{% + \ifmacroTF{#1}{}{\cpt@notcserr{#1}}% + \begingroup + \toks@{}% + \cptexpandarg\lowercase{\def\noexpand\reserved@a{#1}}% + % We don't want the format 't-l' mixed with 'top-left': + \def\xwm@tempa{}\def\xwm@tempb{}% + \def\xwm@resa##1-{% + \ifstrcmpTF{##1}{\xwm@nil}{}{% + \ifinsetTF{,##1,}{,top,left,right,bottom,center,justified,}{% + \edef\xwm@tempa{\csliststack,\xwm@tempa##1}% + }{% + \ifinsetTF{,##1,}{,l,r,b,t,c,s,}{% + \edef\xwm@tempb{\xwm@tempb##1}% + }{% + \toks@\expandafter{\the\toks@##1}% + }% + }% + \xwm@resa + }% + }% + \expandafter\xwm@resa\reserved@a-\xwm@nil-% + \s@expandarg\ifnullTF{\the\toks@}{}{% + \xwm@err{'boxalign' has invalid or inconsistent + \MsgBrk values '#1'}\@ehd + }% + \ifcsnullTF\xwm@tempa{}{% + \ifcsnullTF\xwm@tempb{}{% + \xwm@err{Invalid values '#1' for 'boxalign': + \MsgBrk possibly a mixture of styles}\@ehd + }% + }% + \def\xwm@tempc{}% + \ifcsnullTF\xwm@tempa{}{% + \def\xwm@resa##1##2##3\xwm@nil##4{% + \ifblankTF{##3}{}{% + \ifinsetFT{,##1,}{,##4,}{}{% + \xifinsetTF{##2}{\xwm@tempc}{}{% + \edef\xwm@tempc{\xwm@tempc##2}% + }% + }% + \xwm@resa##3\xwm@nil{##4}% + }% + }% + \cptexpandarg + {\xwm@resa{center}{c}{justified}{s}{left}{l}{right}{r}% + {top}{t}{bottom}{b}\xwm@mil\xwm@mil\xwm@nil}\xwm@tempa + }% + \ifcsnullTF\xwm@tempb{}{% + \def\siso@do##1{% + \ifinsetFT{,##1,}{,l,r,b,t,c,s,}{}{% + \xifinsetTF{##1}{\xwm@tempc}{}{% + \edef\xwm@tempc{\xwm@tempc##1}% + }% + }% + }% + \simpleexpandarg\siso@@loop\xwm@tempb + }% + \ifcsnullTF\xwm@tempc{% + \xifblankTF{#1}{% + \def\xwm@tempc{s}% + }{% + \xwm@err{Invalid entries '#1' for 'boxalign'}\@ehd + }% + }{% + \begingroup + \cpt@cnta\z@pt + \def\siso@do##1{\advance\cpt@cnta\@ne}% + \s@expandarg\siso@@loop\xwm@tempc + \ifnum\cpt@cnta>2\relax + \xwm@err{More than two entries '#1' for 'boxalign'}\@ehd + \fi + \endgroup + }% + \let#1=\xwm@tempc + \postgroupdef#1\endgroup +} +\robust@def*\xwm@notenddocerr{% + \xwm@err{Wrong location of end-of-document command}\@ehd +} +\robust@def*\AfterEndOfDocument{\grightaddtocs\xwm@afterenddoc} +\new@def*\xwm@afterenddoc{} +\robust@def*\AfterLastPageOfDocument{% + \grightaddtocs\xwm@afterlastpage +} +\new@def*\xwm@afterlastpage{} +\AtEndDocument{% + \let\xwm@aft@renddoc\AtVeryEnd@AtVeryEndDocumentHook + \def\AtVeryEnd@AtVeryEndDocumentHook{% + \let\AfterEndOfDocument\@firstofone + \xwm@afterenddoc\xwm@aft@renddoc + \let\AfterEndOfDocument\xwm@notenddocerr + \undefcs\xwm@afterenddoc + \undefcs\xwm@aft@renddoc + }% + \let\xwm@afterl@stpage\AtVeryEnd@AfterLastShipoutHook + \def\AtVeryEnd@AfterLastShipoutHook{% + \let\AfterLastPageOfDocument\@firstofone + \xwm@afterlastpage\xwm@afterl@stpage + \let\AfterLastPageOfDocument\xwm@notenddocerr + \undefcs\xwm@afterlastpage + \undefcs\xwm@afterl@stpage + }% +} +\robust@def*\xwmnewlabel{\xwm@newlabel{xwmr}} +\robust@def*\xwm@newlabel#1#2#3{% + \begingroup + \ifcsndefFT{#1@#2}{}{% + \gdef\xwm@multiplelabels{% + \ltxmsg@warn{There were multiply-defined labels}% + }% + \ltxmsg@warn{Label '#2' multiply defined}% + }% + \csn@gdef{#1@#2}{#3}% + \endgroup +} +\let\xwm@multiplelabels\relax +\BeforeStartOfDocument{% + \global\let\xwm@multiplelabels\relax +} +\robust@def*\xwm@lbtestdef#1#2#3{% + \begingroup + \def\xwm@tempa{#3}% + \expandafter\ifx\csname#1@#2\endcsname\xwm@tempa\else + \gdef\xwm@lbtestsw{00}\fi + \endgroup +} +\begingroup +\makeatletter +\InputIfFileExists{\jobname.xwm}{}{} +\endgroup +\if@filesw + \immediate\openout\xwm@wrt=\jobname.xwm + \immediate\write\xwm@wrt{\relax} +\fi +\AfterLastPageOfDocument{% + \if@filesw + \begingroup + \advance\c@page\m@one + \xwmlabel{xwmlastpage}% + \endgroup + \fi + \immediate\closeout\xwm@wrt + \let\xwm@newlabel\xwm@lbtestdef + \gdef\xwm@lbtestsw{01}% + \begingroup + \makeatletter + \InputIfFileExists{\jobname.xwm}{}{}% + \endgroup + \if@filesw + \ifx\xwm@multiplelabels\relax + \if\xwm@lbtestsw + \ltxmsg@warn{Label(s) may have changed. + Rerun to get cross-references right}% + \fi + \else + \xwm@multiplelabels + \fi + \fi +} +\new@def*\xwm@labelcarr#1#2#3\xwm@nil{\ifblankTF{#3}{}{#2}} +\new@def*\xwmgetpagenumber#1{% + \ifcsndefTF{xwmr@#1}{% + \cptsevenxp\xwm@labelcarr + \usename{xwmr@#1}\xwm@defaultfirstpage\xwm@nil + }{% + \xwm@defaultfirstpage + }% +} +\new@def*\lastdocpage{\xwmgetpagenumber{xwmlastpage}} +\robust@def*\xwmlabel#1{% + \@bsphack + \begingroup + \@onelevel@sanitize\@currentlabelname + \edef\@currentlabelname{% + \expandafter\strip@period\@currentlabelname\relax.\relax\@@@ + }% + \immediate\write\@auxout{% + \string\newlabel{#1}{{\@currentlabel}{\thepage}% + {\@currentlabelname}{\@currentHref}{}}% + }% + \immediate\write\xwm@wrt{% + \string\xwmnewlabel{#1}{{\@currentlabel}{\thepage}% + {\@currentlabelname}{\@currentHref}{}}% + }% + \endgroup + \@esphack +} +\robust@def*\DeclareWatermarkParser#1{% + \begingroup + \xwm@stripallouterbraces{#1}\xwm@tempa + \xdef\xwm@watermarkparser{\cptoxdetok\xwm@tempa}% + \endgroup +} +\DeclareWatermarkParser{;} +\robust@def*\xwm@put{\leavevmode\put} +\new@edef*\xwm@defaultfileext{\ifxwm@pdf pdf\else eps\fi} +\new@def*\xwm@picfilesread{} +\robust@def*\xwm@fileextfn#1#2{% + \ifcsndefFT{#2picfile}{}{% + \def\xwm@tempb##1##2{% + \xwm@warn{Default file extension '##1'\MsgBrk + substituted for invalid '#1' in\MsgBrk + ##2 mode. I'll later confirm the\MsgBrk + existence of \usename{#2picfile}.##1% + }% + }% + \ifcsnnullTF{#2picfile}{% + \csn@edef{#2picfileext}{}% + }{% + \xifinsetTF{,\usename{#2picfile},}{,\xwm@picfilesread,}{% + \xwm@swbfalse + }{% + \xwm@swbtrue + \cptgxaddtolist*\xwm@picfilesread{\usename{#2picfile}}% + }% + \aftercsname\xwm@stripallouterbracesincs{#2picfileext}% + \ifdefboolTF{xwm@pdf}{% + \xifinsetTF{,\usename{#2picfileext},}{,pdf,png,jpeg,jpg,mps,}{}{% + \csn@def{#2picfileext}{pdf}% + \ifxwm@swb\xwm@tempb{pdf}{pdf}\fi + }% + }{% + \xifinsetTF{,\usename{#2picfileext},}{,eps,ps,}{}{% + \csn@def{#2picfileext}{eps}% + \ifxwm@swb\xwm@tempb{eps}{dvi}\fi + }% + }% + }% + }% +} +\ltxkeys@boolkey[XWM]{main}[xwm@]{disablegeometry}[true]{% + \BeforeStartOfDocument{% + \ifxwm@disablegeometry + \ifdefFT\geometry{}{% + \geometry{pass}% + \xwm@info{On your request (ie, 'disablegeometry=true') + \MsgBrk I have disabled the features of the + \MsgBrk 'geometry' package}% + }% + \fi + }% +} +\new@def*\xwm@gr@phicsoptions{} +\robust@def*\GraphicsOptions#1{\gdef\xwm@gr@phicsoptions{#1}} +\ltxkeys@definekeys*[XWM]{main}[xwm@]{% + disable-geometry=true/\setaliaskey{disablegeometry}; + printwatermark=true; + print-watermark=true/\setaliaskey{printwatermark}; + allownesting=true; + showpagecenter=true/\ifdefboolTF{xwm@showpagecenter} + {\wmk@showpagecentertrue\wlp@showpagecentertrue}{}; + show-page-center=true/\setaliaskey{showpagecenter}; + showpapercenter=true/\setaliaskey{showpagecenter}; + usedummymarks=true; + use-dummy-marks=true/\setaliaskey{usedummymarks}; + defaultfirstpage=1; + default-first-page=1/\setaliaskey{defaultfirstpage}; + defaultlastpage=\xwmgetpagenumber{xwmlastpage}; + default-last-page=\xwmgetpagenumber{xwmlastpage}/ + \setaliaskey{defaultlastpage}; + frontpagestyle=empty; + front-page-style=empty/\setaliaskey{frontpagestyle}; + watermarkparser={;}/\DeclareWatermarkParser{#1}; + watermark-parser={;}/\setaliaskey{watermarkparser}; + resetpaperorigin=true/\ifxwm@resetpaperorigin\pdfhorigin\z@pt + \pdfvorigin\z@pt\hoffset\z@pt\voffset\z@pt\fi; + reset-paper-origin=true/\setaliaskey{resetpaperorigin}; +} +\ltxkeys@biboolkeys+[XWM]{main}[xwm@]{draft,final}[true] + {}{}{\ltxkeys@keyvalerr} +\ltxkeys@makeoptionkeys[XWM]{main} +\BeforeStartOfDocument{% + \ifxwm@printwatermark + \cptreplaceoneelement\XWM@main@initialkeyvals + {printwatermark=false}{printwatermark=true}% + \fi +} +\robust@def*\xwm@defcommonkeys#1{% + \begingroup + \endlinechar\m@one + \expandafter\endgroup\xwm@defc@mmonkeys{#1}% +} +\robust@def*\xwm@defc@mmonkeys#1#2{% + \csn@def{#1@commonkeys}##1{#2}% + \AtEndOfPackage{\letcsntocs{#1@commonkeys}\relax}% +} +\xwm@defcommonkeys{xwm-1}{% + minmark=true; + onepageonly=true; + prange=true; + tmark=true; + pmark=true; + graphicsoptions={}/ + \ifbracedTF{##1}{% + \aftercsname{\xwm@stripallouterbraces{##1}}{#1graphicsoptions} + }{% + \cpt@err{Values of key 'graphicsoptions' not braced}\@ehd + }; + GraphicsOptions=/ + \ifdocstartedTF{% + \xwm@err{\noexpand\GraphicsOptions + is a command, not a key.\MsgBrk + Maybe you meant 'graphicsoptions'}\@ehd + }{}; + picontoptext=true; + picture-on-top-text=true/\setaliaskey{picontoptext}; + pic-on-top-text=true/\setaliaskey{picontoptext}; + textontoppic=true/\setaliaskey{picontoptext}[false]; + text-on-top-picture=true/\setaliaskey{picontoptext}[false]; + text-on-top-pic=true/\setaliaskey{picontoptext}[false]; + draftboxcolor=blue; + draft-box-color=blue/\setaliaskey{draftboxcolor}; + textcolor=gray!25; + text-color=gray!25/\setaliaskey{textcolor}; + color=gray!25/\setaliaskey{textcolor}; + textangle=0; + text-angle=0/\setaliaskey{textangle}; + angle=0/\setaliaskey{textangle}; + textscale=1; + text-scale=1/\setaliaskey{textscale}; + scale=1/\setaliaskey{textscale}; + textalign=center/\aftercsname\xwm@settextalign{#1textalign}; + text-align=center/\setaliaskey{textalign}; + align=center/\setaliaskey{textalign}; + showpagecenter=true/\ifdefboolTF{#1showpagecenter}{% + \usename{#1showpagecentertrue}}{\usename{#1showpagecenterfalse}}; + show-page-center=true/\setaliaskey{showpagecenter}; + showpapercenter=true/\setaliaskey{showpagecenter}; + fontsize=1cm/\aftercsname{\xwm@defaultunits{##1}}{#1fontsize}; + fontseries=b; + fontfamily=bch; + \needvalue{picfile}=/\aftercsname\xwm@stripallouterbracesincs{#1picfile} + \ifcsnnullTF{#1picfile}{\usename{#1pmarkfalse}}{\usename{#1pmarktrue} + \usename{#1minmarktrue}}; + \needvalue{picture-file}=/\setaliaskey{picfile}; + picfileext=\xwm@defaultfileext/\xwm@fileextfn{##1}{#1}; + pic-file-ext=\xwm@defaultfileext/\setaliaskey{picfileext}; + picangle=0; + picture-angle=0/\setaliaskey{picangle}; + picscale=1; + picture-scale=1/\setaliaskey{picscale}; + picbb=0 0 100 100; + picture-bb=0 0 100 100/\setaliaskey{picbb}; + pic-bounding-box=0 0 100 100/\setaliaskey{picbb}; + picxpos=\z@pt; + picture-xpos=0/\setaliaskey{picxpos}; + picture-x-position=0/\setaliaskey{picxpos}; + picypos=\z@pt; + picture-ypos=0/\setaliaskey{picypos}; + picture-y-position=0/\setaliaskey{picypos}; + mark=DRAFT/\setaliaskey{textmark}; + textmark=DRAFT/ + \aftercsname\xwm@stripallouterbracesincs{#1textmark} + \ifcsnnullTF{#1textmark}{% + \usename{#1tmarkfalse} + }{% + \usename{#1tmarktrue} + }; + text-mark=DRAFT/\setaliaskey{textmark}; + firstpage=true/\ifdefboolFT{#1firstpage}{}{\usename{#1minmarktrue}}; + first-page=true/\setaliaskey{firstpage}; + allpages=true/\ifdefboolFT{#1allpages}{}{\usename{#1minmarktrue}}; + oddpages=true/\ifdefboolFT{#1oddpages}{}{\usename{#1minmarktrue}}; + evenpages=true/\ifdefboolFT{#1evenpages}{}{\usename{#1minmarktrue}}; + page=1/ + \ifinsetTF{-}{##1}{% + \xwm@err{I found '-' in '##1' for key 'page', + \MsgBrk but 'page' doesn't take page-range}\@ehd + }{% + \ifnum\numexpr##1=\z@pt\else\usename{#1onepageonlytrue} + \usename{#1minmarktrue}\fi + }; + pages=1-1/ + \aftercsname\xwm@stripallouterbracesincs{#1pages} + \aftercsname\xifstrcmpTF{#1pages}{0-0}{}{% + \usename{#1prangetrue}\usename{#1minmarktrue} + } + \cptexpandsecond\xwm@hyphenpagerange{\cptmakecs{#1pages} + \cptmakecs{#1pagestart}\cptmakecs{#1pageend}}; + pagex={1}/ + \ifbracedTF{##1}{}{% + \xwm@err{Value of key 'pagex' must be braced}\@ehd + }; + boxalign=/\ifblankTF{##1}{} + {\aftercsname\xwm@setboxalign{#1boxalign}}; + box-align=/\setaliaskey{boxalign}; +} +\robust@def*\xwm@adddefkeys{% + \begingroup + \endlinechar\m@one + \cpt@testopt\xwm@addd@fkeys{}% +} +\robust@def\xwm@addd@fkeys[#1]#2#3#4#5{% + \def\xwm@tempa{\endgroup#4}% + \expandafter\expandafter\expandafter\xwm@tempa + \expandafter\expandafter\expandafter + {\csname#2@commonkeys\endcsname{#3}#1#5}% +} +\xwm@adddefkeys[;]{xwm-1}{wmk@} + {\ltxkeys@definekeys*[XWM]{watermark}[wmk@]}{% + textwidth=\paperheight; + text-width=\paperheight/\setaliaskey{textwidth}; + width=\paperheight/\setaliaskey{textwidth}; + textheight=\paperwidth; + text-height=\paperwidth/\setaliaskey{textheight}; + height=\paperwidth/\setaliaskey{textheight}; + \needvalue{picheight}=; + pic-height=/\setaliaskey{picheight}; + picture-height=/\setaliaskey{picheight}; + \needvalue{picwidth}=; + picture-width=/\setaliaskey{picwidth}; + textxpos=0; + text-xpos=0/\setaliaskey{textxpos}; + text-x-position=0/\setaliaskey{textxpos}; + xpos=0/\setaliaskey{textxpos}; + textypos=0; + text-ypos=0/\setaliaskey{textypos}; + text-y-position=0/\setaliaskey{textypos}; + ypos=0/\setaliaskey{textypos}; + coordunit=mm/\xwm@checkcoordunit{#1}; + coord-unit=mm/\setaliaskey{coordunit}; + position-unit=mm/\setaliaskey{coordunit}; +} +\ltxkeys@makeoptionkeys*[XWM]{watermark} +\xwm@adddefkeys[;]{xwm-1}{wlp@} + {\ltxkeys@definekeys*[XWM]{wallpaper}[wlp@]}{% + textheight=\wlp@tileysize; + text-height=\wlp@tileysize/\setaliaskey{textheight}; + textwidth=\wlp@tilexsize; + text-width=\wlp@tilexsize/\setaliaskey{textwidth}; + picheight=\wlp@tileysize; + picture-height=\wlp@tileysize/\setaliaskey{picheight}; + picwidth=\wlp@tilexsize; + picture-width=\wlp@tilexsize/\setaliaskey{picwidth}; + tilexsize=.25\paperwidth; + tile-xsize=.25/\setaliaskey{tilexsize}; + tileysize=.25\paperheight; + tile-ysize=.25/\setaliaskey{tileysize}; + wpxoffset=\z@pt; + wallpaper-xoffset=\z@pt/\setaliaskey{wpxoffset}; + wpyoffset=\z@pt; + wallpaper-yoffset=\z@pt/\setaliaskey{wpyoffset}; + tilexoffset=\z@pt; + tile-xoffset=\z@pt/\setaliaskey{tilexoffset}; + tileyoffset=\z@pt; + tile-yoffset=\z@pt/\setaliaskey{tileyoffset}; + tileno=4; + tilenumber=4/\setaliaskey{tileno}; + tile-number=4/\setaliaskey{tileno}; + number-of-tiles=4/\setaliaskey{tileno}; + squaretiles=true; + square-tiles=true/\setaliaskey{squaretiles}; +} +\ltxkeys@makeoptionkeys*[XWM]{wallpaper} +\ltxkeys@definekeys*[XWM]{fancypagenos}[pgn@]{% + textalign=center/\xwm@settextalign\pgn@textalign; + text-align=center/\setaliaskey{textalign}; + align=center/\setaliaskey{textalign}; + boxalign=/\ifblankTF{#1}{}{\xwm@setboxalign\pgn@boxalign}; + box-align=center/\setaliaskey{boxalign}; + textangle=0; + text-angle=0/\setaliaskey{textangle}; + angle=0/\setaliaskey{textangle}; + picangle=0; + picture-angle=0/\setaliaskey{picangle}; + textwidth=.25\textwidth; + text-width=.25/\setaliaskey{textwidth}; + width=.25\hsize/\setaliaskey{textwidth}; + textheight=.25\textheight; + text-height=.25/\setaliaskey{textheight}; + height=.25\vsize/\setaliaskey{textheight}; + textxpos=\z@pt; + x-position=0/\setaliaskey{textxpos}; + xposition=0/\setaliaskey{textxpos}; + xpos=\z@pt/\setaliaskey{textxpos}; + textypos=\z@pt; + y-position=0/\setaliaskey{textypos}; + yposition=0/\setaliaskey{textypos}; + ypos=\z@pt/\setaliaskey{textypos}; + textcolor=blue; + text-color=blue/\setaliaskey{textcolor}; + color=blue/\setaliaskey{textcolor}; + textscale=2.5; + text-scale=2.5/\setaliaskey{textscale}; + scale=2.5/\setaliaskey{textscale}; + coordunit=mm/\xwm@checkcoordunit{#1}; + coord-unit=mm/\setaliaskey{coordunit}; + position-unit=mm/\setaliaskey{coordunit}; + fontfamily=bch; + fontseries=m; + format=\fbox; + framerule=.4\p@; + framesep=3\p@; + fontsize=12\p@/\xwm@defaultunits{#1}\pgn@fontsize; + cfoot; + center-footer=/\setaliaskey{cfoot}; + footer-center=/\setaliaskey{cfoot}; + rfoot; + right-footer=/\setaliaskey{rfoot}; + footer-right=/\setaliaskey{rfoot}; + lfoot; + left-footer=/\setaliaskey{lfoot}; + footer-left=/\setaliaskey{lfoot}; + chead; + center-header=/\setaliaskey{chead}; + header-center=/\setaliaskey{chead}; + rhead; + right-header=/\setaliaskey{rhead}; + header-right=/\setaliaskey{rhead}; + lhead; + left-header=/\setaliaskey{lhead}; + header-left=/\setaliaskey{lhead}; + headruleheight=.4\p@; + headrule-height=.4\p@/\setaliaskey{headruleheight}; + headruledepth=.4\p@; + headrule-depth=.4\p@/\setaliaskey{headruledepth}; + headrulewidth=\headwidth; + headrule-width=\headwidth/\setaliaskey{headrulewidth}; + headrulesep=2\p@; + headrule-sep=2\p@/\setaliaskey{headrulesep}; + headrule-separation=2\p@/\setaliaskey{headrulesep}; + headrulecolor=blue; + headrule-color=blue/\setaliaskey{headrulecolor}; + footruleheight=.4\p@; + footrule-height=.4\p@/\setaliaskey{footruleheight}; + footruledepth=.4\p@; + footrule-depth=.4\p@/\setaliaskey{footruledepth}; + footrulewidth=\headwidth; + footrule-width=\headwidth/\setaliaskey{footrulewidth}; + footrulesep=2\p@; + footrule-sep=2\p@/\setaliaskey{footrulesep}; + footrule-separation=2\p@/\setaliaskey{footrulesep}; + footrulecolor=cyan; + footrule-color=blue/\setaliaskey{footrulecolor}; + hfoffsetleft=.5; + hfoffset-left=.5/\setaliaskey{hfoffsetleft}; + hfoffsetright=.5; + hfoffset-right=.5/\setaliaskey{hfoffsetright}; + style=\thepage; + printstyle=\thepage/\setaliaskey{style}; + sendtoback=true; +} +\ltxkeys@makeoptionkeys*[XWM]{fancypagenos} +\ltxkeys@definekeys*[XWM]{fancypagenos}[pgn@]{% + showpagenos=true/\ifpgn@showpagenos\global\pgn@showpagenostrue\fi; + showpagenumbers=true/\setaliaskey{showpagenos}; + show-page-numbers=true/\setaliaskey{showpagenos}; + show-pagenos=true/\setaliaskey{showpagenos}; + show-pageno=true/\setaliaskey{showpagenos}; + showonpageone=true; + show-on-page-one=true/\setaliaskey{showonpageone}; + showheadrule=true; + show-headrule=true/\setaliaskey{showheadrule}; + showfootrule=true; + show-footrule=true/\setaliaskey{showfootrule}; +} +\BeforeStartOfDocument{% + \ifpgn@showpagenos + \cptreplaceoneelement\XWM@fancypagenos@initialkeyvals + {showpagenos=false}{showpagenos=true}% + \fi +} +\robust@def*\PrintWatermark{\global\xwm@printwatermarktrue} +\ltxkeys@declareoption*{% + \ltxkeys@getpvalnopad + \xwm@warn{Unknown option '\CurrentKey' with + value '\InnocentVal' ignored}% +} +\ltxkeys@executeoptions[XWM]<main>{% + printwatermark=true,disablegeometry=false +}\relax +\ltxkeys@processoptions*[XWM]<main,watermark,wallpaper,% + fancypagenos>\relax +\new@def*\xwm@samplemarkkeys{% + firstpage,lastpage,allpages,oddpages,evenpages, + picscale,picture-scale, + picfile,picture-file, + picfileext,pic-file-ext, + picangle,picture-angle, + picbb,picture-bb,pic-bounding-box, + picxpos,picture-xpos,picture-x-position, + picypos,picture-ypos,picture-y-position, + showpagecenter,show-page-center, + picontoptext,picture-on-top-text,pic-on-top-text, + textontoppic,text-on-top-picture,text-on-top-pic=true, + pic-height,picture-height, + picwidth,picture-width, + squaretiles,square-tiles, + tilexsize,tile-xsize, + tileysize,tile-ysize, + wpxoffset,wallpaper-xoffset, + wpyoffset,wallpaper-yoffset, + tilexoffset,tile-xoffset, + tileyoffset,tile-yoffset, + tileno,tilenumber,tile-number,number-of-tiles +} +\new@def*\xwm@pagespecifiers{% + % '=' is needed here to create uniqueness; eg, to avoid confusing + % ',page' with ',pages'. + page=,pages=,pagex=,firstpage,lastpage,allpages,oddpages,evenpages,% + section=,sections=,sectionx=% +} +\robust@def*\xwm@decidedetok#1{% + \ifntypeTF{#1}{% + \ifmacroTF{#1}{% + \let\xwm@detoktype\cptoxdetok + }{% + \let\xwm@detoktype\detokenize + }% + }{% + \let\xwm@detoktype\detokenize + }% +} +\robust@def*\xwm@decidexp#1{% + \ifntypeTF{#1}{% + \ifmacroTF{#1}{% + \let\xwm@exptype\expandcsonce + }{% + \let\xwm@exptype\unexpanded + }% + }{% + \let\xwm@exptype\unexpanded + }% +} +\robust@def*\newwatermark#1{% + \xwm@wallfalse + \ifstrcmpTF{#1}\dummywatermark{% + \xwm@err{'\string\dummywatermark' in front of + \string\newwatermark}{First comment out or + remove '\string\dummywatermark'.}% + }{% + \def\xwm@forelist{\xwm@forewmklist}% + \def\xwm@backlist{\xwm@backwmklist}% + \xwm@suffixcheck\xwm@newwatermark{#1}% + }% +} +\robust@def*\xnewwatermark{% + \xwm@suffixcheck{\cpt@teststpm{\cpt@testopt\cpt@xnewwatermark{}}}% +} +\robust@def*\xwm@ltxcmds{% + \centering,\flushright,\flushleft,\raggedright,% + \raggedleft,\fbox,\framebox,\makebox,\rotatebox,% + \scalebox,\raisebox,\color,\textcolor,\usecsn,% + \newcommand,\lastdocpage +} +\robust@def*\xwm@relaxltxcmds{% + \def\ltxkeys@do##1{\let##1=\relax}% + \ltxkeys@parse*1\xwm@ltxcmds +} +\robust@def*\cpt@xnewwatermark[#1]#2{% + \begingroup + \xwm@relaxltxcmds + \cptexpanded{% + \endgroup + \newwatermark\ifcpt@st*\fi\ifcpt@pm'\fi + [\expandcstwice{#1}]{\expandcstwice{#2}}% + }% +} +\robust@def*\newwallpaper#1{% + \xwm@walltrue + \ifstrcmpTF{#1}\dummywallpaper{% + \xwm@err + {'\string\dummywallpaper' in front of \string\newwallpaper}% + {First comment out or remove '\string\dummywallpaper'.}% + }{% + \def\xwm@forelist{\xwm@forewalllist}% + \def\xwm@backlist{\xwm@backwalllist}% + \xwm@suffixcheck\xwm@newwatermark{#1}% + }% +} +\robust@def*\xnewwallpaper{% + \cpt@teststpm{\cpt@testopt\cpt@xnewwallpaper{}}% +} +\robust@def*\cpt@xnewwallpaper[#1]#2{% + \begingroup + \xwm@relaxltxcmds + \cptexpanded{% + \endgroup + \newwallpaper\ifcpt@st*\fi\ifcpt@pm'\fi + [\expandcstwice{#1}]{\expandcstwice{#2}}% + }% +} +\robust@def*\xwm@newwatermark{% + \def\siso@do##1{\catcode`##1\string=12}% + \cpt@teststpm{% + \let\ifxwm@foregrd\ifcpt@st + \cpt@testopt{% + \begingroup + \expandafter\siso@@loop\expandafter + {\xwm@watermarkparser,;|-=!'"*}% + \expandafter\endgroup\xwm@n@wwatermark + }{}% + }% +} +\robust@def\xwm@n@wwatermark[#1]#2{% + \ifdefboolTF{cpt@pm}{}{\xwm@n@ww@termark{#1}{#2}}% +} +\robust@def\xwm@n@ww@termark#1#2{% + \xwm@decidexp{#1}% + \edef\xwm@currattrib{\xwm@exptype{#1}}% + \cpt@sttrue\cpt@kvnormalize[,]\xwm@currattrib + \xwm@decidexp{#2}% + \edef\xwm@currmark{\xwm@exptype{#2}}% + \xwm@decidedetok{#2}% + \xwm@swafalse + \xifinsetTF{\detokenize{\newwatermark}}{\xwm@detoktype{#2}}{% + \xwm@swatrue + }{% + \xifinsetTF{\detokenize{\newwallpaper}}{\xwm@detoktype{#2}}{% + \xwm@swatrue + }{}% + }% + \ifxwm@swa + \ifxwm@allownesting\else + \xwm@err{Nested '\string\newwatermark' or + '\string\newwallpaper'\MsgBrk + while option 'allownesting' is false}\@ehd + \fi + \fi + \ifdefboolTF{xwm@wall}{}{% + \xwmifitemsinFT[1]{% + squaretiles,square-tiles,tilexsize,tile-xsize,% + tileysize,tile-ysize,wpxoffset,wallpaper-xoffset,% + wpyoffset,wallpaper-yoffset,tilexoffset,tile-xoffset,% + tileyoffset,tile-yoffset,tileno,tilenumber,% + tile-number,number-of-tiles% + }{#1}{}{% + \xwm@@err{'\xwm@items' not admissible for + \MsgBrk non-wallpaper watermarks}\@ehd + }% + }% + \ifdefboolTF{xwm@allownesting}{}{% + \cpt@choicefdfalse + \def\csv@do##1{% + \xifinsetFT{,\detokenize{##1}}{,\xwm@detoktype{#2}}{}{% + \def\xwm@tempa{##1}% + \cpt@choicefdtrue\loopbreak + }% + }% + \csv@@parse*[,]\xwm@samplemarkkeys + \ifcpt@choicefd + \xwm@err{Illegal location of '\xwm@tempa'. + \MsgBrk The following keys are not allowed in + \MsgBrk mandatory/second argument of + \MsgBrk '\string\newwatermark' or '\string\newwallpaper': + ^^J||\xwm@samplemarkkeys||}\@ehd + \fi + }% + \xifinsetFT\xwm@watermarkparser{\xwm@detoktype{#2}}{}{% + \xwm@err{Watermark parser '\xwm@watermarkparser' appears in + the following watermark.\MsgBrk Enclose your token + '\xwm@watermarkparser' in braces:^^J||\unexpanded{#2}||}\@ehd + }% + \xxwmifitemsinTF[1]\xwm@pagespecifiers{\expandcsonce\xwm@currattrib}{% + \xxwmifitemsinTF[2]\xwm@pagespecifiers{\expandcsonce\xwm@currattrib}{% + \xwm@err{Too many page specifiers '\xwm@items' for watermark: + ^^J||\expandcsonce\xwm@currattrib||}{% + Only one page specifier is allowed in watermark.}% + }{}% + }{% + \xwm@err{No page specifier for watermark: + ^^J||\expandcsonce\xwm@currmark||}\@ehd + }% + \ifcsnullTF\xwm@currattrib{% + \ifcsnullTF\xwm@currmark{}{% + \xwm@@err{No attributes for watermark: + ^^J||\expandcsonce\xwm@currmark||}\@ehd + }% + }{% + \xwm@makecurrmark + }% + \edef\reserved@a{% + \ifxwm@foregrd\expandcsonce\xwm@forelist\else + \expandcsonce\xwm@backlist\fi + }% + \expandafter\edef\reserved@a{% + \expandafter\ifdefined\reserved@a\expandcstwice\reserved@a\fi + \expandcsonce\xwm@currwatermark + }% +} +\robust@def*\xwm@avoidtwopagespecs{% + \if\xwm@pagespecfd + \xwm@err{Two page specifiers in watermark attributes: + ^^J||\cptoxdetok\xwm@currattrib||}\@ehd + \else + \def\xwm@pagespecfd{00}% + \fi +} +\robust@def*\xwm@addcurrmark#1{% + % Local group is in effect. + % If the current mark is already on current page, ignore it. This, eg, + % avoids 'pagex={1,1,2},textmark=X' making two entries for 'X' on page 1. + \letcstocsn\reserved@a{xwm@mark@@\romannumeral#1}% + \ifx\reserved@a\xwm@currattrib\else + \xifinsetTF{\detokenize{textmark=}}{\cptoxdetok\xwm@currattrib}{% + \@tempswafalse + \ifx\xwm@currmark\@empty\else + \xwm@err{Duplicate textmark in ||\cptoxdetok\xwm@currmark||} + {I found textmark earlier in the mandotory argument of + \noexpand\newwatermark, and now I find textmark key in the + attribute list.}% + \fi + }{% + \@tempswatrue + }% + \edef\xwm@tempb{% + page=\number#1,\expandcsonce\xwm@currattrib,% + \if@tempswa textmark={\expandcsonce\xwm@currmark}\fi + }% + \edef\xwm@currwatermark{% + % {<page.no>}{<curr.mark>} + \expandcsonce\xwm@currwatermark{\number#1}{\expandcsonce\xwm@tempb}% + }% + \gletcsntocs{xwm@mark@@\romannumeral#1}\xwm@currattrib + \fi +} +\robust@def*\xwm@getpagespec#1{% + \ifinsetTF{,#1,}{,page,pages,pagex,section,sections,sectionx,}{% + % \xwm@ifpagespec has shown that #1 is in \xwm@currattrib. We + % need to confirm that '#1=' is in \xwm@currattrib. + \xifinsetTF{,\detokenize{#1=}}{,\cptoxdetok\xwm@currattrib}{% + \def\xwm@tempa##1#1=##2,##3\xwm@nil{% + \ifblankTF{##2}{% + \xwm@warn{Key '#1' has an empty value; '1' assumed}\@ehd + \def\xwm@currpages{1}% + }{% + \ifinsetTF{,#1,}{,pages,sections,}{% + \ifinsetTF{,}{##2}{% + \xwm@err{Key '#1' doesn't accept comma-separated + \MsgBrk page numbers: use a hyphen}\@ehd + }{}% + }{% + \ifinsetTF{,#1,}{,pagex,sectionx,}{% + \ifinsetTF{-}{##2}{% + \xwm@err{Key '#1' doesn't accept hyphen-separated + \MsgBrk page numbers: use commas}\@ehd + }{}% + }{}% + }% + \def\xwm@currpages{##2}% + }% + \edef\xwm@currattrib{\unexpanded{##1,##3}}% + }% + \expandafter\xwm@tempa\xwm@currattrib,\xwm@nil + }{% + \xwm@err{Key '#1' doesn't have '=' and a value}\@ehd + }% + }{% + \xwm@getpagespec@a{#1}% + }% + \kv@@normalize*\xwm@currattrib +} +\robust@def*\xwm@getpagespec@a#1{% + \xifinsetTF{,\detokenize{#1=true},}{,\cptoxdetok\xwm@currattrib,}{% + \def\xwm@tempa##1#1=true,##2\xwm@nil{% + \edef\xwm@currattrib{\unexpanded{##1,##2}}% + }% + \expandafter\xwm@tempa\xwm@currattrib,\xwm@nil + }{% + \xifinsetTF{,\detokenize{#1=false},}{,\cptoxdetok\xwm@currattrib,}{% + \def\xwm@tempa##1#1=false,##2\xwm@nil{% + \edef\xwm@currattrib{\unexpanded{##1,##2}}% + }% + \expandafter\xwm@tempa\xwm@currattrib,\xwm@nil + }{% + \def\xwm@tempa##1#1,##2\xwm@nil{% + \edef\xwm@currattrib{\unexpanded{##1,##2}}% + }% + \expandafter\xwm@tempa\xwm@currattrib,\xwm@nil + }% + }% +} +\robust@def*\xwm@ifpagespec#1{% + \@expandtwoargs\cpt@in{,\detokenize{#1}}{,\cptoxdetok\xwm@currattrib}% + \ifdefboolTF{cpt@in}\@iden\@gobble +} +\robust@def*\xwm@normalizedoublecomma#1{% + \def\xwm@tempa##1,,##2\normal@nil{% + \ifblankTF{##2}{% + \edef#1{\unexpanded{##1}}% + }{% + \xwm@tempa##1,##2\normal@nil + }% + }% + \expandafter\xwm@tempa#1,,\normal@nil +} +\robust@def*\xwm@makecurrmark{% + \begingroup + \edef\xwm@lastpage{\lastdocpage}% + \def\xwm@currwatermark{}% + \def\xwm@pagespecfd{01}% + \xwm@ifpagespec{page=}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{page}% + \xwm@addcurrmark\xwm@currpages + }% + \xwm@ifpagespec{pages=}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{pages}% + \xwm@hyphenpagerange\xwm@currpages\xwm@pagestart\xwm@pageend + \xwm@cnta\numexpr\xwm@pagestart\relax + \cptloop + \xwm@addcurrmark\xwm@cnta + \advance\xwm@cnta\@ne + \ifnum\xwm@cnta<\numexpr\xwm@pageend+1\relax + \cptrepeat + }% + \xwm@ifpagespec{pagex=}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{pagex}% + \expandafter\cptfor\xwm@currpages\dofor{% + \xwm@addcurrmark{##1}% + }% + }% + \xwm@ifpagespec{firstpage}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{firstpage}% + \xwm@addcurrmark{1}% + }% + \xwm@ifpagespec{lastpage}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{lastpage}% + \xwm@addcurrmark\xwm@lastpage + }% + \xwm@ifpagespec{allpages}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{allpages}% + \xwm@cnta\@ne + \cptloop + \xwm@addcurrmark\xwm@cnta + \advance\xwm@cnta\@ne + \ifnum\xwm@cnta<\numexpr\xwm@lastpage+1\relax + \cptrepeat + }% + \xwm@ifpagespec{evenpages}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{evenpages}% + \xwm@cnta\@ne + \cptloop + \ifodd\xwm@cnta\else + \xwm@addcurrmark\xwm@cnta + \fi + \advance\xwm@cnta\@ne + \ifnum\xwm@cnta<\numexpr\xwm@lastpage+1\relax + \cptrepeat + }% + \xwm@ifpagespec{oddpages}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{oddpages}% + \xwm@cnta\z@pt + \cptloop + \ifodd\xwm@cnta + \xwm@addcurrmark\xwm@cnta + \fi + \advance\xwm@cnta\@ne + \ifnum\xwm@cnta<\numexpr\xwm@lastpage+1\relax + \cptrepeat + }% + % Incomplete concept. To be refined later. Basically, I want to get page + % range from section numbers. The work to be done next is actually in + % formatting \xwm@seclist and completing \xwm@convertsecstopagerange and + % \xwm@convertsecstopagerange@hyphen. + \xwm@ifpagespec{section=}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{section}% + \xwm@convertsecstopagerange\xwm@currpages + \xwm@addcurrmark\xwm@currpages + }% + \xwm@ifpagespec{sections=}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{sections}% + \xwm@convertsecstopagerange@hyphen\xwm@currpages + \xwm@hyphenpagerange\xwm@currpages\xwm@pagestart\xwm@pageend + \xwm@cnta\numexpr\xwm@pagestart\relax + \cptloop + \xwm@addcurrmark\xwm@cnta + \advance\xwm@cnta\@ne + \ifnum\xwm@cnta<\numexpr\xwm@pageend+1\relax + \cptrepeat + }% + \xwm@ifpagespec{sectionx=}{% + \xwm@avoidtwopagespecs + \xwm@getpagespec{sectionx}% + \xwm@convertsecstopagerange\xwm@currpages + \expandafter\cptfor\xwm@currpages\dofor{% + \xwm@addcurrmark{##1}% + }% + }% + \if\xwm@pagespecfd\else + \xwm@err{No page specifier in watermark attributes: + ^^J||\cptoxdetok\xwm@currattrib||}\@ehd + \fi + \postgroupdef\xwm@currwatermark\endgroup +} +% \xwm@convertsecstopagerange{<section.range>} +\robust@def*\xwm@convertsecstopagerange#1{% + \begingroup + \def\xwm@tempa{}% + \expandafter\cptfor#1\dofor{% + \letcstocsn\reserved@a{xwm@sec@page@start@\detokenize{##1}}% + \letcstocsn\reserved@b{xwm@sec@page@end@\detokenize{##1}}% + \ifx\reserved@a\undefined + \def\reserved@a{1}% + \fi + \ifx\reserved@b\undefined + \def\reserved@b{1}% + \fi + % To do: + % To build the page range for each section, loop from section start + % (page start) to section end (page end). + \xifinsetTF{,\reserved@a,}{,\xwm@tempa,}{}{% + \edef\xwm@tempa{% + \xwm@tempa\ifx\xwm@tempa\@empty\else,\fi\reserved@a + }% + }% + }% + \let#1\xwm@tempa + \postgroupdef#1\endgroup +} +% \xwm@convertsecstopagerange@hyphen{<section.range>} +\robust@def*\xwm@convertsecstopagerange@hyphen#1{% + \begingroup + \def\xwm@tempa{}% + \def\csv@do##1{% + \letcstocsn\reserved@a{xwm@sec@page@start@\detokenize{##1}}% + \ifx\reserved@a\undefined + \def\reserved@a{1}% + \fi + \xifinsetTF{-\reserved@a-}{-\xwm@tempa-}{}{% + \edef\xwm@tempa{% + \xwm@tempa\ifx\xwm@tempa\@empty\else-\fi\reserved@a + }% + }% + }% + \csv@@parse*[-]#1% + \let#1\xwm@tempa + \postgroupdef#1\endgroup +} +\robust@def*\dummywatermark#1{% + \ifstrcmpTF{#1}\newwatermark{% + \xwm@err + {'\string\newwatermark' in front of \string\dummywatermark}% + {First comment out or remove '\string\newwatermark'.}% + }{% + \ifdefboolTF{xwm@usedummymarks}\newwatermark\xwm@dummywatermark + #1% + }% +} +\robust@def*\dummywallpaper#1{% + \ifstrcmpTF{#1}\newwallpaper{% + \xwm@err + {'\string\newwallpaper' in front of \string\dummywallpaper}% + {First comment out or remove '\string\newwallpaper'.}% + }{% + \ifdefboolTF{xwm@usedummymarks}\newwallpaper\xwm@dummywatermark + #1% + }% +} +\robust@def*\xwm@dummywatermark{% + \cpt@teststpm{\cpt@testopt\xwm@d@mmywatermark{}}% +} +\robust@def*\xwm@d@mmywatermark[#1]#2{} +\robust@def*\UseDummyWatermarks{\global\xwm@usedummymarkstrue} +\robust@def*\DiscardDummyWatermarks{\global\xwm@usedummymarksfalse} +\DiscardDummyWatermarks +\robust@def*\DiscardAllWatermarks{% + \global\let\newwatermark\dummywatermark + \global\xwm@usedummymarksfalse +} +\robust@def*\xwmsuspendwatermark{\xwm@putmarkfalse} +\robust@def*\xwmresumewatermark{\xwm@putmarktrue} +\newletcs\xwmwatermarkoff\xwmsuspendwatermark +\newletcs\xwmwatermarkon\xwmresumewatermark + +\robust@def*\xwm@putbothmarks{% + \ifdefboolFT{xwm@putmark}{}{% + \ifdefFT\xwm@watermarklist{}\xwm@textpicmark@a + \ifdefFT\xwm@wallpaperlist{}\xwm@wallpaper@a + }% +} +\chardef\xwm@nowatermarksignal\z@pt +\AtBeginShipout{% + \endlinechar13 \catcode13=5\relax + \catcode`\ =10\relax + \catcode`\\\z@pt + \catcode`\{\@ne + \catcode`\}\tw@ + \ifdefboolTF{xwm@printwatermark}{% + \let\xwm@watermarklist\xwm@backwmklist + \let\xwm@wallpaperlist\xwm@backwalllist + \AtBeginShipoutUpperLeft{% + \xwm@foregrdfalse + \xwm@putbothmarks + }% + \let\xwm@watermarklist\xwm@forewmklist + \let\xwm@wallpaperlist\xwm@forewalllist + \AtBeginShipoutUpperLeftForeground{% + \xwm@foregrdtrue + \xwm@putbothmarks + }% + }{% + \ifnum\xwm@nowatermarksignal<\@ne + \edef\xwm@nowatermarksignal{\the\numexpr\xwm@nowatermarksignal+1}% + \xwm@info{'printwatermark=false': no watermark printed}% + \fi + }% +} +\robust@def*\xwm@perpagestate{% + page=0, + pagex={0}, + pages=0-0, + minmark=false, + onepageonly=false, + prange=false, + tmark=false, + pmark=false, + firstpage=false, + allpages=false, + oddpages=false, + evenpages=false, + showpagecenter=false, + textmark=DRAFT, + textalign=center, + boxalign=, + textcolor=gray!55, + fontfamily=bch, + textangle=0, + picangle=0, + fontsize=1cm, + fontseries=b, + textscale=1, + picscale=1, + picheight=, + picwidth=, + picbb=0 0 100 100, + picfileext, + picontoptext=false, + graphicsoptions={}, +} +\robust@edef*\xwm@perpagewmkstate{% + \expandcsonce\xwm@perpagestate, + \unexpanded{% + height=\paperwidth, + width=\paperheight, + textxpos=0, + textypos=0, + picxpos=\z@pt, + picypos=\z@pt, + coordunit=mm + }% +} +\robust@edef*\xwm@perpagewallstate{% + \expandcsonce\xwm@perpagestate, + \unexpanded{% + tilexsize=.5\paperwidth, + tileysize=.5\paperheight, + wpxoffset=\z@pt, + wpyoffset=\z@pt, + textmark=, + picfile=, + tilexoffset=\z@pt, + tileyoffset=\z@pt, + tileno=4, + squaretiles=false + }% +} +\robust@def*\xwm@textpicmark@a{% + \ifcsnullTF\xwm@watermarklist{% + \ifdefboolTF{xwm@foregrd}{}{% + \ifdefboolFT{xwm@printwatermark}{}{% + \ifdefboolTF{xwm@draft}{% + \ifdefboolTF{wmk@showpagecenter}{}{% + \ifnumcmpFT\c@page=\@ne{}{% + \cptexpandargonce{\ltxkeys@setkeys[XWM]{watermark}}% + \xwm@perpagewmkstate + \wmk@tmarktrue\wmk@pmarkfalse + \cptdimdef\wmk@textxpos@a{0.5\paperwidth}% + \cptdimdef\wmk@textypos@a{-0.5\paperheight}% + \xwm@textpicmark@c + \xwm@info{'printwatermark' and 'draft' are 'true' + \MsgBrk but no watermark(s): watermark + \MsgBrk printed on page 1 only}% + }% + }% + }{% + \ifnum\c@page=\@ne + \xwm@info{'printwatermark=true' and 'draft=false' + \MsgBrk but no watermark(s)}% + \fi + }% + }% + }% + }{% + \xwm@processmarks\xwm@watermarklist{% + \xwm@setwatermarkkeys{watermark}{wmk}{##2}% + \ifdefboolFT{wmk@minmark}{}\xwm@textpicmark@c + }% + }% +} +\robust@def*\xwm@wallpaper@a{% + \ifcsnullTF\xwm@wallpaperlist{}{% + \xwm@processmarks\xwm@wallpaperlist{% + \xwm@setwatermarkkeys{wallpaper}{wall}{##2}% + \ifdefboolFT{wlp@minmark}{}\xwm@wallpaper@c + }% + }% +} +\robust@def*\xwm@setwatermarkkeys#1#2#3{% + \ltxkeys@getkeynames{#3}% + \cptexpandsecond{% + \ltxkeys@setkeys[XWM]{#1}% + }{% + [\ltxkeys@keynames]{\expandcsnonce{xwm@perpage#2state}}% + }% + \edef\xwm@currwatermark{\unexpanded{#3}}% + \ifblankTF{#3}{}{\ltxkeys@setkeys[XWM]{#1}{#3}}% +} +\robust@def*\xwm@processmarks#1#2{% + \def\xwm@pr@cessmarks##1##2{% + \ifstrcmpTF{##1}{\@nil}{}{% + \ifnumcmpTF##1=\c@page{#2}{% + \edef#1{\expandcsonce#1\unexpanded{{##1}{##2}}}% + }% + \xwm@pr@cessmarks + }% + }% + \cptexpandsecondonce{\def#1{}\xwm@pr@cessmarks}{#1}{\@nil}{}% +} +\ltxkeys@disablekeys*[XWM]{main}{printwatermark,disablegeometry} +\BeforeStartOfDocument{% + \unless\ifxwm@printwatermark + \xwm@info{*** printwatermark=false: no watermark printed}% + \fi +} +\newcommand\xwm@papercenter{% + \color{red}\noindent + \xwm@put(0,-0.5\paperheight){\line(1,0){\paperwidth}}% + \xwm@put(0.5\paperwidth,0){\line(0,-1){\paperheight}}% + \xwm@put(0.5\paperwidth,-0.5\paperheight){\circle{10}}% + \normalcolor +} +\robust@def*\xwm@textbox#1{% + \begingroup + \let\nxp\noexpand + \let\mcs\cptmakecs + \edef\xwm@curralign{\expandcsnonce{#1@textalign}}% + \cptexpanded{\endgroup + \xwm@put(\mcs{#1@textxpos@a},\mcs{#1@textypos@a}){% + \nxp\leavevmode\nxp\@killglue\noindent + \nxp\makebox(0,0)[\expandcsnonce{#1@boxalign}]{% + \nxp\rotatebox[origin=c]{\mcs{#1@textangle}}{% + \nxp\scalebox{\mcs{#1@textscale}}{% + \nxp\parbox[c][\mcs{#1@textheight}]% + [c]\mcs{#1@textwidth}{% + \nxp\color{\mcs{#1@textcolor}}% + \cptdimdef\mcs{#1@fontsize@a}{\mcs{#1@fontsize}}% + \cptdimdef\mcs{#1@fontsize@a}% + {1.5\p@*\mcs{#1@fontsize@a}}% + \nxp\fontfamily\mcs{#1@fontfamily}% + \nxp\fontseries\mcs{#1@fontseries}% + \nxp\fontsize\mcs{#1@fontsize}\mcs{#1@fontsize@a}% + \nxp\selectfont + \nxp\leavevmode + \nxp\begin{\xwm@curralign}% + \mcs{#1@textmark}% + \nxp\end{\xwm@curralign}% + }% + }% + }% + }% + }% + }% + \@killglue\normalcolor +} +% See also \xwmgetpicturesize. +\robust@def*\xwm@getgrafsize#1{% + \ifcsnnullTF{#1@picwidth}{% + \ifcsnnullTF{#1@picheight}{% + \edef\pic@size{scale=\cptmakecs{#1@picscale}}% + }{% + \xwm@err{You have supplied picture height + but not width}\@ehd + }% + }{% + \ifcsnnullTF{#1@picheight}{% + \xwm@err{You have supplied picture width + but not height}\@ehd + }{% + \edef\pic@size{width=\cptmakecs{#1@picwidth},% + height=\cptmakecs{#1@picheight}}% + }% + }% +} +\robust@def*\xwm@picmark{% + \xwm@findpicfile\wmk@picfile\wmk@picfileext + \xwm@getgrafsize{wmk}% + \cptpassexpanded{% + \setbox\xwm@boxa=\hbox{% + \noexpand\includegraphics[\ifxwm@pdf viewport\else + bb\fi=\wmk@picbb,\pic@size,clip,\wmk@graphicsoptions,% + \xwm@gr@phicsoptions]{\xwm@filefound}% + }% + }% + \cptdimdef\widthofcurrpic{\wd\xwm@boxa}% + \cptdimdef\heightofcurrpic{\ht\xwm@boxa}% + \cptdimdef\depthofcurrpic{\dp\xwm@boxa}% + \xwm@makedraftbox + \xwm@put(\wmk@picxpos@a,\wmk@picypos@a){% + \rotatebox[origin=c]\wmk@picangle{% + \cptexpandsecond{\makebox(0,0)}{[\wmk@boxalign]{% + \ifdefboolTF{xwm@draft}{\xwm@draftbox{wmk}}{\copy\xwm@boxa}% + }% + }% + }}% +} +\robust@def*\xwm@makedraftbox{% + \fboxsep\p@\fboxrule.4\p@ + \cptdimdef\xwm@tempa{(\ht\xwm@boxa+\dp\xwm@boxa + -2\fboxsep-2\fboxrule)/2}% + \cptdimdef\xwm@tempb{\wd\xwm@boxa-2\fboxsep-2\fboxrule}% + \setbox\@tempboxa\hbox{\color@begingroup + \ttfamily\color{red}\Large (draft mode)\color@endgroup}% + \setbox\xwm@boxb=\hb@xt@\xwm@tempb{% + \xwmstrut\xwm@tempa\z@pt + \hb@xt@\xwm@tempb{\hss\unhbox\@tempboxa\hss}% + \xwmstrut\z@pt\xwm@tempa + }% +} +\robust@def*\xwm@draftbox#1{% + \begingroup + \color{\usename{#1@draftboxcolor}}\fbox{\copy\xwm@boxb}% + \endgroup +} +\newcommand*\xwm@textpicmark@c{% + \xwm@getposition\wmk@textxpos\wmk@textypos\wmk@coordunit + \xwm@getposition\wmk@picxpos\wmk@picypos\wmk@coordunit + \ifdefboolTF{wmk@picontoptext}{% + \ifdefboolFT{wmk@tmark}{}{\xwm@textbox{wmk}}% + \ifdefboolFT{wmk@pmark}{}\xwm@picmark + }{% + \ifdefboolFT{wmk@pmark}{}\xwm@picmark + \ifdefboolFT{wmk@tmark}{}{\xwm@textbox{wmk}}% + }% + \ifdefboolFT{wmk@showpagecenter}{}\xwm@papercenter +} +\AtBeginDocument{% + \ifdefTF\Ginput@path{% + \xdef\xwm@inputpath{\Ginput@path\xwm@inputpath}% + \ifxTF\Ginput@path\input@path{}{% + \ifdefFT\input@path{}{% + \xdef\xwm@inputpath{\input@path\xwm@inputpath}% + }% + }% + }{% + \ifdefFT\input@path{}{% + \xdef\xwm@inputpath{\input@path\xwm@inputpath}% + }% + }% +} +\new@def*\xwm@inputpath{} +\robust@def*\watermarkpaths{% + \cpt@testst{\cpt@testopt\xwm@w@termarkpaths{}}% +} +\robust@def*\xwm@w@termarkpaths[#1]{% + \cpt@testpnopt{\xwm@w@term@rkpaths#1}{} +} +\robust@def*\xwm@w@term@rkpaths#1(#2)#3{% + \cpt@useemptytrue + \def\xwm@tempa{#3}% + \ifdefboolTF{cpt@st}{% + \ifbracedTF{#3}{\xwm@stripallouterbraces{#3}\xwm@tempa}{}% + \def\csv@do##1{% + \ifbracedTF{##1}{% + \xwm@stripallouterbraces{##1}\xwm@tempa + }{% + \def\xwm@tempa{##1}% + }% + \cptexpandarg{\grightaddtocs\xwm@inputpath}{{#1\xwm@tempa#2}}% + }% + \csv@@parse*[,]\xwm@tempa + }{% + \xifinsetFT{,}{\cptoxdetok\xwm@tempa}{}{% + \xwm@err{Input path '#3' contains comma: + \MsgBrk Commas can appear only in the argument + \MsgBrk of star (*) variant of \string\watermarkpaths}\@ehd + }% + \def\tsv@do##1{% + \ifbracedTF{##1}{% + \cptexpandarg{\grightaddtocs\xwm@inputpath}{{#1\@iden##1#2}}% + }{% + \xwm@err{Input path '##1' needs outer braces}\@ehd + }% + }% + \tsv@@parse*\xwm@tempa + }% +} +\newletcs\watermarkpath=\watermarkpaths +\new@def*\xwmifeofTF#1{\ifcondTF\ifeof#1\fi} +\robust@def*\pdfiffileexistsTF#1{% + \ifcondFT\if\pdffilesize{#1}\relax\fi +} +\robust@def*\xwmiffileexistsTF#1{% + \openin\@inputcheck#1\@space + \xwmifeofTF\@inputcheck{% + \ifcsnullTF\xwm@inputpath{% + \@secondoftwo + }{% + \xwm@iffileonpath{#1}% + }% + }{% + \closein\@inputcheck + \edef\xwm@filefound{#1}% + \@firstoftwo + }% +} +\robust@def*\xwmiffileexistsFT#1{% + \xwmiffileexistsTF{#1}\@secondoftwo\@firstoftwo +} +\robust@def*\xwm@iffileonpath#1{% + \let\xwm@pathfound\@empty + \cpt@choicefdfalse + \def\tsv@do##1{% + \xwm@stripallouterbraces{##1}\xwm@tempa + \openin\@inputcheck\xwm@tempa#1\@space + \xwmifeofTF\@inputcheck{}{% + \let\xwm@pathfound\xwm@tempa + \edef\xwm@filefound{\xwm@tempa#1}% + \closein\@inputcheck + \cpt@choicefdtrue\loopbreak + }% + }% + \tsv@@loop*\xwm@inputpath + \ifdefboolTF{cpt@choicefd}% +} +\robust@def*\xwm@nofileerr#1#2{% + \message{% + ^^J! Package xwatermark Error: File '#1.#2' not found. + ^^J^^JType x to quit, or <RETURN> to proceed, + ^^Jor enter new name (default extension: #2):^^J + }% + \begingroup + \endlinechar-1\global\read-1 to\@gtempa + \endgroup + \ifcsnullTF\@gtempa{}{% + \oifstrcmpTF\@gtempa{x}{% + \stop + }{% + \oifstrcmpTF\@gtempa{X}{% + \stop + }{% + \filename@parse\@gtempa + \edef#1{\filename@area\filename@base}% + \edef#2{\ifxTF\filename@ext\relax{#2}{\filename@ext}}% + \xwm@findpicfile{#1}{#2}% + }% + }% + }% +} +\robust@def*\xwm@findpicfile#1#2{% + \let\xwm@filefound\@empty + \edef\xwm@filegiven{#1.#2}% + \ifdefboolTF{xwm@pdf}{% + \xwm@f@ndpicfile{#1}{#2}{pdf,png,jpeg,mps}% + }{% + \xwm@f@ndpicfile{#1}{#2}{eps,ps}% + }% + \ifcsnullFT\xwm@filefound{}{\xwm@nofileerr{#1}{#2}}% +} +\robust@def*\xwm@f@ndpicfile#1#2#3{% + \xwm@swafalse + \xwmiffileexistsTF{#1.#2}{% + \xwm@swbtrue + }{% + \xwm@swbfalse + \def\csv@do##1{% + \xwmiffileexistsFT{#1.##1}{}{% + \xwm@swatrue\loopbreak + }% + }% + \csv@@loop[,]{#3}% + }% + \ifdefboolTF{xwm@swb}{}{% + \ifdefboolTF{xwm@swa}{% + \xwm@warn{File '\xwm@filegiven' doesn't exist + \MsgBrk on given path(s) '\xwm@inputpath', + \MsgBrk but I have found \xwm@filefound'}% + }{% + \let\xwm@filefound\@empty + \let\xwm@pathfound\@empty + }% + }% +} +\robust@def*\xwm@wallpaper@c{% + \ifdefboolTF{wlp@picontoptext}{% + \xwm@textwallpaper + \xwm@picwallpaper + }{% + \xwm@picwallpaper + \xwm@textwallpaper + }% + \ifdefboolFT{wlp@showpagecenter}{}\xwm@papercenter +} +\robust@def*\xwm@textwallpaper{% + \ifdefboolFT{wlp@tmark}{}{% + \ifdefboolTF{wlp@squaretiles}\xwm@sqtexttiles\xwm@texttiles + }% +} +\robust@def*\xwm@picwallpaper{% + \ifdefboolFT{wlp@pmark}{}{% + \ifdefboolTF{wlp@squaretiles}\xwm@sqpictiles\xwm@pictiles + }% +} +\robust@def*\xwm@dotiling{\xwm@makedraftbox\xwm@dotiling@a} +\robust@def*\xwm@dotiling@a{% + \let\tiley\wlp@wpyoffset + \cptwhiledim\tiley<\paperheight-\wlp@wpyoffset\do{% + \cptdimdef\xwm@tempa{-\paperheight+\tiley}% + \let\tilex\wlp@wpxoffset + \cptwhiledim\tilex<\paperwidth-\wlp@wpxoffset\do{% + \leavevmode\@killglue + \xwm@put(\tilex,\xwm@tempa){\rotatebox[origin=c] + \xwm@currangle{% + \cptexpandsecond{\makebox(0,0)}{[\wlp@boxalign]}{% + \ifdefboolTF{xwm@draft}{\xwm@draftbox{wlp}}{\copy\xwm@boxa}% + }% + }}% + \cptdimadd\tilex{\wlp@tilexsize+\wlp@tilexoffset}% + }% + \cptdimadd\tiley{\wlp@tileysize+\wlp@tileyoffset}% + }% +} +\robust@def*\xwm@toofewtiles#1{% + \ifnum\numexpr#1<4\relax + \xwm@err{Too few square wallpapers '#1'; + \MsgBrk minimum expected: 4}\@ehd + \fi +} +\robust@def*\xwm@texttiles{% + \setbox\xwm@boxa=\hbox{% + \resizebox\wlp@tilexsize\wlp@tileysize + {\color{\wlp@textcolor}\wlp@textmark}% + }% + \let\xwm@currangle\wlp@textangle + \xwm@dotiling +} +\robust@def*\xwm@sqtexttiles{% + \xwm@toofewtiles\wlp@tileno + \cptdimdef\wlp@tilexsize{\paperwidth/\wlp@tileno}% + \let\wlp@tileysize\wlp@tilexsize + \setbox\xwm@boxa=\hbox{% + \resizebox\wlp@tilexsize\wlp@tileysize + {\color{\wlp@textcolor}\wlp@textmark}% + }% + \let\xwm@currangle\wlp@textangle + \xwm@dotiling +} +\robust@def*\xwm@tilepicbox{% + \xwm@findpicfile\wlp@picfile\wlp@picfileext + \setbox\xwm@boxa=\hbox{% + \cptexpandsecond\includegraphics{% + [\ifxwm@pdf viewport\else bb\fi=\wlp@picbb, + width=\the\dimexpr\wlp@tilexsize,height= + \the\dimexpr\wlp@tileysize,clip, + \wlp@graphicsoptions,\xwm@gr@phicsoptions]% + }{\xwm@filefound}% + }% +} +\robust@def*\xwm@pictiles{% + \xwm@tilepicbox + \let\xwm@currangle\wlp@picangle + \xwm@dotiling +} +\robust@def*\xwm@sqpictiles{% + \xwm@toofewtiles\wlp@tileno + \cptdimdef\wlp@tilexsize{\paperwidth/\wlp@tileno}% + \let\wlp@tileysize\wlp@tilexsize + \xwm@tilepicbox + \let\xwm@currangle\wlp@picangle + \xwm@dotiling +} +\robust@def*\xwmsetbox#1#2#3#4{% + \begingroup + \setbox1\hbox{\color@begingroup#4\color@endgroup}% + \setbox\@tempboxa\hbox to#1\textwidth{% + \setbox0\vtop{% + \ignorespaces#4\vskip\dimexpr#3\textheight/2\relax + }% + \cptdimdef\x{(#1\textwidth-\wd1)/2\relax}% + \hskip\x\box0\hskip-\x + }% + \ht\@tempboxa=\dimexpr#2\textheight/2\relax + \noindent\box\@tempboxa + \endgroup +} +\robust@def*\xwmstrut#1#2{% + \relax\unskip + \ifhmode\nobreak\fi + \begingroup + \setbox\@tempboxa=\hbox{\vrule\@height#1\@depth#2\@width\z@pt}% + \ifmmode\copy\@tempboxa\else\unhcopy\@tempboxa\fi + \endgroup +} +\robust@def*\xwmgetpicturesize{\cpt@testopt\xwm@getpicsize{}} +\robust@def*\xwm@getpicsize[#1]#2{% + \begingroup + \edef\Ginput@path{% + \usecsifdef\Ginput@path\usecsifdef\xwm@inputpath + \usecsifdef\input@path + }% + \setbox\xwm@boxa=\hbox{\includegraphics[#1]{#2}}% + % See also \widthofcurrpic. + \cptdimdef\widthofpic{\wd\xwm@boxa}% + \cptdimdef\heightofpic{\ht\xwm@boxa}% + \cptdimdef\depthofpic{\dp\xwm@boxa}% + \cptdimdef\totalheightofpic{\ht\xwm@boxa+\dp\xwm@boxa}% + \let\\\cpt@csexit + \cptexpanded{\endgroup + \\\widthofpic\\\heightofpic\\\depthofpic\\\totalheightofpic + }% +} +% #1=optional text to be printed as watermark +% #2=sundry fixed keys +% #3=variable keys, separated by semicolon (set-1;...;set-n) +% Each set-i has the syntax <key1=val1,...,keyn=valn> +\robust@def*\repeatwatermarks{% + \cpt@teststpm{\cpt@testopt\xwm@repeatwatermarks{}}% +} +\robust@def\xwm@repeatwatermarks[#1]#2#3{% + \edef\cpt@tempa{\csv@@loop\ifcpt@st*\fi}% + \def\csv@do##1{% + \ifblankTF{##1}{}{\newwatermark[#2,##1]{#1}}% + }% + \ifdefboolTF{cpt@pm}{}{\cpt@tempa[;]{#3}}% +} +\ltxkeys@definekeys*[XWM]{boxedminipage}[xwmbmp@]{% + width=\textwidth; + textcolor=black; + framecolor=black; + framesep=3\p@; + framerule=0.4\p@; + height=\z@pt; + depth=\z@pt; + textalign=justified/\xwm@settextalign\xwmbmp@textalign; + innerpos=c; +} +\robust@def*\xwmboxedminipage{\cpt@testopt\xwm@boxedminipage{}} +\begingroup +\catcode`\|=\catcode`\% +\robust@gdef*\xwm@boxedminipage[#1]{% + \ltxkeys@launchkeys[XWM]{boxedminipage}{#1}% + \xwm@stripallouterbracesincs\xwmbmp@width + \xwm@stripallouterbracesincs\xwmbmp@textcolor + \leavevmode\@pboxswfalse + \begingroup + \color{\xwmbmp@framecolor}% + \xifstrcmpTF\xwmbmp@innerpos{b}{% + \vbox + }{% + \xifstrcmpTF\xwmbmp@innerpos{t}{% + \vtop + }{% + \ifdefboolTF{mmode}{% + \vcenter + }{% + \@pboxswtrue $\vcenter |$ + }% + }% + }% + {\ifnum`}=0\fi + \hsize\xwmbmp@width\relax + \hrule\@height\xwmbmp@framerule + \hbox{\ifnum`}=0\fi + \vrule\@width\xwmbmp@framerule + \kern\xwmbmp@framesep\relax + \vbox{\ifnum`}=0\fi + \vskip\xwmbmp@framesep\relax + \cptdimdef\reserved@a{\hsize-(\xwmbmp@framerule+\xwmbmp@framesep)*2}% + \hsize\reserved@a\relax + \textwidth\reserved@a\relax + \columnwidth\reserved@a\relax + \@parboxrestore + \c@mpfootnote\z@pt + \let\@footnotetext\@mpfootnotetext + \let\@listdepth\@mplistdepth\@mplistdepth\z@pt + \@minipagerestore\@minipagetrue + \everypar{\global\@minipagefalse\everypar{}}% + \leavevmode\@killglue + \xwmstrut\xwmbmp@height\z@pt + \noindent\color{\xwmbmp@textcolor}% + \begin\xwmbmp@textalign + \ignorespaces +} +\robust@gdef*\endxwmboxedminipage{% + \end\xwmbmp@textalign + \xwmstrut\z@pt\xwmbmp@depth + \ifvoid\@mpfootins\else + \vskip\skip\@mpfootins\footnoterule\unvbox\@mpfootins + \fi + \vskip\xwmbmp@framesep\relax + \ifnum`{=0\fi}% + \kern\xwmbmp@framesep\relax + \vrule\@width\xwmbmp@framerule + \ifnum`{=0\fi}% + \hrule\@height\xwmbmp@framerule + \ifnum`{=0\fi}% + \if@pboxsw\m@th$\fi |$ + \leavevmode\@killglue + \endgroup + \@ignoretrue +} +\endgroup + +\ltxkeys@definekeys*[XWM]{minipage}[xwmmp@]{% + width=\paperwidth; + textcolor=black; + framecolor=black; + framesep=3\p@; + framerule=0.4\p@; + height=\z@pt; + depth=\z@pt; + textalign=center/\xwm@settextalign\xwmmp@textalign; + text-align=center/\setaliaskey{textalign}; + framebox=true; + insertframe=true/\setaliaskey{framebox}; + insert-frame=true/\setaliaskey{framebox}; +} +\robust@def*\xwmminipage{\cpt@testopt\xwm@minipage{}} +\robust@def\xwm@minipage[#1]#2{% + \ltxkeys@launchkeys[XWM]{minipage}{#1}% + \xwm@stripallouterbracesincs\xwmmp@width + \xwm@stripallouterbracesincs\xwmmp@textcolor + \xwm@pushboxframe + \fboxsep\xwmmp@framesep\fboxrule\xwmmp@framerule\relax + \cptdimdef\xwmmp@boxwidth{\xwmmp@width-2\fboxsep-2\fboxrule}% + \def\xwm@printbox{% + \color{\xwmmp@framecolor}% + \ifxwmmp@framebox\fbox{\fi + \usebox\xwm@boxa + \ifxwmmp@framebox}\fi + \xwm@popboxframe + }% + \@killglue\noindent + \begin{lrbox}\xwm@boxa + \@killglue\noindent + \begin{minipage}[c][\height][s]\xwmmp@boxwidth + \@killglue\noindent + \xwmstrut\xwmmp@height\z@pt + \begin\xwmmp@textalign + \textcolor{\xwmmp@textcolor}{#2}\relax + \end\xwmmp@textalign + \xwmstrut\z@pt\xwmmp@depth + \end{minipage}% + \@ignoretrue\@killglue + \end{lrbox}% + \@ignoretrue\@killglue\noindent + \xwm@printbox + \normalcolor + \@ignoretrue +} +\ltxkeys@definekeys*[XWM]{colorbox}[xwmcbx@]{% + width=\textwidth; + height=\z@pt; + depth=\z@pt; + framebox=true; + insertframe=true/\setaliaskey{framebox}; + insert-frame=true/\setaliaskey{framebox}; + textcolor=black; + fillcolor=white; + outerframecolor=black; + outer-frame-color=black/\setaliaskey{outerframecolor}; + innerframecolor=black; + inner-frame-color=black/\setaliaskey{innerframecolor}; + framesep=3\p@; + framerule=0.4\p@; + textalign=center/\xwm@settextalign\xwmcbx@textalign; + align=center/\setaliaskey{textalign}; + text-align=center/\setaliaskey{textalign}; +} +\robust@def*\xwmcolorbox{\cpt@testopt\xwm@colorbox{}} +\robust@def\xwm@colorbox[#1]#2{% + \ltxkeys@launchkeys[XWM]{colorbox}{#1}% + \xwm@pushboxframe + \fboxsep\xwmcbx@framesep\fboxrule\xwmcbx@framerule\relax + \removelastskip\noindent + \fcolorbox{\xwmcbx@outerframecolor}{\xwmcbx@fillcolor}{% + \cptexpandsecond\xwmminipage{[textalign=\xwmcbx@textalign, + framesep=\xwmcbx@framesep,framerule=\xwmcbx@framerule, + framecolor=\xwmcbx@innerframecolor,width=\xwmcbx@width, + height=\xwmcbx@height,depth=\xwmcbx@depth, + textcolor=\xwmcbx@textcolor,framebox=true]}{#2}% + }% + \xwm@popboxframe + \removelastskip + \normalcolor +} +\ltxkeys@definekeys*[XWM]{makecolorbox}[xwmmbx@]{% + width=\textwidth; + height=\z@pt; + depth=\z@pt; + framebox=true; + textcolor=black; + fillcolor=white; + outerframecolor=black; + outer-frame-color=black/\setaliaskey{outerframecolor}; + innerframecolor=black; + inner-frame-color=black/\setaliaskey{innerframecolor}; + framesep=3\p@; + framerule=0.4\p@; + textalign=center/\xwm@settextalign\xwmmbx@textalign; + align=center/\setaliaskey{textalign}; + text-align=center/\setaliaskey{textalign}; + boxalign=center/\xwm@settextalign\xwmmbx@boxalign; +} +\robust@def*\makecolorbox{\cpt@testopt\xwm@makecolorbox{}} +\robust@def*\xwm@makecolorbox[#1]#2{% + \ltxkeys@launchkeys[XWM]{makecolorbox}{#1}% + \begin{\xwmmbx@boxalign}% + \makebox[\z@pt][c]{% + \xwmstrut\xwmmbx@height\z@pt + \xwm@pushboxframe + \fboxsep\xwmmbx@framesep\fboxrule\xwmmbx@framerule\relax + \fcolorbox{\xwmmbx@outerframecolor}{\xwmmbx@fillcolor}{% + \cptexpandsecond\xwmminipage{[textalign=\xwmmbx@textalign, + framesep=\xwmmbx@framesep,framerule=\xwmmbx@framerule, + framecolor=\xwmmbx@innerframecolor,width=\xwmmbx@width, + height=\xwmmbx@height,depth=\xwmmbx@depth, + textcolor=\xwmmbx@textcolor,framebox= + \thebool@normal{xwmmbx@framebox}]}{#2}% + }% + \xwm@popboxframe + \xwmstrut\z@pt\xwmmbx@depth + }% + \end{\xwmmbx@boxalign}% + \removelastskip + \normalcolor +} +\ltxkeys@definekeys*[XWM]{shade}[xwmshd@]{% + width=\hsize; + leftadjust=\z@pt; + indent=\z@pt; + fillcolor=gray!75; + framecolor=black; + framesep=3\p@; + framerule=0.4\p@; + height=\z@pt; + depth=\z@pt; + textalign=justified/\xwm@settextalign\xwmshd@textalign; + textcolor=black +} +\robust@def*\xwm@frameshade{% + \def\FrameCommand{% + \clubpenalty\@m\widowpenalty\@m + \noindent\kern\xwmshd@leftadjust + \fboxrule\xwmshd@framerule\fboxsep\xwmshd@framesep\relax + \fcolorbox{\xwmshd@framecolor}{\xwmshd@fillcolor}% + }% + \parindent\z@pt\finalhyphendemerits\z@pt + \cptdimdef\xwm@tempa{\xwmshd@width-(\xwmshd@framesep + +\xwmshd@framerule+\xwmshd@indent)}% + \color{\xwmshd@textcolor}% + \MakeFramed{% + \hsize\xwm@tempa\FrameRestore\@setminipage + }% + \xwmstrut\xwmshd@height\z@pt + \begin\xwmshd@textalign +} +\robust@def*\xwmshade{\cpt@testopt\xwm@shade{}} +\robust@def*\xwm@shade[#1]{% + \ltxkeys@launchkeys[XWM]{shade}{#1}% + \xwm@frameshade +} +\robust@def*\endxwmshade{% + \end\xwmshd@textalign + \xwmstrut\z@pt\xwmshd@depth + \par\unskip\endMakeFramed\@ignoretrue +} +\ltxkeys@definekeys*[XWM]{fadingtext}[fad@]{% + textcolor=white; + boxcolor=black; + scale=1; + letterwidth=5mm; + barcolor=yellow; + height=\z@pt; + depth=\z@pt +} +\newcommand*\xwmfadingtext[2][]{% + \ltxkeys@launchkeys[XWM]{fadingtext}{#1}% + \begingroup + \@tempcnta\z@pt + \def\siso@do##1{% + \advance\@tempcnta\@ne + \csn@xdef{fade@\romannumeral\@tempcnta}{\cpttrimspace{##1}}% + }% + \siso@@loop{#2}% + \def\colbox##1{% + \color{.!80}% + \colorbox{.}{{% + \color{\fad@textcolor!\the\numexpr100-\@tempcnta/\icol*10\relax}% + \ifnum\icol=\@ne + \kern\dimexpr\fad@letterwidth/50\relax + \fi + \makebox[\fad@letterwidth]{##1}% + \ifnum\icol<\@tempcnta + \scalebox\fad@scale{\textcolor{\fad@barcolor}{$|$}}% + \else + \scalebox\fad@scale{\phantom{$|$}}% + \kern\dimexpr-\fad@letterwidth/10\relax + \fi + }}% + }% + \color{\fad@boxcolor}% + \chardef\icol\z@pt + \cptdotimes\@tempcnta{% + \cptpushnumber\icol + \colbox{\scalebox\fad@scale + {\xwmstrut\fad@height\fad@depth + \usename{fade@\romannumeral\icol}}}% + }% + \endgroup +} +\cptonlypreamble{% + \dummypagenos,\fancypagenos, + \FancyPageNumbers,\NoFancyPageNumbers +} +\newcommand*\dummypagenos[1][]{} +\newcommand*\fancypagenos[1][]{% + \ifblankTF{#1}{}{\AtBeginDocument{\xwm@fancypagenos{#1}}}% +} +\robust@def*\NoFancyPageNumbers{% + \AfterStartOfDocument{\global\pgn@showpagenosfalse}% +} +\robust@def*\FancyPageNumbers{% + \AfterStartOfDocument{\global\pgn@showpagenostrue}% +} +\robust@def*\xwm@fancypagenos#1{% + \ltxkeys@launchkeys[XWM]{fancypagenos}{#1}% + \xwm@getposition\pgn@textxpos\pgn@textypos\pgn@coordunit + \ifnumcmpFT\c@page=\@ne{}{% + \AfterStartOfDocument{\thispagestyle{\xwm@frontpagestyle}}% + }% + \pagestyle{fancyplain}% + \fancyhf{}% + \cfoot{\pgn@cfoot}\rfoot{\pgn@rfoot}% + \lfoot{\pgn@lfoot}\chead{\pgn@chead}% + \rhead{\pgn@rhead}\lhead{\pgn@lhead}% + \ifpgn@showheadrule + \def\headrule{{% + \color{\pgn@headrulecolor}% + \hrule\@height\pgn@headruleheight\@depth\pgn@headruledepth + \@width\headwidth\vspace{\pgn@headrulesep}% + \hrule\@height\pgn@headruleheight\@depth\pgn@headruledepth + \@width\headwidth\vspace{-\pgn@headrulesep}% + }}% + \else + \let\headrule\relax + \fi + \ifpgn@showfootrule + \def\footrule{{% + \color{\pgn@footrulecolor}% + \hrule\@height\pgn@footruleheight\@depth\pgn@footruledepth + \@width\headwidth\vspace{\pgn@footrulesep}% + \hrule\@height\pgn@footruleheight\@depth\pgn@footruledepth + \@width\headwidth\vspace{\pgn@footrulesep}% + }}% + \else + \let\footrule\relax + \fi + \xwm@gethfoffset\pgn@hfoffsetleft\pgn@hfoffsetright + \fancyhfoffset[R,L]\xwm@hfoffset + \AtBeginShipout{% + \ifdefboolTF{pgn@sendtoback}{% + \AtBeginShipoutUpperLeft{% + \xwm@f@ncyp@genos + }% + }{% + \AtBeginShipoutUpperLeftForeground{% + \xwm@f@ncyp@genos + }% + }% + }% +} +\cptnewswitch{xwm@fancy} +\robust@def*\xwm@f@ncypagenos{% + \def\pgn@textmark{% + \begingroup + \fboxrule\pgn@framerule\fboxsep\pgn@framesep\relax + \pgn@format{\normalfont\pgn@style}% + \endgroup + }% + \cptswitchtrue{xwm@fancy}% + \xwm@textbox{pgn}% + \cptswitchfalse{xwm@fancy}% +} +\robust@def*\xwm@f@ncyp@genos{% + \ifboolFT{pgn@showpagenos}{}{% + \ifnumcmpTF\c@page=\@ne{% + \ifdefboolTF{pgn@showonpageone}\xwm@f@ncypagenos\relax + }{% + \xwm@f@ncypagenos + }% + }% +} +\robust@def*\xwm@gethfoffset#1#2{% + \begingroup + \def\temp@err{% + \xwm@err{Only digits (without units) are allowed\MsgBrk + in the values of 'hfoffsetleft' and 'hfoffsetright'}\@ehd + }% + \xifblankTF{#1}{}{% + \xxwmifitemsinTF\xwm@allowedcoordunits{#1}\temp@err{}% + }% + \xifblankTF{#2}{}{% + \xxwmifitemsinTF\xwm@allowedcoordunits{#2}\temp@err{}% + }% + \def\xwm@tempc##1##2{% + \xifblankTF{##1}{\def##2{1}}{\def##2{##1}}% + \ifdim##2\p@>\p@\def##2{1}\fi + }% + \xwm@tempc{#1}\xwm@tempa\xwm@tempc{#2}\xwm@tempb + \def\xwm@tempc##1{% + \xifinsetFT{.}{##1}{}{% + \def\xwm@tempd####1.####2\xwm@nil{\def##1{.####2}}% + \cptexpandsecond\xwm@tempd{##1}\xwm@nil + }% + }% + \xwm@tempc\xwm@tempa\xwm@tempc\xwm@tempb + \cptpassexpanded{% + \endgroup\def\noexpand\xwm@hfoffset{% + \the\dimexpr\xwm@tempa\marginparsep+% + \xwm@tempb\marginparwidth\relax + }% + }% +} +\robust@redef*\Gin@ii[#1]#2{% + \ifstrcmpTF{[}{#2}{% + \Gin@iii[#1][% + }{% + \begingroup + \@tempswafalse + \toks@{\Ginclude@graphics{#2}}% + \ltxkeys@setkeys{Gin}{#1}% + \Gin@esetsize + \the\toks@ + \endgroup + }% +} +\robust@redef*\Grot@box@kv[#1]#2#3{% + \@begin@tempboxa\hbox{#3}% + \Grot@x\dimexpr\width/2\relax + \Grot@y\dimexpr(\height-\depth)/2\relax + \ltxkeys@setkeys{Grot}{#1}% + \setbox\z@pt\box\@tempboxa + \Grot@setangle{#2}% + \Grot@box + \@end@tempboxa +} + +\endinput + +%%% End of file xwatermark.sty %%% |