我仍然在努力扩展 Latex。我尝试从日期格式计算一个实数并将其放入宏中\value
。我需要扩展命令,\edef
因为我计划在中使用该值作为参数pgfplots
。
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{pgfcalendar}
\newcount\mycount
\begin{document}
\newcommand{\dateconvert}[1]{%
\pgfcalendardatetojulian{#1}{\mycount}
\pgfcalendarjuliantodate{\mycount}{\myyear}{\mymonth}{\myday}
\pgfmathparse{(\myday-1)/365+(\mymonth-1)/12+\myyear}\let\mydate\pgfmathresult
\mydate
}
\dateconvert{2010-07-01} %works
\edef\value\dateconvert{2010-07-01}
\value %does not work: Use of \value doesn't match its definition
\end{document}
直接调用\dateconvert
有效。但是,当我尝试将结果复制到时\value
,它失败了。
答案1
这个程序适合您吗?
\documentclass[10pt]{article}
\usepackage{pgfmath}
\usepackage{pgfcalendar}
\newcount\mydatecount
\def\settodate#1#2{%
\pgfcalendardatetojulian{#2}{\mydatecount}
\pgfcalendarjuliantodate{\mydatecount}{\myyear}{\mymonth}{\myday}%
\pgfmathsetmacro{#1}{(\myday-1)/365+(\mymonth-1)/12+\myyear}%
}
\begin{document}
\settodate\x{2010-07-01}
\settodate\y{2010-03-01}
\x{} and \y{}
\end{document}
结果
2010.5 和 2010.16666
答案2
你得到的错误是由于
\edef\value\dateconvert{2010-07-01}
定义\value
为一个宏,该宏必须紧跟在文本后面\dateconvert
,并由文本替换2012-07-01
。如评论中所述,您需要
\edef\value{\dateconvert{2010-07-01}}
\value
以您想要的方式设置,但这要求\dateconvert
可扩展。由于它执行的是赋值,所以情况并非如此(实际上 pgfmath
根本不可扩展)。
一种相对简单的方法是
\documentclass[10pt]{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand { \dateconvert } { m }
{ \dateconvert:n {#1} }
\cs_new:Npn \dateconvert:n #1
{ \__dateconvert:w #1 \q_stop }
\cs_new:Npn \__dateconvert:w #1 - #2 - #3 \q_stop
{ \fp_eval:n { #1 + ( #2 - 1 ) / 12 + ( #3 - 1 ) / 365 } }
\ExplSyntaxOff
\newcount\mycount
\begin{document}
\dateconvert{2010-07-01} %works
\edef\myvalue{\dateconvert{2010-07-01}}
\myvalue
\end{document}
它使用可扩展的 LaTeX3 FPU 和简单的日期解析设置来工作:从问题来看,目前尚不清楚它需要多强健。我已将\value
其重命名\myvalue
为\value
LaTeX 内核命令,您真的不应该使用此名称。