我正在尝试使用该pdfcalendar
库,但我认为我对其定义感到困惑。
我的问题:我可以将哪种类型的 LaTeX 计数器/宏/变量与pgfcalendar
函数一起使用?我必须学习 TeX 语法吗?如果是这样,那么当这些 TeX 计数器与需要 LaTeX 样式变量的 LaTeX 命令交互时,是否会出现问题?
背景 TikZ 手册指定了此功能:
\pgfcalendardatetojulian{<date>}{<counter>}
后来,手册警告第二个参数must be a TeX counter
,有这个函数:
\pgfcalendarjuliantoweekday{<Julian day>}{<week day counter>}
我如何定义<counter>
和<week day counter>
?
我可以使用\newcounter{mycount}
或\newcommand{\mycount}
吗?
我尝试了我能想到的所有组合,但只取得部分成功。
一些谷歌搜索让我发现了TeX
和LateX
计数器之间的差异,但结论是,除了句法差异外,两者都是可以接受的。但似乎TikZ/pgfcalendar
缺少一些非常具体的东西。
梅威瑟:
\documentclass{article}
\usepackage{tikz,pgfcalendar}
\begin{document}
\newcommand{\myisodate}{2018-06-02}
\newcommand{\myjuliandatecommand}{}
\newcounter{myjuliandatecounter}
\newcounter{myweekdaycounter}
\newcommand{\myweekdaycommand}{}
\pgfcalendardatetojulian{\myisodate}{\myjuliandatecommand} %works, but prints the value, something I want to avoid.
% \pgfcalendardatetojulian{\myisodate}{myjuliandatecounter} %doesn't parse correctly
% \pgfcalendarjuliantoweekday{\myjuliandatecommand}{myweekdaycounter} %doesn't work
% \pgfcalendarjuliantoweekday{\myjuliandatecommand}{\myweekdaycommand} %doesn't work
\end{document}
答案1
作为符号 1在他们的评论中指出,PGF 被设计为可与 TeX 一起使用,因此所有内容都是为 TeX(计数)设计的,因此 LaTeX(计数器)也是技术上不支持。
你必须使用
\pgfcalendardatetojulian{\myisodate}{\c@myjuliandatecounter}
\themyjuliandatecounter
但这需要@
成为一封信(这本身并不坏,取决于您的使用情况)。
如果你不想使用,\c@…
你可以使用\csname c@…\endcsname
,但这会导致扩展问题,对于顶级 LaTeX 版本也是如此
\pgfcalendardatetojulian{\myisodate}{\value{myjuliandatecounter}}
失败的原因\myjuliandatecommand
是因为 PGFcalendar 在某个时候
\myjuliandatecommand 2458272\relax
而这什么都没有(从字面上看,\myjuliandatecommand
是空的),数字本身只是被排版了。
更糟糕的是,\myweekdaycommand
因为\pgfcalendarjuliantoweekday
你可以做一些像
\def\setcounterJulian#1\relax{%
\setcounter{myjuliandatecounter}{#1}}
%
\pgfcalendardatetojulian{\myisodate}{\setcounterJulian}
\themyjuliandatecounter
但同样的伎俩对 不起作用\pgfcalendarjuliantoweekday
。
最简单的解决方案是直接使用 TeX 计数,您甚至可以重复使用它\pgfcalendarjuliantoweekday
:
\documentclass{article}
\usepackage{pgfcalendar}
\newcommand*\myisodate{2018-06-02}
\newcount\PGFcalendarCount
\begin{document}
\pgfcalendardatetojulian{\myisodate}{\PGFcalendarCount}
Julian date: \the\PGFcalendarCount
\pgfcalendarjuliantoweekday{\PGFcalendarCount}{\PGFcalendarCount}
Weekday number: \the\PGFcalendarCount
\end{document}
答案2
如果您想将值存储在 LaTeX 计数器中,请定义您自己的包装器:
\makeatletter
\newcommand{\latexpgfcalendardatetojulian}[2]{%
\pgfcalendardatetojulian{#1}{\count@}%
\setcounter{#2}{\count@}%
}
\makeatother
利用临时 TeX 计数器\count@
。如果你想完全安全,你可以添加一个组
\makeatletter
\newcommand{\latexpgfcalendardatetojulian}[2]{%
\begingroup
\pgfcalendardatetojulian{#1}{\count@}%
\setcounter{#2}{\count@}%
\endgroup
}
\makeatother
因为\setcounter
它在全球范围内起作用。
让我们做个实验,同时定义另一个包装器。
\documentclass{article}
\usepackage{tikz,pgfcalendar}
\makeatletter
\newcommand{\latexpgfcalendardatetojulian}[2]{%
\begingroup
\pgfcalendardatetojulian{#1}{\count@}%
\setcounter{#2}{\count@}%
\endgroup
}
\newcommand{\latexpgfcalendarjuliantoweekday}[2]{%
\begingroup
\pgfcalendarjuliantoweekday{#1}{\count@}%
\setcounter{#2}{\count@}%
\endgroup
}
\makeatother
\newcounter{myjuliancounter}
\newcounter{myweekdaycounter}
\begin{document}
\newcommand{\myisodate}{2018-06-02}
\latexpgfcalendardatetojulian{\myisodate}{myjuliancounter}
The stored value is \themyjuliancounter
\latexpgfcalendarjuliantoweekday{\value{myjuliancounter}}{myweekdaycounter}
The stored value is \themyweekdaycounter
\end{document}
2022-07-25(星期一)我们得到