故事:我最近一直在用 Koma Script 创建文档,该文档具有中等复杂的页面布局。在序言中声明了不同的命令,设置了不同的内容层,效果很好。我首先创建了奇数页的布局(部分带有 tikz 覆盖),目前对此很满意。接下来,我想将内容迁移到偶数页。但是,似乎我被禁止\ifthispageodd{}{}
在 tikz 的选项中使用 Koma Script 的命令\node[options]
。
远程传输: 所以我想问一下是否有人知道如何传递选项到 tikz\node[options]
或\draw[options]
命令取决于奇偶校验当前页面。
例子:我附加了一个(非)工作示例(也包含看似混乱的解决方案,即将整个语句包含\node
在\ifthispageodd
参数中,然后分别将相应的选项传递给它 - 最小工作示例的问题在于它们最小,所以这个选项在这里看起来还不错)。读者可能会认为它并不是真正的最小化,因为我可以删除\NewDocumentCommand
和xparse
包并使用\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]
命令。