我正在尝试编写 TikZ 日历,但只想打印工作日。根据手册(我使用的是 v2.1):
57.1.2 检查日期
...
workday
每周一、周二、周三、周四和周五经过。weekend
周六周日都过去了。
我知道我可以传递格式选项或节点形状在之上根据这些检查确定日期...但我怎样才能完全不打印它们呢?
或者日期检查不是解决这个问题的办法?
我之所以使用week list
日历格式布局,是因为它非常方便,只需使用\calendar[dates=2012-01-01 to 2012-01-last]
,而不是我认为的可能我必须这样做才能得到我想要的结果,即传递每个月的每个周范围。这使我的代码行数增加了四倍,并且确实降低了我的文档的可重用性。
有没有更好的方法?我在手册中没有看到任何这方面的例子。
如果需要可重现的代码,我正在寻找这个,但没有打印周末:
\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{calendar,shapes.geometric}
\begin{document}
\begin{tikzpicture}
[every calendar/.style={
month label above left,
month text={\textit{\%mt}},
week list}]
\calendar[dates=2012-01-01 to 2012-01-last] ;
\end{tikzpicture}
\end{document}
答案1
您可以使用if(weekend) [<do something with this weekend>]
语法。例如,您可以将周末的颜色设置为red
:
\calendar[dates=2012-01-01 to 2012-01-last] if(weekend) [red];
或者,如果你想让它消失,则改为white
。但这仍然会打印出实际的节点文本。或者更糟糕的是,你会在彩色背景上看到白色文本。
使用参数coordinate
(的缩写shape=coordinate
),您可以将日期节点转换为坐标。坐标没有文本。
因此甚至没有隐藏的节点文本。
对于大多数简单情况来说,这很可能已经足够了,除非every node
或every day
(或if
稍后的另一个)明确设置形状。(如果涉及,label
这仍然会显示坐标。)
可以通过设置删除当天节点的整个打印day code
为空值。
当然,这些也可以通过if
附加到every calendar
样式的键来使用。
代码
\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{calendar}
\tikzset{
no day/.style={shape=coordinate},
no day'/.style={day code=}}
\begin{document}
\tikz[
every calendar/.style={
month label above left,
month text={\textit{\%mt}},
week list}]
\calendar[dates=2012-01-01 to 2012-01-last] if(weekend) [no day];
\tikz[
every calendar/.style={
month label above left,
month text={\textit{\%mt}},
week list}]
\calendar[dates=2012-01-01 to 2012-01-last] if(weekend) [no day'];
\end{document}
输出
注意:黄色框是两行选择,表示没有隐藏文本。与[white]
右侧的版本进行比较。
█