根据页面奇偶校验将选项传递给 tikz 节点

根据页面奇偶校验将选项传递给 tikz 节点

故事:我最近一直在用 Koma Script 创建文档,该文档具有中等复杂的页面布局。在序言中声明了不同的命令,设置了不同的内容层,效果很好。我首先创建了奇数页的布局(部分带有 tikz 覆盖),目前对此很满意。接下来,我想将内容迁移到偶数页。但是,似乎我被禁止\ifthispageodd{}{}在 tikz 的选项中使用 Koma Script 的命令\node[options]

远程传输: 所以我想问一下是否有人知道如何传递选项到 tikz\node[options]\draw[options]命令取决于奇偶校验当前页面。

例子:我附加了一个(非)工作示例(也包含看似混乱的解决方案,即将整个语句包含\node\ifthispageodd参数中,然后分别将相应的选项传递给它 - 最小工作示例的问题在于它们最小,所以这个选项在这里看起来还不错)。读者可能会认为它并不是真正的最小化,因为我可以删除\NewDocumentCommandxparse包并使用\newcommand,但我寻求使用前者的解决方案,因为我的布局依赖于这种创建命令的方式。

\documentclass[11pt,twoside,paper=a4]{scrartcl}

\usepackage{tikz}
\usepackage{xparse}

%\NewDocumentCommand{\testcommand}{O{}}{\ifthispageodd{\node[green]}{\node[blue]} at (0,0) {test} ;} %working, but a poor solution for large lists of options
\NewDocumentCommand{\testcommand}{O{\ifthispageodd{blue}{green}}}{\node[#1] at (0,0) {test} ;}

\begin{document}
    
    \begin{tikzpicture}
        \testcommand
    \end{tikzpicture}
    
    \clearpage
    
    \begin{tikzpicture}
        \testcommand
    \end{tikzpicture}
    
\end{document}

答案1

\Ifthispageodd这是一种用于在两组样式之间进行选择的样式。

\documentclass[11pt,twoside,paper=a4]{scrartcl}
%\url{https://tex.stackexchange.com/q/657453/86}
\usepackage{tikz}
\usepackage{xparse}

\tikzset{
  if page is odd/.code 2 args={%
    \Ifthispageodd{%
      \pgfkeysalso{#1}%
    }{%
      \pgfkeysalso{#2}%
    }%
  }
}

\begin{document}
    
\begin{tikzpicture}
\node[if page is odd={blue}{green}] {test};
\end{tikzpicture}
    
\clearpage
    
\begin{tikzpicture}
\node[if page is odd={blue}{green}] {test};
\end{tikzpicture}
    
\end{document}

答案2

您可以对要设置的每个节点选项使用一个占位符宏(例如\mycolor颜色),然后使用之前直接调用的辅助宏来设置值\node

梅威瑟:

\documentclass[11pt,twoside,paper=a4]{scrartcl}

\usepackage{tikz}
\usepackage{xparse}

\def\setnodeoptions{%
\Ifthispageodd{%
\gdef\mycolor{green}%
\gdef\myfill{orange}%
}{%
\gdef\mycolor{blue}%
\gdef\myfill{red}%
}%
}
\NewDocumentCommand{\testcommand}{O{}}{\setnodeoptions\node[\mycolor,fill=\myfill] at (0,0) {test} ;}

\begin{document}
    
    \begin{tikzpicture}
        \testcommand
    \end{tikzpicture}
    
    \clearpage
    
    \begin{tikzpicture}
        \testcommand
    \end{tikzpicture}
    
\end{document}

请注意,我已更改\ifthispageodd\Ifthispageodd遵循 KOMA-Script 的弃用警告。

如果您实际上打算将其与#1可能由多个节点选项组成的可选项结合起来,那么它会变得稍微复杂一些,在这种情况下,您可以在内部检查\testcommand是否给出了参数,如果没有,则执行\setnodeoptions\node[\option1,\option2,...],否则执行单独的\node[#1]命令。

相关内容