如何将选项转移到/tikz

如何将选项转移到/tikz

在下面的代码中,我想通过宏进行排版\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}

在此处输入图片描述

相关内容