扩展命令并将结果放入宏: \value 的使用与其定义不匹配

扩展命令并将结果放入宏: \value 的使用与其定义不匹配

我仍然在努力扩展 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\valueLaTeX 内核命令,您真的不应该使用此名称。

相关内容