“哦,怎么你们都在折纸?大家兴致很高哦?”
“就 TikZ 用户手册,Calendar 日历模块里的十二面体立体日历啊。”
“啊这个啊,的确好玩。”
“美中不足的是,月份总是英文,怎么试都不能换成中文。”
“啊。这个啊。可以的,只是要用 translator
宏包。”
“??可我都做好三个了!(这等事你倒勤快了!)没差,转送给外国同学好了,我再打印、重做。代码咧?”
“先加载 xeCJK
或 ctex
、设定字体,这些就不赘述了。接着加载 translator
,并给出各月份的中文名称:
\usepackage{ctex}
\usepackage{translator}
\providetranslation{January}{一月}
\providetranslation{February}{二月}
\providetranslation{March}{三月}
\providetranslation{April}{四月}
\providetranslation{May}{五月}
\providetranslation{June}{六月}
\providetranslation{July}{七月}
\providetranslation{August}{八月}
\providetranslation{September}{九月}
\providetranslation{October}{十月}
\providetranslation{November}{十一月}
\providetranslation{December}{十二月}
其实 translator
的强大,在于可以把不同语言的翻译用 \ProvideDictionary
打包成模块,配合 babel
使用,不过今天我们只要中文定制、babel
又没有中文选项,就略过了。”
“啊哈哈哈有了啊!还有什么可以玩儿的?”
“这日历上面也没写清楚哪天是周一、周二,有时会混淆,给加个标题吧。代码很长、很难记,但也很好搜索——有了:
\makeatletter%
\tikzoption{day headings}{\tikzstyle{day heading}=[#1]}
\tikzstyle{day heading}=[]
\tikzstyle{day letter headings}=[
execute before day scope={ \ifdate{day of month=1}{%
\pgfmathsetlength{\pgf@ya}{\tikz@lib@cal@yshift}%
\pgfmathsetlength\pgf@xa{\tikz@lib@cal@xshift}%
\pgftransformyshift{-\pgf@ya}
\foreach \d/\l in {0/M,1/T,2/W,3/T,4/F,5/S,6/S} {
\pgf@xa=\d\pgf@xa%
\pgftransformxshift{\pgf@xa}%
\pgftransformyshift{\pgf@ya}%
\node[every day,day heading]{\l};%
}
}{}%
}%
]
\makeatother%
放在文件 preamble, 再在代码里的 every calendar/.style
里添加 day letter headings,day headings = orange
(或其它颜色、字体选项), 就行了。”
“我知道了,日数标题要换成中文的话,
\foreach \d/\l in {0/M,1/T,2/W,3/T,4/F,5/S,6/S}
换成
\foreach \d/\l in {0/一,1/二,2/三,3/四,4/五,5/六,6/日}
就行了是吧。”
“对了,你有进步了呢,懂得仔细看代码,而不是直接瞎问一通了。”
“嘿嘿,我也是很认真学习的啊。……其实是还有个问题啦。有没有什么办法,可以在特定日期上做一个记号呢?比如假期啊,生日啊等等的。”
“可以啊,不过有一个小手续。比如说你想标记 2016 年 12 月 4 日吧。那就得在十二月的月历上,给个名字:
face 12={\calendar (dec) [dates=\the\year-12-01 to \the\year-12-last];}
然后就可以在同一个 tikzpicture
里直接针对十二月里的任何一个日期操作了:”
\begin{scope}[on background layer]
\node[shape=star,fill=orange!40!white,draw=none] at (dec-2016-12-04) {};
\end{scope}
“不错,不错!真是新年送礼佳品啊!”
祝各位春节快乐!春运路上一路顺风!
发表评论 取消回复