% \iffalse meta-comment % !TEX program = XeLaTeX %<*internal> \iffalse % %<*internal> \fi \begingroup \def\temp{LaTeX2e} \expandafter\endgroup\ifx\temp\fmtname\else \csname fi\endcsname % %<*install> \input ctxdocstrip % \let\MetaPrefix\relax \declarepostamble\emptypostamble \endpostamble \def\MetaPrefix{-- } \let\MetaPrefix\DoubleperCent \generate { % %<*internal> \usedir{source/xelatex/magicwatermark} \file{magicwatermark.ins} {\from{\jobname.dtx}{install}} % %<*install> \usedir{xetex/xelatex/magicwatermark} \file{magicwatermark.sty} {\from{\jobname.dtx}{package}} \nopreamble\nopostamble \usedir{doc/xelatex/magicwatermark} \file{README.md} {\from{\jobname.dtx}{readme}} } \endbatchfile % %<*internal> \fi % %\NeedsTeXFormat{LaTeX2e}[2020/10/01] %\ProvidesPackage{magicwatermark}[2021/12/22 v1.0.1 watermark for ljguo ] %<*driver> \documentclass{ctxdoc} \usepackage{graphicx} \usepackage{enumitem} \usepackage{listings} \lstset{ frame=tb,framerule=2pt,language={[LaTeX]TeX},basicstyle={\ttfamily}, language={[LaTeX]TeX}, keywordstyle=\color{red!70!black}\bfseries, keywordstyle={[2]\color{blue!70!black}\bfseries}, morekeywords={PageSetup,Watermark,NewWatermark,MyPageSetup,MyWatermark,EvenPageSetup,OddPageSetup,EvenWatermark,OddWatermark,ClearWatermark}} \usepackage{fontspec} \IfFontExistsTF{calibri.ttf} { \setmainfont{calibri.ttf}[ BoldFont = calibrib.ttf, ItalicFont = calibrii.ttf, BoldItalicFont = calibriz.ttf ] } {} \setCJKmainfont[AutoFakeBold,AutoFakeSlant]{simfang.ttf} \usepackage{magicwatermark} \renewcommand*\marg[1]{\{\meta{#1}\}} \renewcommand*\oarg[1]{[\meta{#1}]} \renewcommand*\parg[1]{(\meta{#1})} \begin{document} % \DisableImplementation \EnableImplementation \DocInput{\jobname.dtx} \IndexLayout \PrintChanges \PrintIndex \end{document} % % \fi % % \GetFileId{magicwatermark.sty} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % %\title{\pkg{magicwatermark}: 魔法水印宏包} %\author{郭李军 \\ liguo1020@gmail.com} %\def\version{v1.0.1} %\date{\today\quad\version} %\pagestyle{empty} %\PageSetup* %{ % \begin{tikzpicture}[remember picture,overlay] % \node[cyan,scale = 2,shift={(-1,-1)}] at (current page.north east){--~\thepage~--}; % \end{tikzpicture} %} %\Watermark %\maketitle %\thispagestyle{empty} %\tableofcontents %\begin{documentation} %\changes{v1.0.1}{2021/12/21}{实现了一些基本功能} %\begin{abstract} %\pkg{magicwatermark} 是一个基于 \pkg{everypage} 和 \pkg{tikz} 宏包,并经过 \LaTeX3 \ 进行封装的宏包,它可以很灵活的设置和清除水印,所有水印内容都放在 \verb|tikz| 的一个 \verb|node| 里面,并处于页面中心。 %\end{abstract} %\section{介绍} %目前 \pkg{magicwatermark} 宏包只能实现如下功能 %\begin{itemize} % \item 设置所有页面的水印 % \item 设置奇数页的水印 % \item 设置偶数页的水印 % \item 新建水印,同页面设置多个水印 % \item 清除水印 %\end{itemize} %\section{用户接口} %\subsection{提供命令} % \begin{function}[added=2021-12-21,updated=2021-12-21]{\PageSetup} % \begin{syntax} % \tn{PageSetup} \oarg{水印参数} \marg{水印内容} % \end{syntax} % 此命令用于设置所有页面的水印内容,接受两个参数,第一个参数用于设置一些属性,以 \verb|key=value| 的形式给出, 第二个参数用于设置水印内容,可以是文字、图片、等. % \end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\Watermark} %\begin{syntax} % \tn{Watermark} %\end{syntax} % 该命令用于显示上面设置的水印 %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\EvenPageSetup} %\begin{syntax} % \tn{EvenPageSetup}\oarg{水印参数}\marg{水印内容} %\end{syntax} % 该命令用于设置偶数页的水印内容 %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\EvenWatermark} %\begin{syntax} % \tn{EvenWatermark} %\end{syntax} % 该命令用于显示上面设置的偶数页水印 %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\OddPageSetup} %\begin{syntax} % \tn{OddPageSetup}\oarg{水印参数}\marg{水印内容} %\end{syntax} % 该命令用于设置奇数页的水印内容 %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\OddWatermark} %\begin{syntax} % \tn{OddWatermark} %\end{syntax} % 该命令用于显示上面设置的奇数页水印 %\end{function} %\subsection{扩展命令} %以下带星号命令用法和上面的类似,与其说是扩展,不如说是取消了限制,以上的命令都将水印内容写在一个\verb|node|中,对于对 TikZ 不太熟练的用户来说,前者更加方 %便快捷,而后者则更加灵活 %\begin{function}[added=2022-01-07,updated=2022-01-07]{\PageSetup*} %\begin{syntax} % \tn{PageSetup*}\marg{水印内容} %\end{syntax} %\end{function} %\begin{function}[added=2022-01-07,updated=2022-01-07]{\EvenPageSetup*} %\begin{syntax} % \tn{EvenPageSetup*}\marg{水印内容} %\end{syntax} %\end{function} %\begin{function}[added=2022-01-07,updated=2022-01-07]{\OddPageSetup*} %\begin{syntax} % \tn{OddPageSetup*}\marg{水印内容} %\end{syntax} %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\NewWatermark} %\begin{syntax} % \tn{NewWatermark}\marg{水印名称} %\end{syntax} %该命令用于新建一个水印,注意水印名称不能是 \verb|main|, \verb|even|, \verb|odd|. %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\MyPageSetup} %\begin{syntax} % \tn{MyPageSetup}\oarg{水印参数}\marg{水印名称}\marg{水印内容} %\end{syntax} %用于设置新建的水印内容 %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\MyWatermark} %\begin{syntax} % \tn{MyWatermark}\marg{水印名称} %\end{syntax} % 该命令用于显示上面设置的水印 %\end{function} %\begin{function}[added=2021-12-21,updated=2021-12-21]{\ClearWatermark} %\begin{syntax} % \tn{ClearWatermark}\marg{水印列表} %该命令用于清除设置的水印,接受一个逗号列表作为参数,例如: %\begin{itemize} % \item \verb|\ClearWatermark{main}| 清除由 \verb|\Watermark| 设置的水印 % \item \verb|\ClearWatermark{even,odd}| 清除奇数和偶数页的水印 % \item \verb|\ClearWatermark{all}| 清除所有的水印 % \item \verb|\ClearWatermark{name1,name2,name3,...}| %\end{itemize} %\end{syntax} %\end{function} %\subsection{参数列表} %以上设置命令中的\textbf{水印参数}如下 %\begin{itemize} % \item \verb|scale = | 用于设置缩放比例 % \item \verb|opacity = | 用于设置不透明度 % \item \verb|shift = {(x,y)}| 用于按向量 (x,y) 平移 % \item \verb|color = | 用于设置文本颜色 % \item \verb|rotate = | 用于设置旋转角度 % \item \verb+align = + 用于设置多行文本对齐方式,默认为 center % \item \verb+showframe = + 用于设置是否显示文本框,默认为 false %\end{itemize} %\subsection{一些说明} %所有的显示命令和清除命令都仅对该命令后面的文本生效。 %\section{Examples} %\subsection{不带星号} %\begin{lstlisting} \documentclass{ctexart} \usepackage{magicwatermark} \PageSetup[ rotate = 30, % 设置旋转角度 color = red!80, % 设置水印内容颜色 scale = 6 % 设置比例 ]{ 水印内容 } \Watermark % 全文生效 \begin{document} ... \end{document} \end{lstlisting} %\subsection{奇偶页} %\begin{lstlisting} \documentclass{ctexart} \usepackage{magicwatermark} \EvenPageSetup[color=cyan,showframe,scale=4]{偶数页} % 设置奇数页 \OddPageSetup[color=purple,showframe,scale=4]{奇数页} % 设置偶数页 \EvenWatermark % 显示水印 \OddWatermark \begin{document} ... \end{document} \end{lstlisting} %\subsection{带星号} %\begin{lstlisting} \documentclass{ctexart} \usepackage{magicwatermark} \PageSetup*{ \begin{tikzpicture}[remember picture,overlay] \node[cyan,scale = 2,shift={(-1,-1)}] at (current page.north east){--~\thepage~--}; \end{tikzpicture} } \begin{document} ... \Watermark % 该命令之前不生效 \end{document} \end{lstlisting} %\subsection{新建水印} %\begin{lstlisting} \documentclass{ctexart} \usepackage{magicwatermark} \NewWatermark{one} % 新建两个水印 \NewWatermark{two} \MyPageSetup[scale=5,color=blue]{one}{水印内容一} % 设置水印 \MyPageSetup[scale=5,color=red]{two}{水印内容二} \begin{document} \MyWatermark{one} % 使用第一个水印 ... \newpage \ClearWatermark{one} % 清除第一个水印 \MyWatermark{two} % 使用第二个水印 ... \end{document} \end{lstlisting} %\end{documentation} % % \StopEventually{} % \section{代码实现} % \begin{macrocode} %<*package> % \end{macrocode} % 加载必要的宏包 % \begin{macrocode} \RequirePackage{everypage-1x,tikz,xparse,expl3} % \end{macrocode} % 打开\LaTeX3 编程环境 % \begin{macrocode} \ExplSyntaxOn % \end{macrocode} % 声明一些变量 % \begin{macrocode} \tl_new:N \l_mainpage_tl \tl_new:N \l_evenpage_tl \tl_new:N \l_oddpage_tl \tl_new:N \g_case_tl \tl_new:N \g_clear_all_tl % \end{macrocode} % 定义警告 % \begin{macrocode} \msg_new:nnn{clear}{not~have}{I~can~not~find~the~"\clear"~watermark~!} % \end{macrocode} % \begin{macro}{\PageSetup} % 对所有页面设置水印 % \begin{macrocode} \NewDocumentCommand{\PageSetup}{sO{}+m} { \IfBooleanTF{#1} { \tl_set:Nn \l_mainpage_tl{#3} } { \tl_set:Nn \l_mainpage_tl { \group_begin: \keys_set:nn{watermark}{#2} \begin{tikzpicture}[remember~picture,overlay] \node [ scale = \fp_use:N\l_scale_fp, opacity = \fp_use:N\l_opacity_fp, shift = \tl_use:N\l_shift_tl, color = \tl_use:N \l_color_tl, rotate = \fp_use:N \l_rotate_fp, align = \tl_use:N \l_align_tl, \bool_if:NTF \l_showframe_bool{draw}{}, ] at(current~page.center){#3}; \end{tikzpicture} \group_end: } } } % \end{macrocode} % \end{macro} % \begin{macro}{\Watermark} % 用于显示由 \verb|\PageSetup| 命令设置的水印 % \begin{macrocode} \NewDocumentCommand{\Watermark}{} { \AddEverypageHook{\tl_use:N \l_mainpage_tl} } % \end{macrocode} % \end{macro} % \begin{macro}{\EvenPageSetup} % 对偶数页设置水印 % \begin{macrocode} \NewDocumentCommand{\EvenPageSetup}{sO{}+m} { \IfBooleanTF{#1} { \tl_set:Nn \l_evenpage_tl{#3} } { \tl_set:Nn \l_evenpage_tl { \group_begin: \keys_set:nn{watermark}{#2} \begin{tikzpicture}[remember~picture,overlay] \node [ scale = \fp_use:N\l_scale_fp, opacity = \fp_use:N\l_opacity_fp, shift = \tl_use:N\l_shift_tl, color = \tl_use:N \l_color_tl, rotate = \fp_use:N \l_rotate_fp, align = \tl_use:N \l_align_tl, \bool_if:NTF \l_showframe_bool{draw}{}, ] at(current~page.center){#3}; \end{tikzpicture} \group_end: } } } % \end{macrocode} % \end{macro} % \begin{macro}{\EvenWatermark} % 用于显示由 \verb|\EvenPageSetup| 命令设置的水印 % \begin{macrocode} \NewDocumentCommand{\EvenWatermark}{} { \AddEverypageHook { \int_if_even:nT{\int_use:N \value{page}} { \tl_use:N \l_evenpage_tl } } } % \end{macrocode} % \end{macro} % \begin{macro}{\OddPageSetup} % 对奇数页设置水印 % \begin{macrocode} \NewDocumentCommand{\OddPageSetup}{sO{}+m} { \IfBooleanTF{#1} { \tl_set:Nn \l_oddpage_tl{#3} } { \tl_set:Nn \l_oddpage_tl { \group_begin: \keys_set:nn{watermark}{#2} \begin{tikzpicture}[remember~picture,overlay] \node [ scale = \fp_use:N\l_scale_fp, opacity = \fp_use:N\l_opacity_fp, shift = \tl_use:N\l_shift_tl, color = \tl_use:N \l_color_tl, rotate = \fp_use:N \l_rotate_fp, align = \tl_use:N \l_align_tl, \bool_if:NTF \l_showframe_bool{draw}{}, ] at(current~page.center){#3}; \end{tikzpicture} \group_end: } } } % \end{macrocode} % \end{macro} % \begin{macro}{\OddWatermark} % 用于显示由 \verb|\OddPageSetup| 命令设置的水印 % \begin{macrocode} \NewDocumentCommand{\OddWatermark}{} { \AddEverypageHook { \int_if_odd:nT{\int_use:N \value{page}} { \tl_use:N \l_oddpage_tl } } } % \end{macrocode} % \end{macro} % \begin{macro}{\NewWatermark} % 用于新建一个水印 % \begin{macrocode} \NewDocumentCommand{\NewWatermark}{m} { \tl_new:c {l_#1_tl} \tl_put_right:Nn \g_case_tl {{#1}{\tl_clear:c {l_#1_tl}}} \tl_put_right:Nn \g_clear_all_tl {\tl_clear:c {l_#1_tl}} } % \end{macrocode} % \end{macro} % \begin{macro}{\MyPageSetup} % 用于设置新建的水印 % \begin{macrocode} \NewDocumentCommand{\MyPageSetup}{O{} m +m} { \tl_set:cn {l_#2_tl} { \group_begin: \keys_set:nn{watermark}{#1} \begin{tikzpicture}[remember~picture,overlay] \node [ scale = \fp_use:N\l_scale_fp, opacity = \fp_use:N\l_opacity_fp, shift = \tl_use:N\l_shift_tl, color = \tl_use:N \l_color_tl, rotate = \fp_use:N \l_rotate_fp, align = \tl_use:N \l_align_tl, \bool_if:NTF \l_showframe_bool{draw}{}, ] at(current~page.center){#3}; \end{tikzpicture} \group_end: } } % \end{macrocode} % \end{macro} % \begin{macro}{\MyWatermark} % 用于显示由 \verb|\MyPageSetup| 命令设置的水印 % \begin{macrocode} \NewDocumentCommand{\MyWatermark}{m} { \AddEverypageHook{\tl_use:c {l_#1_tl}} } % \end{macrocode} % \end{macro} % 定义一些可选参数, 用于对水印进行设置 % \begin{macrocode} \keys_define:nn{watermark} { scale.fp_set:N = \l_scale_fp, scale.initial:n = 1.0, scale.default:n = 1.0, opacity.fp_set:N = \l_opacity_fp, opacity.initial:n = 0.8, opacity.default:n = 0.8, shift.tl_set:N = \l_shift_tl, shift.initial:n = {(0,0)}, shift.default:n = {(0,0)}, color.tl_set:N = \l_color_tl, color.initial:n = black, color.default:n =black, rotate.fp_set:N =\l_rotate_fp, rotate.initial:n = 0.0, rotate.default:n = 0.0, align.tl_set:N = \l_align_tl, align.initial:n = center, align.default:n = center, showframe.bool_set:N = \l_showframe_bool, showframe.initial:n = false, showframe.default:n = true, } % \end{macrocode} % \begin{macro}{\g_clear_all_tl} % 用于保存待清空的所有水印 % \begin{macrocode} \tl_gset:Nn \g_clear_all_tl { \tl_clear:N \l_mainpage_tl \tl_clear:N \l_evenpage_tl \tl_clear:N \l_oddpage_tl } % \end{macrocode} % \end{macro} % \begin{macro}{\g_case_tl} % 用于保存一些开关 % \begin{macrocode} \tl_gset:Nn \g_case_tl{ {all} { \tl_use:N\g_clear_all_tl } {even} { \tl_clear:N \l_evenpage_tl } {odd} { \tl_clear:N \l_oddpage_tl } {main} { \tl_clear:N \l_mainpage_tl } } % \end{macrocode} % \end{macro} % \begin{macro}{\ClearWatermark} % 用于清除设置的水印 % \begin{macrocode} \NewDocumentCommand{\ClearWatermark}{m} { \clist_gset:Nn \g_clear_clist{#1} \clist_map_variable:NNn \g_clear_clist \clear { \exp_args:NV \str_case:nVF \clear \g_case_tl {\msg_warning:nn{clear}{not~have}} } } % \end{macrocode} % \end{macro} % 关闭\LaTeX3 编程环境 % \begin{macrocode} \ExplSyntaxOff % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \Finale % \endinput \endlinechar