无参数的宏定义带参数的宏

无参数的宏定义带参数的宏

我正在尝试使用xparse通用的 TeX/LaTeX 命令来编写一个宏(不带参数)来定义另一个带参数的宏:

\documentclass{minimal}
\RequirePackage{xparse,fmtcount}

\newcounter{mycounter}

\NewDocumentCommand{\mycounterHex}{O{1}}{}

\providecommand{\enableCounterCommands}{
    \RenewDocumentCommand{\mycounterHex}{O{1}}{\padzeroes[#1]{\hexadecimal{mycounter}}}
}

\begin{document}
\end{document}

当我使用 编译该文档时pdflatex --interaction=nonstopmode,出现以下错误消息:

! Illegal parameter number in definition of \enableCounterCommands.
<to be read again> 
                   1
l.11 }

我认为问题在于 TeX 认为我正在尝试引用 的(不存在的)第一个参数\enableCounterCommands,但我实际上正在尝试引用 的可选默认值第一个参数\mycounterHex我如何向 TeX 表明我正在引用的参数\mycounterHex

答案1

您想要的##1替换文本。

另一方面,我不明白为什么要\mycounterHex这样定义,因为使用任何柜台。

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\paddedhex}{O{0}m}
 {% #1 = size to pad with zeros to, #2 = counter name
  \zelnick_paddedhex:nn { #1 } { #2 }
 }

\cs_new:Nn \zelnick_paddedhex:nn
 {
  \int_compare:nT { #1-\str_count:e { \int_to_Hex:n { \value{#2} } } > 0 }
   {% we want to pad
    \prg_replicate:nn { #1-\str_count:e { \int_to_Hex:n { \value{#2} } } } { 0 }
   }
  \int_to_Hex:n { \value{#2} }
 }

\ExplSyntaxOff

\newcounter{mycounter}

\begin{document}

\setcounter{mycounter}{42}

\paddedhex{mycounter}

\paddedhex[4]{mycounter}

\setcounter{mycounter}{1234567}

\paddedhex{mycounter}

\paddedhex[4]{mycounter}

\paddedhex[8]{mycounter}

\edef\temp{\paddedhex[8]{mycounter}}

\texttt{\meaning\temp}% show full expandability

\end{document}

我们首先将计数器的值转换为十六进制,计算字符数,如果它小于规定的填充大小,则添加所需数量的零。

在此处输入图片描述

完全可扩展性意味着你可以说

\renewcommand{\themycounter}{\paddedhex[4]{mycounter}}

您可以将十六进制的部分编号填充为四位数字

\renewcommand{\thesection}{\paddedhex[4]{section}}

\label并且这将与和 一起起作用\ref

您将无法使用fmtcount任何设施。

相关内容