在下面的代码中,我想通过宏进行排版\pageband
- 页面中间有一个红色带。
- 三个文本位于乐队的左侧/中间/右侧。这些文本的格式由选项 style 控制
text format
。
Q1:虽然我定义了键text format
并在文档主体中调用它(第一次尝试),但我在的定义中根本没有明确使用它\pageband
。为什么它会生效(文本颜色为黄色,尺寸为巨大的bfseries)?
Q2:我第一次尝试和第二次尝试代码的区别在于rotate=90
在 中添加了一个额外的选项text format
。这会导致错误。为什么?如何解决?
代码:
\documentclass{article}
\usepackage{geometry,tikz}
%
\pgfkeys{pageband/.cd,
pos/.initial,
width/.initial,
height/.initial,
color/.initial,
/tikz/text format/.style={#1},
}
%
\newcommand\ppb[1]{\pgfkeysvalueof{/pageband/#1}}
%
\newcommand\pageband[1]{
\pgfkeys{pageband/.cd,/pageband/.search also={/tikz},#1}
\begin{tikzpicture}[overlay,remember picture]
% step 1: draw band
\node at([xshift=\ppb{pos}]current page.center)
[color=\ppb{color}]
{\rule{\ppb{width}}{\ppb{height}}};
% step 2: typeset text in the above band
\path ([xshift=-0.5\paperwidth]current page.center)--([xshift=0.5\paperwidth]current page.center)
node[at start,anchor=west]{SSS}
node[midway]{MMM}
node[at end,anchor=east]{EEE};
\end{tikzpicture}
}
\begin{document}
First try:\par % This does work
\pageband{pos=0pt,text format={color=yellow,font=\Huge\bfseries},color=red,width=\paperwidth,height=0.5in}
Second try:\par %fail and cause error
\pageband{pos=0pt,text format={color=yellow,font=\Huge\bfseries,rotate=90},color=red,width=\paperwidth,height=0.5in}
\end{document}
答案1
Q1:虽然我定义了关键的文本格式并在文档主体中调用它(第一次尝试),但我在定义中根本没有明确使用它
\pageband
。为什么它会生效(文本颜色为黄色,大小为巨大的 bfseries)?
它确实有效,因为到最后它就是
\def\tikz@textfont{\bfseries}
此宏不会在开始时重置tikzpicture
,并且会一直保留到范围/组结束。
Q2:我第一次尝试和第二次尝试代码的区别在于
rotate=90
在 中添加了一个额外的选项text format
。这会导致错误。为什么?如何解决?
rotate
另一方面,关键是
\tikz@addtransform{\pgftransformrotate{90}}
而\tikz@addtransform
第一个动作是比较放松\tikz@transform
。然而,\tikz@transform
不是直到不久之后才初始化\begin{tikzpicture}
。
这与您的密钥设置完全无关,它已经发生在普通的 pdfTeX 中:
% arara: pdftex
\input tikz.tex
\tikzset{rotate=45}
\bye
当然,这与定义有关\pageband
。 的用法\pgfkeys
不应在 之前tikzpicture
。
我建议也提供一个/pageband/tikz/.code=\tikzset{#1}
密钥,这样用户在使用/tikz
密钥时就必须把所有东西都放在那里。这样,pageband/color
和之间就不会发生冲突/tikz/color
。
也就是说,节点不会因为范围变大而旋转。除非使用,rotate = 90
否则节点不会发生变换。transform shape
答案2
我建议使用适合库来表示频带,并使用第二个参数来表示旋转角度。
\documentclass{article}
%https://tex.stackexchange.com/questions/651749/how-to-transfer-options-to-tikz
\usepackage{geometry,tikz}
\usetikzlibrary {fit}
%
\pgfkeys{pageband/.cd,
pos/.initial,
width/.initial,
height/.initial,
color/.initial,
/tikz/text format/.style={#1},
}
% % %
\newcommand\ppb[1]{\pgfkeysvalueof{/pageband/#1}}
% % %
\newcommand\pageband[2]{\pgfkeys{pageband/.cd,/pageband/.search also={/tikz},#1}
\begin{tikzpicture}[overlay,remember picture,
every node/.style={rotate=#2}]
\node (a) at([xshift=-\ppb{pos}]current page.center) {};
\node (b) at([xshift=\ppb{pos}]current page.center) {};
\node[fill=\ppb{color},fit=(a) (b),minimum height=\ppb{height},minimum width=\ppb{width}] (fit) {};
\node[right] at (fit.west) {West};
\node at (fit.center) {Center};
\node[left] at (fit.east) {East};
\end{tikzpicture}
}
\begin{document}
First try:\par % This does work
\pageband{pos=0pt,text format={color=yellow,font=\Huge\bfseries},color=red,width=\paperwidth,height=0.5in}{0}
Second try:\par %
\pageband{pos=0pt,text format={color=yellow,font=\Huge\bfseries},color=red,width=\paperwidth,height=0.5in}{90}
\end{document}