我正在尝试使用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
任何设施。