计数器、newcount 和 pgfcalendar、宏

计数器、newcount 和 pgfcalendar、宏

我正在尝试使用该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}吗?

我尝试了我能想到的所有组合,但只取得部分成功。

一些谷歌搜索让我发现了TeXLateX计数器之间的差异,但结论是,除了句法差异外,两者都是可以接受的。但似乎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(星期一)我们得到

在此处输入图片描述

相关内容